4. 追踪数据采集:Agent/SDK 部署、采样策略

分布式追踪的数据采集是平台工程落地中最贴近业务应用的环节。采集层负责将链路数据从应用程序中提取出来,并按照预设的采样策略进行过滤,最终将有效数据发送至后端存储。本章聚焦于 Agent/SDK 的部署模式与三种核心采样策略的选型与实现。

4.1 Agent 与 SDK 部署模式

在平台工程实践中,追踪数据的采集通常通过两种方式注入到业务进程中:Agent 模式(无侵入)与 SDK 模式(代码侵入)。两种模式各有适用场景,下表从多个维度进行对比:

对比维度 Agent 模式(无侵入) SDK 模式(代码侵入)
接入方式 通过 Java Agent、eBPF、Sidecar 等机制自动注入 在代码中显式引入 SDK 并调用 API
业务代码改动 零改动 需要修改源码,增加埋点
控制粒度 粗粒度,通常按类/方法/接口级别自动拦截 细粒度,可精确控制每个 Span 的创建与属性
部署复杂度 需在启动参数或容器编排中挂载 Agent 需在构建流程中引入 SDK 依赖
典型场景 遗留系统、第三方中间件、快速接入 核心业务链路、自定义上下文传递
平台工程建议:推荐采用“Agent 兜底 + SDK 增强”的混合策略。对于通用中间件(如 HTTP 客户端、数据库驱动)使用 Agent 自动采集;对于核心业务逻辑,使用 SDK 手动注入业务语义标签,确保关键路径的上下文完整性。

4.2 采样策略:头采样、尾采样、概率采样

在分布式系统中,全量采集所有请求的追踪数据会带来巨大的存储与网络开销。采样策略决定了哪些请求的链路数据被保留。三种主流策略各有优劣,适用于不同的运维与观测目标。

下图展示了三种采样策略在请求生命周期中的决策时机与数据流向:

三种采样策略对比流程图 三种采样策略决策时机与数据流向 请求入口 头采样 请求入口处立即决策 尾采样 请求完成后集中决策 概率采样 固定概率随机决策 决策依据 TraceId 哈希 固定比例 决策依据 错误/慢请求/自定义规则 全量采集后过滤 决策依据 随机数生成 独立于请求内容 输出:部分链路 输出:高价值链路 输出:随机链路 后端存储与分析

4.3 头采样(Head-Based Sampling)

头采样在请求进入分布式系统的第一个节点时,根据 TraceId 的哈希值或固定比例决定是否采集整条链路。决策在链路开始前完成,所有后续 Span 继承该决策结果。

  • 优点:实现简单,无额外延迟,适合高吞吐场景。
  • 缺点:无法针对错误或慢请求进行定向采集,可能丢失高价值链路。
  • 典型配置:采样率 1% ~ 10%,通过 TraceId 哈希均匀分布。
// 头采样示例:基于 TraceId 哈希
public boolean shouldSample(String traceId, int sampleRatePercent) {
    int hash = traceId.hashCode();
    int bucket = Math.abs(hash) % 100;
    return bucket < sampleRatePercent;
}

4.4 尾采样(Tail-Based Sampling)

尾采样允许所有 Span 数据先被临时缓冲,待请求结束后根据完整链路信息(如是否包含错误、延迟是否超过阈值)决定是否保留。该策略能确保高价值链路被完整采集。

  • 优点:精准保留异常与慢请求链路,数据价值密度高。
  • 缺点:需要较大的内存缓冲,增加系统复杂度与延迟。
  • 典型配置:缓冲窗口 10s ~ 60s,按错误码或 P99 延迟触发保留。
资源注意:尾采样对 Agent 或 Collector 的内存要求较高。在平台工程中,建议为尾采样节点配置独立的内存池,并设置缓冲上限,防止 OOM 影响业务进程。

4.5 概率采样(Probabilistic Sampling)

概率采样在每个 Span 或每个 Trace 的起始节点,以固定的概率独立决定是否采集。与头采样不同,概率采样不依赖 TraceId 的哈希分布,而是使用随机数生成器。

  • 优点:实现最为简单,无状态,适合快速接入。
  • 缺点:采样结果完全随机,无法保证关键链路的完整性。
  • 典型配置:采样率 0.1% ~ 5%,适用于流量极大且对链路完整性要求不高的场景。
// 概率采样示例:基于随机数
public boolean shouldSample(double sampleRate) {
    return ThreadLocalRandom.current().nextDouble() < sampleRate;
}

4.6 采样策略选型对比

下表从多个关键维度对三种策略进行横向对比,帮助平台工程团队根据业务场景做出选择:

维度 头采样 尾采样 概率采样
决策时机 请求入口 请求结束 任意节点
内存开销 低 高(需缓冲) 低
错误链路保留 随机保留 精准保留 随机保留
慢请求保留 随机保留 精准保留 随机保留
实现复杂度 低 高 最低
适用流量 高吞吐 中低吞吐 极高吞吐
典型采样率 1% ~ 10% 动态(按规则) 0.1% ~ 5%

4.7 平台工程中的混合采样策略

在实际落地中,单一采样策略往往无法满足所有需求。平台工程团队通常采用分层混合采样架构:

  1. 第一层:概率采样(网关层) — 在入口网关处对所有请求进行低比例概率采样(如 1%),用于全局流量观测与容量规划。
  2. 第二层:头采样(服务层) — 对核心服务设置独立的头采样率(如 10%),确保核心链路的可观测性。
  3. 第三层:尾采样(Collector 层) — 在 Collector 端对所有 Span 进行尾采样,根据错误码、延迟阈值、自定义标签等规则保留高价值链路。
最佳实践:在平台工程中,建议将采样策略配置为动态可调,通过配置中心(如 Apollo、Nacos)实时下发采样率,无需重启服务。同时,为每个服务设置采样率上限,防止突发流量导致后端存储过载。

通过合理的 Agent/SDK 部署与采样策略组合,平台工程团队可以在数据完整性与资源成本之间取得平衡,为值班台提供高质量、低延迟的分布式追踪数据基础。