在服务规模比较大的场景下,OpenTelemetry中的trace数据将非常庞大,一般采用sampling的方法,对其进行部分采样。

sampling的时候,一个trace下面的所有span,要么都采样,要么都不采样,以防出现trace下span不完整的情况。

在OpenTelemetry中,sampling中有head sampling和tail sampling两种方式。

一.Head Sampling

Head sampling通常在client端进行,常用的Probabilistic Sampling,基于概率的采样:

比如:

  • 指定一个hash种子,基于traceId的hash值进行随机采样;
  • 指定采样的百分比,即采样多少比例的trace;
processors:
  probabilistic_sampler:
    hash_seed: 22
    sampling_percentage: 15.3

Head Sampling的优点:

  • 容易理解:简单的概率采样;
  • 易于配置:配置hash种子和采样比例即可;
  • 执行效率高;

Head Sampling的缺点:

  • 无法根据trace的特征进行采样,比如对出现错误码的trace,latency较高的trace重点采样;

二.Tail Sampling

Tail Sampling通常在otel-collector上进行。

由于Tail Sampling需要基于trace下的所有span的综合考虑后进行采样,所以要将trace下的所有span汇集到Otel-collector后,再决定是否采样。

若决定采样,则保留trace并发送给backend,否则丢弃。

image.png

Tail Sampling的优点:

  • 基于trace数据的特征进行采样,更加合理、贴近实际;

Tail Sampling的缺点:

  • 实现较难:需要对满足不同trace特征的采样,并且随着系统变更和规模的变化,采样规则也日益复杂;
  • 运维较难:由于需要将trace下的所有span汇集起来再做决策,导致汇集的地方存储了大量的数据,需要消耗大量的资源,为了保证tail sampling的正常执行,需要监控这些系统资源;
  • 通常会使用外部产商的采样技术:依赖于产商提供的内容;

在实际部署中,往往存在多个otel-collector节点,tail sampling要求一个trace下的所有span落入同一个otel-collector节点,这就要求:

  • 在前面部署一个otel-collector作为load balancer,基于traceId转发后后面的otel-collector;
  • 具体的tail sampling由后面的otel-collector执行;

image.png

三.最佳实践

Head Sampling和Tail Sampling通常配合使用:

  • 先使用head sampling降低数据量;
  • 再使用tail sampling基于trace特征做采样;

参考:

1.https://opentelemetry.io/docs/concepts/sampling/
2.https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/probabilisticsamplerprocessor
3.https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/tailsamplingprocessor
4.https://jiekun.dev/posts/kubecon-2023-otel-sampling/


a朋
63 声望38 粉丝