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