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

OTel Baggage 的用途是什么?

Baggage 最适合用于包含通常仅在请求下游可用时包含的信息。例如,这可能包括客户账户标识、用户 ID、产品 ID 和源 IP 地址等。

使用 baggage 传播这些信息可以对后端中的遥测数据进行更深入的分析。例如,如果你在跟踪数据库调用的 span 中包含用户 ID 之类的信息,则可以更容易地回答“哪些用户遇到的数据库调用最慢?”这类问题。你还可以记录有关下游操作的信息,并将相同的用户 ID 包含在日志数据中。

OTel Baggage

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 规范


最后修改于 2025 年 1 月 24 日: Concepts > Signals 的编辑更改 (#6067) (7c0e4db0)