跟踪记录采样用于确定 Cloud Trace 注入哪些请求和 span,有助于您控制存储费用并遵守配额,同时捕获足够的数据来排查应用性能问题。 当端到端请求中的每个 span 都被记录下来时,跟踪记录即为完整。 不过,为了管理大量请求,分布式跟踪系统中的组件通常仅对一部分跟踪记录进行采样,或者遵循父 span 的采样决策。
采样与上下文传播不同。 采样用于控制组件是否记录 span 数据。相比之下,上下文传播会在组件之间传递跟踪记录标识符,以便将采样的 span 关联在一起。
采样策略
采样决策可以是基于头部,也可以是基于尾部。 在 基于头部的采样 中,当处理 span 的组件收到请求时,系统会做出采样决策。在基于尾部的采样中,系统会延迟做出采样决策 直到整个跟踪记录可用为止。
您可能会在分布式跟踪系统的文档中看到“100% 采样”一词。此短语可能适用于跟踪记录或组件。如果应用于跟踪记录,则表示所有 span 都已采样,或者等效地表示跟踪记录完整。如果应用于组件,则表示该组件对其处理的每个 span 进行采样。
基于头部的采样
基于头部的采样器通常配置为始终对 span 进行采样,或使用概率采样策略:
在始终采样配置中,处理和写入跟踪记录数据的组件会对每个 span 进行采样。 理想情况下,所有跟踪记录都是完整的,因此您拥有排查故障所需的信息。 不过,始终采样配置可能会导致您超出 配额或存储费用限制。
在概率采样中,并非所有 span 都会被采样。 此方法的实际行为取决于组件的实现。在某些实现中,所有 span 被采样的概率相同。在其他实现中,父级的采样决策会影响 span 是否被采样。
跟踪记录可能不包含每个 span。如果您使用概率采样、超出配额或使用处理 span 但不对 span 进行采样的组件,则跟踪记录不完整是预期行为。
基于尾部的采样
Cloud Trace 不支持基于尾部的采样;采样决策必须在向 Cloud Trace 发送数据的组件中做出。
如果您使用基于尾部的采样,则还可以使用中间服务器来接收跟踪记录数据、评估采样决策,并将采样的 span 中继到 Trace。例如,您可以使用 OpenTelemetry 收集器和 尾部采样处理器 来做出延迟采样决策。
如果您计划使用尾部采样,请考虑以下事项:
- 您必须先存储跟踪记录中的所有 span,然后才能做出采样决策。 因此,您可能需要大量临时存储空间或产生其他开销。
- 一般来说,可以为跟踪记录生成 span 的所有组件都需要进行协调。通常,使用 OpenTelemetry 的开发者会将同一跟踪记录 ID 的所有 span 路由到同一收集器。
组件做出采样决策
每个组件都会自行决定是否对其正在处理的 span 进行采样。不过,父级的采样决策(组件可以通过跟踪记录上下文获取)可能会影响组件的决策。使用
traceparent 标头 的应用可以使用 sampled 标志传递父级的采样
决策。
例如,假设每个组件都有一个规则,即“如果父 span 被采样,则对当前 span 进行采样;否则,对 50% 的 span 进行采样”。在这种情况下,以下情况属实:
- 根 span 决定是否对跟踪记录中的所有 span 进行采样。
- 当根 span 被采样时,跟踪记录中的所有 span 都会被采样。因此,跟踪记录是完整的。
采样和 Google Cloud 服务
每个 Google Cloud 服务都会自行做出采样决策, 并非所有 Google Cloud 服务都会进行采样。也就是说,服务可能永远不会向 Cloud Trace 发送数据。
当服务 Google Cloud 支持采样时,该服务通常会 实现以下功能:
- 默认采样率。
- 一种机制,用于将父级的采样决策用作是否对 span 进行采样的提示。
- 最大采样率。
如需请求服务添加对采 0/}样的支持, 请使用 Google 问题跟踪器。 Google Cloud
后续步骤
如需了解如何按 span 名称选择采样策略, 请参阅 Jaeger 远程采样。
我们建议您查看以下开源文档,以帮助您确定哪种采样方法最适合您正在开发和已部署的应用:
Google Cloud 服务文档: