Baggage
在 OpenTelemetry 中,Baggage 是与上下文(context)相邻的上下文信息。Baggage 是一个键值存储,这意味着它可以让你alongside 上下文 随意 传递 任何数据。
Baggage 意味着你可以跨服务和进程传递数据,使其可用于添加到那些服务中的 跟踪(traces)、指标(metrics) 或 日志(logs) 中。
示例
Baggage 通常在跟踪(tracing)中用于在服务之间传递额外数据。
例如,假设你在请求开始时有一个 clientId,但你希望该 ID 在跟踪中的所有 span、另一个服务中的某些指标以及沿途的某些日志中都可用。由于跟踪可能跨越多个服务,因此你需要一种方法来传递数据,而不必在代码库的许多地方复制 clientId。
通过使用 上下文传播(Context Propagation) 将 baggage 跨服务传递,clientId 即可用于添加到任何额外的 span、指标或日志中。此外,instrumentations 会自动为你传播 baggage。
OTel Baggage 的用途是什么?
Baggage 最适合用于包含通常仅在请求下游可用时包含的信息。例如,这可能包括客户账户标识、用户 ID、产品 ID 和源 IP 地址等。
使用 baggage 传播这些信息可以对后端中的遥测数据进行更深入的分析。例如,如果你在跟踪数据库调用的 span 中包含用户 ID 之类的信息,则可以更容易地回答“哪些用户遇到的数据库调用最慢?”这类问题。你还可以记录有关下游操作的信息,并将相同的用户 ID 包含在日志数据中。
Baggage 安全注意事项
敏感的 Baggage 项可能会与非预期的资源(如第三方 API)共享。这是因为自动 instrumentations 会将 Baggage 包含在你的服务的大多数网络请求中。具体来说,Baggage 和跟踪上下文的其他部分在 HTTP 标头中发送,这使得任何检查你网络流量的人都可以看到。如果流量在你网络内部受到限制,那么此风险可能不适用,但请记住,下游服务可能会将 Baggage 传播到你的网络外部。
此外,没有内置的完整性检查来确保 Baggage 项是你的,因此在读取它们时请小心。
Baggage 与 Attributes 不同
关于 baggage 的一个重要注意事项是,它是一个独立的键值存储,并且与 span、metrics 或 logs 上的 attributes 是未关联的,除非显式添加它们。
要将 baggage 条目添加到 attributes,你需要显式地从 baggage 中读取数据,并将其作为 attributes 添加到你的 span、metrics 或 logs 中。
由于 Baggage 的一个常见用例是将数据添加到整个跟踪的 Span Attributes 中,因此许多语言都有 Baggage Span Processors,它们在 span 创建时将 baggage 中的数据添加为 attributes。
有关更多信息,请参阅 Baggage 规范。