2. Jaeger 基础回顾:架构、核心概念与采样策略

在深入配置环境一致性发布健康口径之前,必须先夯实 Jaeger 的基础知识。本章将系统回顾 Jaeger 的四大核心组件(Agent、Collector、Query、UI)、分布式追踪的两个核心抽象(Span 与 Trace),以及生产环境中至关重要的采样策略。这些概念是后续所有链路数据治理与健康评估的基石。

2.1 Jaeger 整体架构

Jaeger 采用模块化、可水平扩展的架构设计,主要分为四个核心组件。数据流从应用程序埋点开始,经过 Agent 缓冲上报,由 Collector 接收、校验、存储,最终通过 Query 服务对外提供检索能力,UI 层负责可视化呈现。

架构要点: Jaeger 的 Agent 与应用程序同进程部署(Sidecar 模式),Collector 无状态可水平扩展,存储后端支持 Cassandra、Elasticsearch 和 Badger。
Jaeger 核心架构组件与数据流 Jaeger 核心架构组件与数据流 应用程序 Jaeger Agent Jaeger Collector 存储后端 Jaeger Query Jaeger UI 数据流说明: 应用通过 UDP/gRPC 将 Span 发送给本地 Agent → Agent 批量压缩后通过 gRPC 上报给 Collector → Collector 校验并写入存储后端 → Query 从存储读取数据 → UI 通过 Query API 展示 Trace。

2.2 Span 与 Trace 核心概念

分布式追踪的两个核心抽象是 Span(跨度)和 Trace(追踪)。理解这两个概念是解读链路数据的起点。

概念 定义 关键属性 类比
Span 分布式系统中一个逻辑工作单元,代表一次操作(如 RPC 调用、数据库查询)。 SpanID、ParentSpanID、OperationName、StartTime、Duration、Tags、Logs 函数调用栈中的一帧
Trace 一个完整请求在分布式系统中的全路径,由一组具有相同 TraceID 的 Span 组成。 TraceID、RootSpan、Span 树结构 一次完整的 HTTP 请求链路
SpanContext 跨进程传递的追踪上下文,包含 TraceID、SpanID、Baggage 等。 TraceID、SpanID、采样标记、Baggage Items HTTP 请求头中的追踪凭证
关键理解: Trace 是由多个 Span 组成的 有向无环图(DAG),根 Span 代表入口请求,子 Span 代表内部调用。Span 之间的父子关系通过 ParentSpanID 建立。
Trace 与 Span 层级关系示例 Trace 与 Span 层级关系示例(TraceID: abc123) Root Span: GET /api/order Span: auth.checkToken Span: order.getDetail Span: inventory.check Span: db.queryOrder Span: redis.getStock 说明:每个矩形代表一个 Span,箭头代表父子关系(Parent → Child)。所有 Span 共享同一个 TraceID,通过 SpanID 和 ParentSpanID 形成树状结构。

2.3 采样策略

在生产环境中,全量采集所有请求的链路数据会带来巨大的存储和网络开销。采样策略是 Jaeger 生产部署的必备配置。Jaeger 支持三种核心采样模式:

  • 头采样(Head-based Sampling): 在请求入口处决定是否采样,决策结果随 SpanContext 传递。简单但无法感知请求内部复杂度。
  • 尾采样(Tail-based Sampling): 在请求完成后,根据完整 Trace 的特征(如延迟、错误码)决定是否保留。更灵活但需要缓冲和延迟决策。
  • 自适应采样(Adaptive Sampling): 根据流量动态调整采样率,低流量时全采,高流量时降采。
采样策略 配置方式 适用场景 优缺点
固定概率采样 sampler.type=const, sampler.param=0.1 流量稳定、对采样率有明确预期的场景 简单可控,但无法区分重要请求
速率限制采样 sampler.type=ratelimiting, sampler.param=10 需要控制每秒最大采样量的场景 防止突发流量导致存储过载,但可能丢失低频重要请求
远程采样 sampler.type=remote, 从 Collector 动态获取策略 需要动态调整采样率、灰度发布期间 灵活可管理,但依赖 Collector 可用性
尾采样 通过 Jaeger 插件或 OpenTelemetry Collector 实现 需要保留高延迟、错误请求的完整链路 精准保留有价值链路,但增加延迟和内存开销
生产建议: 在配置环境一致性发布场景中,推荐使用 远程采样 + 自适应采样 组合。远程采样允许运维中心统一调整采样策略,自适应采样确保低流量环境(如灰度金丝雀发布)下全量采集,高流量环境(如全量发布)下按比例降采,从而在保障数据完整性的同时控制成本。

2.4 采样策略配置示例

以下是一个典型的 Jaeger Client 采样配置(以 Java 为例),通过环境变量或配置文件注入:

# 固定概率采样:10% 的请求被采样
JAEGER_SAMPLER_TYPE=const
JAEGER_SAMPLER_PARAM=0.1

# 速率限制采样:每秒最多采样 5 个请求
JAEGER_SAMPLER_TYPE=ratelimiting
JAEGER_SAMPLER_PARAM=5

# 远程采样:从 Collector 的 sampling 端点获取策略
JAEGER_SAMPLER_TYPE=remote
JAEGER_SAMPLER_MANAGER_HOST_PORT=jaeger-collector:5778
JAEGER_SAMPLER_PARAM=0.001  # 初始默认采样率
关键参数说明: 远程采样模式下,JAEGER_SAMPLER_PARAM 仅作为客户端启动时的初始值,后续采样率由 Collector 端的采样策略管理服务动态下发。生产环境中建议将初始值设为一个较低的概率(如 0.001),避免启动瞬间产生大量采样数据。