采样策略(头部采样 / 尾部采样)
一个日均 1000 万 QPS 的电商系统,如果每个请求都生成完整的 Trace,每个 Trace 平均 15 个 Span,每个 Span 平均 2KB,每天产生约 300GB 的链路数据。一年下来就是 100TB。
采样( sampling)是控制链路追踪成本的核心手段。但采样也是双刃剑——采得太多,成本爆炸;采得太少,有价值的 Trace 可能被丢弃。
采样的本质问题
采样解决的是「数据量 vs 可观测性」的矛盾:
好的采样策略是智能的:对绝大多数普通请求采集少量数据,对有问题的请求(慢、错、异常)采集完整数据。
采样类型对比
头部采样(Head-based Sampling)
原理
头部采样在请求入口处立即决定是否采样。决策后,请求后续的整个链路都遵循该决策。
OTel SDK 配置
常见模式
头部采样的局限
无法区分「好请求」和「坏请求」:
尾部采样(Tail-based Sampling)
原理
尾部采样在请求结束后(Span 全部完成)才决定是否采样。决策依据是请求的最终结果:是否慢、是否有错、是否符合特定规则。
OTel Collector 尾部采样配置
尾部采样的挑战
内存压力:需要等待请求结束后才能决定是否保留,所有 Span 都先暂存在内存中。10000 QPS 下,假设每个 Trace 需要 10KB 内存,10 秒等待窗口:
解决方案:限制 num_traces 参数,超出限制时按策略优先级丢弃。
延迟:请求结束后需要等待一段时间(decision_wait)才能决定是否发送,增加链路数据的延迟。配置建议:等待时间应大于最慢请求的预期时间。
自适应采样
原理
自适应采样根据当前负载动态调整采样率。QPS 高时降低采样率,QPS 低时提高采样率。
实现方式
方式一:OTel SDK 动态采样器
方式二:头部 + 尾部组合
这种组合策略是生产环境最常用的:头部保证基本的 Trace 覆盖率,尾部保证有问题的请求不被丢失。
规则采样
规则采样根据业务规则决定是否采样:
采样对指标的影响
采样只影响 Trace 数据,不影响 Metrics 数据。Metrics 是聚合数据,即使链路追踪采样 99%,Prometheus 的 QPS 统计仍然是准确的。
质量判断标准
读完本节后,你应该能够回答:
- 为什么说采样是链路追踪的「双刃剑」?好的采样策略需要平衡哪两个目标?
- 头部采样和尾部采样的核心区别是什么?为什么尾部采样能保留更多有价值的请求?
- 尾部采样在工程实现上最大的挑战是什么?
decision_wait和num_traces这两个参数分别控制什么? - 自适应采样的工作原理是什么?QPS 与采样率的关系是怎样的?
- 为什么说「头部 + 尾部组合采样」是生产环境最常用的策略?两者各承担什么职责?