背景
在分布式系统中,随着微服务越来越多,以及各种中间件、基础组件的引入,让调用链路的收集变得越来越复杂,调用链层级越来越深。为了能够清晰直观的展示调用关系,辅助定位问题,分布式链路追踪技术得到了广泛的应用,它提供了实时的可观测能力。
但是分布式系统的调用链路往往包含大量重复、冗余的数据,数据量巨大,全部保留成本很高,因此熟悉几种采样类型,基于业务场景制定最优采样策略,综合评估业务场景、观测需求和费用成本,才能最大限度保障性能监控和问题排查的使用需求。
采样类型
不同采样策略各有优劣,在实际业务场景中通常很难通过单一采样策略做到效果与成本的平衡,需要综合评估业务场景、观测需求和费用成本,因地制宜配置最适合的采样策略,例如核心应用、核心链路需要尽可能多采集,特别是对于异常链路的命中率,对于一些旁路服务或边缘应用则可以从成本考虑少采集甚至不采集。除了日常监控运维场景外,重大事件保障期间或新版本发布灰度期间,则需要从稳定性和应急响应角度评估采样方案,必要时可配置为全量采样策略。
继承采样
某个上游节点概率采样(固定概率或自适应概率均可)命中,当前节点继承上游节点传递过来的采样标记,并继续往下游传递。
链路特点:
完整 Trace,其包含:
- 包含从自主采样命中的节点(当前查询节点的上游节点)及其所有下游节点
- 不包含发起采样的节点的所有上游
自主固定概率采样
所有上游节点均未命中采样,当前节点通过概率采样命中并往下游传递
链路特点:
完整 Trace,其包含:
- 包含当前查询节点及其所有下游节点
- 不包含发起采样的节点的所有上游
自主自适应概率采样
所有上游节点均未命中采样,当前节点通过自适应概率采样命中并往下游传递,
自适应概率采样:按单位时间采集一定数目的 Txn 为目标,例如 100 条/min,是指单实例 100条/min
链路特点:
完整 Trace,其包含:
- 包含当前查询节点及其所有下游节点
- 不包含发起采样的节点的所有上游
前置/头部采样
针对某些特殊场景的前置采样,例如染色采样,在 http header 中添加trace信息透传到链路
链路特点:
完整 Trace,其包含:
- 发起采样的节点及其所有下游节点
- 不包含发起采样的节点的所有上游
后置/尾部采样
未命中采样时,链路中间某节点因遇到感兴趣事件(例如请求异常等)主动发起的后置采样,采样信息会随着返回上游的 response 往上传递
前置采样和后置采样区别如下图所示:
链路特点:
可能是残缺的 Trace,其包含:
- 发起采样的节点及其所有上游节点
- 发起采样节点之后的兄弟节点,默认不含兄弟节点衍生的链路
- 需要上游节点缓存数据
低频采样
为了对流量很低的服务的接口采样,对每个接口的第一次访问产生的trace 进行采样
链路特点:
完整 Trace,其包含:
- 发起采样的节点及其所有下游节点
- 不包含发起采样的节点的所有上游
全量本地采样
全量上报后产生的本地 Trace 数据
链路特点:
仅本地,不含上下游节点的 Trace