上下文
状态: 稳定。
概述
Context 是一种传播机制,它将执行范围内的值跨 API 边界和逻辑上关联的 执行单元 传递。横切关注点使用相同的共享 Context 对象来访问其数据(进程内)。
Context 必须是不可变的,其写入操作必须生成一个新的 Context,其中包含原始值和指定的更新值。
语言应使用其唯一且广泛使用的 Context 实现(如果存在)。在没有非常明确的、预先存在的选项的情况下,OpenTelemetry 必须提供自己的 Context 实现。根据语言的不同,其使用方式可能是显式或隐式的。
使用隐式 Context 的语言编写的仪器用户,不鼓励直接使用 Context API。在这种情况下,用户将通过横切关注点 API 来操纵 Context,以执行设置特定 Context 的追踪或 baggage 条目等操作。
Context 应具有以下操作,以及它们各自的语言差异。
创建密钥
密钥用于允许横切关注点控制对其本地状态的访问。它们是唯一的,因此其他可能使用相同上下文的库不能意外地使用相同的密钥。建议通过 API 来协调数据访问,而不是提供对其密钥的直接公共访问。
API 必须接受以下参数
- 密钥名称。密钥名称用于调试目的,并不唯一标识密钥。多次调用
CreateKey并使用相同的名称,除非语言限制另有规定,否则不应返回相同的值。不同语言可能对预期类型施加不同的限制,因此此参数仍是实现细节。
API 必须返回一个表示新创建密钥的不透明对象。
获取值
关注点可以访问当前执行状态中的本地状态,该状态由 Context 表示。
API 必须接受以下参数
Context。- 密钥。
API 必须返回 Context 中指定密钥的值。
设置值
关注点可以记录当前执行状态中的本地状态,该状态由 Context 表示。
API 必须接受以下参数
Context。- 密钥。
- 要设置的值。
API 必须返回一个包含新值的新 Context。
可选的全局操作
这些操作仅期望由使用隐式 Context 的语言实现,因此是可选的。这些操作只能用于实现自动范围切换,并由 SDK 组件和 OpenTelemetry 仪器库定义更高级别的 API。
获取当前上下文
API 必须返回与调用者的当前执行单元关联的 Context。
附加上下文
将 Context 与调用者的当前执行单元关联。
API 必须接受以下参数
Context。
API 必须返回一个可以用作 Token 来恢复先前 Context 的值。
请注意,每次调用此操作都应相应地调用 分离上下文。
分离上下文
将与调用者的当前执行单元关联的 Context 重置为在附加指定 Context 之前的值。
此操作旨在确保将正确的 Context 与调用者的当前执行单元关联。用户可以依靠它来识别错误的调用顺序,例如,尝试分离不是当前实例的 Context。在这种情况下,该操作可以发出信号来警告用户错误的调用顺序,例如记录错误或返回错误值。
API 必须接受以下参数
- 由先前调用附加
Context返回的Token。
API 可以返回一个用于检查操作是否成功的值。