假设您希望在 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);
标签:OTel,OpenTelemetry,Baggage,使用,上下文,AccountId From: https://www.cnblogs.com/zhouyuguang/p/16941452.htmlFor more information, see the baggage specification.