在 OpenTelemetry 中,Baggage 是跨度之间传递的上下文信息,它是一个键值存储,与跟踪中的跨度上下文一起驻留,使值可用于该跟踪中创建的任何跨度。
例如,假设您希望跟踪中的每个跨度都有一个 CustomerId 属性,这涉及多个服务;然而,CustomerId 仅在一项特定服务中可用,为实现您的目标,您可以使用 OpenTelemetry Baggage 在整个系统中传播此值。
OpenTelemetry 使用 Context Propagation 来传递 Baggage,每个不同的库实现都有传播器来解析并使 Baggage 可用,而无需您显式实现它。
OTel Baggage 为何存在?
Baggage 提供了一种统一的方式来存储和传播跟踪和其他信号中的信息,例如,您可能希望将应用程序中的信息附加到一个 span 并在稍后恢复该信息并将其用于另一个 span。但是,OpenTelemetry 中的跨度一旦创建就不可更改,并且可以在您稍后需要有关它们的信息之前将其导出。Baggage 允许您通过提供一个存储和恢复信息的地方来解决这个问题。
OTel Baggage 应该用来做什么?
OTel Baggage 应该用于您可以暴露给任何可以访问您网络的人的数据,这是因为它与当前上下文一起存储在 HTTP 标头中。如果您的相关网络流量完全在您自己的网络内,则此附加说明可能不适用。
常见用例包括只能在堆栈的更上层访问的信息,例如,这可以包括帐户标识、用户 ID、产品 ID 和原始 IP 等内容。将这些向下传递到您的堆栈中,您就可以将它们添加到下游服务中的 Span 中,以便在您在可观察性后端中进行搜索时更轻松地进行过滤。没有内置的完整性检查来确保Baggage Items是您的,因此取回它们时要小心。
Baggage 和 Span 属性不一样
关于 Baggage 需要注意的一件重要事情是它不是 Span 属性的子集,当你添加一些东西作为 Baggage 时,它不会自动增加在子系统跨度的属性上,您必须明确地从 Baggage 中取出一些东西并将其附加为属性。
例如,在 .NET 中,您可以这样做:
var accountId = Baggage.GetBaggage("AccountId");
Activity.Current?.SetTag("AccountId", accountId);
如需更多信息,请参阅Baggage规范。