4. 样本采集策略:固定采样率、自适应采样、头部采样与尾部采样、采样优先级与标签
样本采集策略决定了哪些 Trace 数据会被保留下来用于后续的慢路径分析。错误的策略会导致关键慢 Trace 被丢弃,或者存储被大量无关数据填满。Tempo 提供了四种核心策略维度,需要根据业务场景组合使用。
4.1 固定采样率(Fixed Sampling)
最简单的策略,对所有 Trace 按统一概率进行采样。适用于流量稳定、对采样精度要求不高的场景。
| 参数 | 说明 | 推荐值 |
|---|---|---|
sample_rate |
全局采样概率,0.0 ~ 1.0 | 0.1(高流量)~ 0.5(低流量) |
max_traces_per_second |
每秒最大采样数,防止突发流量打爆后端 | 100 ~ 500 |
避坑提示: 固定采样率在流量突降时会导致采样数骤减,可能漏掉偶发慢 Trace。建议配合自适应采样使用。
4.2 自适应采样(Adaptive Sampling)
根据后端负载和 Trace 特征动态调整采样率。Tempo 的 Adaptive Processor 会监控每个 Service/Endpoint 的延迟分布,对慢 Trace 提高采样概率,对正常 Trace 降低概率。
# tempo-sampler.yaml 自适应采样配置示例
overrides:
defaults:
adaptive_sampling:
enabled: true
# 目标每秒采样数,根据后端容量设定
target_samples_per_second: 200
# 慢 Trace 的采样权重倍率(相对于正常 Trace)
slow_trace_weight: 5.0
# 自适应窗口(秒),用于计算延迟分布
adaptation_window: 60s
最佳实践: 自适应采样应作为生产环境的默认策略。它能在不增加存储压力的前提下,将慢 Trace 的捕获率提升 3~5 倍。
4.3 头部采样与尾部采样
这是两个完全不同的采样时机,直接影响你能分析到什么级别的数据。
| 维度 | 头部采样(Head-based) | 尾部采样(Tail-based) |
|---|---|---|
| 决策时机 | Trace 开始时(第一个 Span 创建时) | Trace 结束后(所有 Span 到达后) |
| 决策依据 | Trace ID 哈希、固定概率 | 完整 Trace 的延迟、错误码、标签 |
| 慢 Trace 捕获 | 随机捕获,无法保证慢 Trace 被选中 | 可精确捕获 P99/P999 慢 Trace |
| 存储开销 | 低,无需缓存完整 Trace | 高,需要缓存所有 Span 直到决策 |
| 适用场景 | 高吞吐、对慢路径不敏感 | 慢路径分析、SLO 监控 |
重要: 尾部采样是慢 Trace 复盘的核心前提。如果只使用头部采样,P99 以上的极端慢 Trace 几乎不可能被捕获到。Tempo 的 Tail Sampling Processor 需要配合足够的缓存(建议至少 10 倍于目标采样率的 Span 缓存)。
4.4 采样优先级与标签
当多种采样策略同时生效时,需要明确的优先级规则。Tempo 按以下顺序判断一个 Trace 是否被采样:
- 强制采样标签:如果 Trace 携带
sampling.priority=high或x-tempo-sampling-priority=1,必须采样。 - 策略匹配:根据 Service/Endpoint 匹配的自定义采样策略。
- 自适应采样:根据延迟分布动态计算概率。
- 固定采样率:兜底策略,按全局概率采样。
标签(Labels)在采样中起到关键作用:
- 业务标签:如
order_type=premium、region=us-east,可用于按业务维度提高采样率。 - 错误标签:如
error=true,自动提升采样优先级。 - 自定义标签:通过
tempo.sampling.override=true强制覆盖采样决策。
4.5 策略组合推荐
针对慢 Trace 复盘场景,推荐以下组合策略:
- 核心服务:尾部采样 + 自适应采样 + 强制标签(对关键业务 Trace 打
sampling.priority=high)。 - 边缘服务:头部采样 + 固定采样率(0.1~0.3),降低存储成本。
- 错误监控:对所有
error=true的 Trace 强制采样,不受概率限制。
复盘口径影响: 采样策略直接决定慢 Trace 样本的完整性和代表性。如果尾部采样缓存不足,会导致长 Trace 被截断;如果自适应采样窗口过小,会漏掉突发慢路径。建议在复盘前先确认采样策略配置,避免将采样偏差误判为性能问题。