自适应采样

链路追踪的采样策略直接影响数据量和系统开销。全量采样能保留完整的调用链路信息,但在高 QPS 系统下存储成本和性能开销不可接受;固定比例采样(如 1%)成本可控,但可能丢失关键的异常路径。自适应采样通过动态调整采样率,在数据完整性和资源消耗之间取得平衡。

自适应采样的核心思想是:采样率应该与请求的价值成正比。正常的、快速的请求可以低采样;异常的、缓慢的请求应该高采样(甚至全量采样)。这种策略确保了关键请求的链路信息不会丢失。

自适应策略类型

基于错误率的采样:当请求错误率上升时,自动提高采样率。原理是:生产环境中大多数请求是正常的,1% 采样已经足够;但当错误率上升时,高采样率可以保留更多故障现场的链路信息,便于分析。

基于延迟的采样:当请求延迟超过某个阈值(如 P99)时,自动提高采样率。这种策略可以确保慢请求的链路信息被保留,而这些慢请求往往是性能分析的关键数据。

基于资源预算的采样:当 Trace 存储接近容量上限时,自动降低采样率。这种策略确保系统不会因为数据量爆炸而崩溃。

OpenTelemetry 的自适应采样

OpenTelemetry SDK 支持配置基于父请求的采样决策。自适应采样的典型配置:

sampler:
  parent_based:
    root:
      type: trace_id_ratio
      probability: 0.01  # 基础采样率 1%
    remote_parent_sampled:
      type: always_on  # 如果上游已采样,保持采样
    remote_parent_not_sampled:
      type: always_off  # 如果上游未采样,不采样
    local_parent_sampled:
      type: always_on  # 本地根请求已采样,启用采样
    local_parent_not_sampled:
      type: always_off  # 本地根请求未采样,禁用采样

结合尾部采样(Tail-based Sampling)可以实现更精确的自适应策略。OpenTelemetry Collector 的 Tail Sampling Processor 可以在 Trace 完成后根据其整体特征(是否有错误、是否包含慢 Span)决定是否保留。