Baggage(行李)

在 OpenTelemetry 中,Baggage 是在 Span 之间传递的上下文信息。它是一个键值存储,与跟踪中的 Span 上下文并存,并可供在该跟踪中创建的任何 Span 使用。

例如,假设您想在跟踪中的每个 Span 上都有一个 CustomerId 属性,该属性涉及多个服务;但是,CustomerId 只在一个特定的服务中可用。为了实现您的目标,您可以使用 OpenTelemetry Baggage 在系统中传播此值。

OpenTelemetry 使用上下文传播来传递 Baggage,每种不同的库实现都有解析和提供 Baggage 的传播器,无需您显式地实现。

OTel Baggage

OTel Baggage 的存在意义是什么?

Baggage 提供了一种统一的方式来存储和传播跟踪和其他信号中的信息。例如,您可能希望将应用程序中的信息附加到一个 Span,并以后在另一个 Span 中使用该信息。但是,在 OpenTelemetry 中,一旦创建了 Span,它们就是不可变的,并且可以在您以后需要获取信息之前导出。Baggage 允许您通过提供一个存储和检索信息的位置来解决此问题。

OTel Baggage 应该用于什么?

OTel Baggage 应该用于您可以接受潜在地向检查您的网络流量的任何人公开的数据。这是因为它存储在与当前上下文一起的 HTTP 标头中。如果相关的网络流量完全在您自己的网络内部,则可能不适用此注意事项。

常见的用例包括只能在堆栈中进一步访问的信息。这可以包括诸如账户标识、用户 ID、产品 ID 和原始 IP 等。将这些信息传递给堆栈的下游服务后,您可以将它们添加到 Downstream 服务中的 Span 中,以便在搜索您的可观察性后端时更容易进行过滤。

Baggage 项没有内置的完整性检查,以确保它们属于您自己的数据,因此在检索它们时要小心。

OTel Baggage

Baggage 不同于 Span 属性

关于 Baggage 的一个重要说明是,它不是 Span 属性 的子集。当您将某些内容作为 Baggage 添加时,它不会自动出现在子系统 Span 的属性上。您必须显式地将 Baggage 中的某些内容取出,并将其附加为属性。

例如,在 .NET 中,您可以这样做:

var accountId = Baggage.GetBaggage("AccountId");
Activity.Current?.SetTag("AccountId", accountId);

有关更多信息,请参阅Baggage 规范

最后修改 December 10, 2023: translate (a4350d6e)