Baggage

假设您希望在 trace 中的每个 span 上都有一个CustomerId属性,这涉及多个服务;但是,CustomerId仅在一个特定服务中可用。为了实现您的目标,您可以使用OpenTelemetry Baggage在系统中传播此值。
在OpenTelemetry中,“Baggage”是指在 spans 之间传递的上下文信息。它是一个驻留在跟踪上下文中的键值存储,使值可用于该跟踪中创建的任何span。
OpenTelemetry使用 Context Propagation(上下文传播)来传递Baggage,每个不同的库实现都有propagators(传播者),可以解析Baggage并使其可用,而无需显式实现。

Why does OTel Baggage exist?

OpenTelemetry是跨平台和跨框架的。Baggage使上下文值位于相同的位置,具有相同的格式,并遵循相同的模式。这意味着您的所有应用程序,无论使用何种语言,都能够读取、解析和使用它们。当您构建大规模分布式系统时,这一点非常重要,并且您希望为团队提供自主性,以使用他们想要的任何语言或框架进行工作。

虽然完全可以使用其他方法(例如,在您的组织中对标题等进行标准化),但这给开发团队带来了在每个框架和语言中构建助手的负担,当出现其他更高优先级的项目时,这可能会无意中被忽略。

What should OTel Baggage be used for?

OTel Baggage应用于非敏感数据,您可以将其暴露给第三方。

常见的用例包括只能在堆栈上进一步访问的信息。例如,这可以包括帐户标识、用户ID、产品ID和源IP。通过将这些传递到堆栈中,可以将它们添加到下游服务中的Spans中,以便在Observability后端搜索时更容易过滤。

没有内置的完整性检查来确保Baggage是您的,因此在处理Baggage时要小心。

Baggage != Span attributes

关于Baggage需要注意的一点是,它不是 Span Attributes 的子集。当您添加Baggage时,它不会自动终止于子系统的spans的属性。您必须明确地从Baggage中取出一些东西,并将其附加为属性。

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

For more information, see the baggage specification.

 
posted @   该昵称已被屏蔽  阅读(133)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示