在服务规模比较大的场景下,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,否则丢弃。
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执行;
三.最佳实践
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/
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。