Baggage API (背包 API)
原文更新时间: 2021-02-04 翻译时间:2021-03-08
状态: 稳定, 功能冻结。
概述
Baggage
用于注解遥测数据,给指标、追踪、日志增加上下文和信息。 它是一系列描述用户定义的属性的名字/值对。 Baggage
中的每个名称必须只关联一个值。
Baggage API 由以下组成:
Baggage
- 用于
Baggage
与上下文交互的函数
这里定义的函数是指一种与拥有代表整个 Baggage 的结构体或对象进行交互的方式。取决于语言习惯,取决于语言习惯,语言 API 可能仅实现与 Context
交互的函数。
Baggage API 必须在没有安装 SDK 的情况下提供完整功能。这是为实现透明的跨进程 Baggage 传播所必须的。如果在 API 中安装了 Baggage 传播者,无论是否安装了 SDK,它都可以工作。
Baggage
的容器必须是不可变的, 这样包含的 Context
也是不可变的。
操作
获取值
Baggage API 必须提供一个函数用于要访问名称/值对中的值,该函数将上下文和名称作为参数输入,并返回一个值。返回的值与名称参数相关,如果提供的名称参数不存在,则返回空值。
必填参数:
Name
要返回对应值的名称。
获取全部值
返回 Baggage
中的名称/值对。名称/值对的顺序必须不重要。取决于语言习惯,返回的值可以是一个不可变的集合,也可以是一个指向 Baggage
中的名称/值对集合的不可变迭代器。
设置 baggage
Baggage API 必须提供一个函数用于记录名称/值中的值,该函数接受一个名称和一个值作为输入参数。返回一个带有新值 Baggage
的 上下文
。取决于语言习惯, 语言API可以使用构建者模式来从 Builder 构建出一个 Baggage
。
必填参数:
Name
设置值的名称,字符串类型。
Value
要设置的值,字符串类型。
可选参数:
Metadata
与名称/值对相关联的元数据。这应当是对一个没有具体语义的字符串的不透明包装。以便于未来的功能拓展。
删除值
为了删除名称/值对,Baggage API 必须提供一个函数,接收一个名称作为输入参数。返回一个新的上下文,该上下文不再包含所选名称。取决于语言习惯, 语言 API 可以使用构建者模式来从 Builder 构建出一个 Baggage
。
必填参数:
Name
要移除的名称。
与Context交互
此节定义所有与 Context
交互的有关 Baggage API 的操作
此 API 必须提供以下方法与 Context
实例交互。
- 从
Context
实例中提取Baggage
- 向
Context
实例插入Baggage
上面列出的函数是必要的, 因为 API 用户应该不需要访问 Baggage
API 实现相关的 Context 键
如果一种语言支持隐式传播 Context
(参考此), 那么 API 应该提供以下方法:
- 从隐式上下文中获取当前的
Baggage
, 这等价于先获取隐式的上下文, 然后从上下文中提取Baggage
。 - 设置当前的
Baggage
至隐式上下文中, 这等价于先获取隐式的上下文, 然后插入Baggage
至上下文中。
清除Context中的Baggage
为了避免向不信任的进程发送任何的名称/值对,Baggage API 必须提供一种方式从 Context 中删除所有的 Baggage 条目。
这个函数可以通过用户设置一个空的 Baggage
对象/结构体至 Context
中来实现。 或者提供一个API, 它以 Context
作为输入参数, 返回一个不包含任何相关 Baggage
的新的 Context
.
传播
Baggage
可能因为各种原因跨越进程边界或任意边界(进程,边界1, 边界2, 等等)进行传播。
API 层或扩展包必须包括以下 Propagator
(传播者)。
- 一个
TextMapPropagator
实现了 W3C Baggage Specification。
参考 Propagators Distribution 了解传播者如何被分发。
注:W3C baggage 规范目前没有给可选项的元数据赋予语义。
当提取
时,传播者应将所有元信息用一个元数据实例分配给各个条目。
当注入
时,传播者应该根据W3C规范格式附加元数据。
注:
如果传播者无法解析传过来的 baggage
,提取
函数必须返回一个没有 Baggage 条目的上下文。
如果传过来的 baggage
存在,但不存在任何条目, 提取
函数必须返回一个没有 Baggage 条目的上下文。
冲突解决
如果添加新的名称/值对时已经存在同名,则新名称/值对的必须优先。值将被新添加的值替代(不论是本地生成还是从远处对等处接受)。