OpenTelemetry 概率采样
简介
在分布式系统中,OpenTelemetry 用于生成大量遥测数据(如 traces、metrics、logs)。如果全量收集这些数据,可能导致存储成本过高或系统过载。概率采样(Probability Sampling)是一种通过预定义采样率(如 10%)随机决定是否收集数据的轻量级方案,它能有效控制数据量,同时保留代表性的系统行为样本。
核心概念
采样率(Sampling Rate)
采样率是一个介于 0 和 1 之间的值,表示数据被采集的概率。例如:
0.1
:10% 的数据会被采集1.0
:全量采集(无采样)
采样决策流程
代码示例
配置概率采样器(Python)
以下示例展示如何在 Python 中设置概率采样器:
python
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.sampling import TraceIdRatioBased
# 设置采样率为 30%
sampler = TraceIdRatioBased(0.3)
provider = TracerProvider(sampler=sampler)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("sample_span"):
print("Span 可能被采样(30% 概率)")
输出结果
运行多次后,大约 30% 的 Span 会被导出到后端系统(如 Jaeger)。
实际应用场景
案例:电商平台流量监控
假设一个电商平台的订单服务日均处理 100 万次请求:
- 全量采集:存储所有 traces 需要 1TB/天,成本高昂。
- 概率采样(5%):只需存储 5 万次请求的 traces,仍能捕捉到错误率和延迟趋势。
采样率选择建议
- 高流量生产环境:0.1~0.3(10%~30%)
- 调试阶段:1.0(全量)
- 低流量服务:0.5~1.0
注意事项
- 数据一致性:同一 Trace 的所有 Span 应共享采样决策(通过
TraceId
实现)。 - 动态调整:可通过配置中心动态更新采样率,无需重启服务。
- 补充策略:可组合使用概率采样和基于条件的采样(如错误请求全采样)。
总结
概率采样是 OpenTelemetry 中平衡数据量与精度的关键工具。通过合理设置采样率,开发者可以:
- 降低存储和分析成本
- 避免采集冗余数据
- 保持对系统健康度的可见性
扩展练习
- 修改上述代码示例,尝试不同的采样率(如 0.5、0.8),观察导出结果的变化。
- 在分布式链路中,验证同一个 Trace 的 Span 是否全部被采样或丢弃。