跟踪记录采样

本文档介绍了抽样的概念,抽样是指是否将 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 进行采样。理想情况下,所有跟踪记录都是完整的,因此您拥有排查故障所需的信息。此类配置可能会导致您超出quotas或存储费用限制。

  • 使用概率采样时,并非所有 span 都会采样。此方法的实际行为取决于组件的实现。在某些实现中,所有 span 的采样概率都相同。在其他情况下,父级的采样决策会影响 span 是否进行采样。

跟踪记录可能不包含每个 span。这可能是由于使用了概率采样,也可能是由于配额,或由于处理请求但不对 span 采样的组件造成的。

基于尾部的抽样

Cloud Trace 不支持基于尾部的采样;必须在将数据发送到 Cloud Trace 的组件中做出抽样决策。

如果要使用尾部采样,可以使用接收跟踪信息的中间服务器,该服务器在做出采样决策后将数据中继到 Cloud Trace。例如,您可以将 OpenTelemetry 收集器Tail 采样处理器结合使用,以做出延迟采样决策。

如果您打算使用尾部采样,请考虑以下事项:

  • 在做出采样决策之前,您必须先将所有 span 存储在跟踪记录中。因此,您可能需要大量临时存储空间,或产生其他开销。
  • 一般来说,所有可以生成轨迹 span 的组件都需要进行协调。通常,使用 OpenTelemetry 的开发者会将同一跟踪记录 ID 的所有 span 路由到同一收集器。

抽样和 Google Cloud 服务

每项 Google Cloud 服务都会做出自己的抽样决策,并非所有 Google Cloud 服务样本都会这样做。也就是说,服务可能永远不会将数据发送到 Cloud Trace。

如果 Google Cloud 服务支持采样,该服务通常会实现以下内容:

  • 默认采样率。
  • 一种机制,可使用父级的采样决策作为决定是否对 span 进行采样的提示。
  • 最大采样率。

如需请求 Google Cloud 服务添加对采样的支持,请使用 Google 问题跟踪器

后续步骤