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

在深入事件触发下的变更冻结闸口故障排查之前,必须先牢固掌握 Jaeger 的基础知识。本章将系统回顾 Jaeger 的架构组件、Span 与 Trace 的核心数据模型,以及采样策略——这些是后续所有追踪分析工作的基石。

2.1 Jaeger 架构:四大核心组件

Jaeger 采用微服务架构设计,由四个主要组件协同工作,完成分布式追踪数据的采集、处理、存储与可视化。理解每个组件的职责,是定位故障链路的第一步。

架构要点: Agent 与 Collector 之间的数据流是故障排查的关键路径。Agent 丢失、Collector 过载或存储后端不可用,都会导致追踪数据“黑洞”。
Jaeger 核心架构组件与数据流 Jaeger 核心架构组件与数据流 应用服务 A (携带 Jaeger Client) 应用服务 B (携带 Jaeger Client) Jaeger Agent (Sidecar / DaemonSet) UDP 批量上报 Jaeger Collector (无状态集群) gRPC / HTTP 接收 存储后端 Cassandra Elasticsearch Jaeger Query + UI 服务 用户浏览器 Jaeger UI 说明:Agent 通常以 Sidecar 或 DaemonSet 模式部署,与应用同节点;Collector 为无状态集群,可水平扩展。
组件 职责 部署形态 故障排查关注点
Agent 接收应用发出的 Span,批量压缩后上报给 Collector Sidecar / DaemonSet(每个节点一个) UDP 丢包、Agent 进程崩溃、端口冲突
Collector 验证、索引、存储 Span,支持 gRPC/HTTP 接收 无状态集群(水平扩展) CPU/内存瓶颈、背压导致数据丢弃
Query 从存储检索 Trace,提供 API 和 UI 查询 无状态服务 查询超时、存储连接异常
UI 可视化 Trace 搜索、Span 详情、依赖关系图 与 Query 同进程或独立部署 浏览器兼容性、API 网关超时

2.2 Span 与 Trace:分布式追踪的核心数据模型

Trace 是贯穿整个分布式系统的一次请求或事务的完整记录;Span 则是 Trace 中的最小工作单元,代表一个服务内的一个操作。理解 Span 的层级关系与属性,是解读 Jaeger UI 中故障链路的前提。

关键概念: 一个 Trace 由一组具有相同 TraceID 的 Span 组成。Span 通过 SpanContext(包含 TraceID、SpanID、Baggage)在服务间传播,形成父子关系。

Span 的核心属性

  • OperationName:操作名称,如 HTTP POST /api/order、DB.Query。
  • SpanID / TraceID:全局唯一标识符,TraceID 标识整条链路,SpanID 标识单个操作。
  • ParentSpanID:父 Span 的 ID,用于构建 Span 树形结构。根 Span 无父 ID。
  • StartTime / Duration:操作开始时间与持续时长,是性能分析的基础。
  • Tags:键值对元数据,如 http.status_code=500、error=true。
  • Logs:时间戳 + 结构化日志,用于记录异常堆栈或关键事件。
Trace 与 Span 层级关系示例 Trace 与 Span 层级关系示例 Root Span: /api/order (TraceID: abc123, SpanID: 001) Child Span 1: auth.ValidateToken (SpanID: 002, Parent: 001) Child Span 2: order.CreateOrder (SpanID: 003, Parent: 001) Grandchild Span: db.InsertOrder (SpanID: 004, Parent: 003) 说明:Span 通过 ParentSpanID 形成树形结构。根 Span 是整个 Trace 的入口,子 Span 代表内部调用。

2.3 采样策略:控制数据量与成本

在高并发生产环境中,为每个请求生成完整 Trace 会产生巨大的存储和网络开销。采样策略决定了哪些请求被记录,直接影响故障排查时能否捕获到异常链路。

采样策略 工作原理 适用场景 故障排查影响
固定概率采样 以固定概率(如 0.1)随机采样 低流量、对成本敏感的环境 可能漏采偶发故障,需提高概率
速率限制采样 每秒最多采样 N 个 Span 高流量、需控制峰值写入的场景 突发流量下可能丢失关键 Trace
自适应采样 根据流量动态调整采样率,保证低流量全采、高流量降采 流量波动大的生产环境 推荐用于变更冻结闸口场景
远程采样 从 Collector 或配置中心动态获取采样策略 需要运行时调整策略的微服务 变更期间可临时提升采样率
变更冻结闸口特别提示: 在事件触发冻结期间,建议临时将关键服务的采样策略切换为“全量采样”(概率=1.0)或“远程采样+高优先级”,确保不遗漏任何与冻结闸口相关的故障链路。冻结解除后,再恢复为自适应采样以控制成本。

2.4 采样策略配置示例

以下为 Jaeger Client 的采样策略配置示例(以 Go 语言 SDK 为例),展示如何在代码中设置固定概率采样与远程采样。

// 固定概率采样:采样率 10%
import (
    "github.com/jaegertracing/jaeger-client-go"
    "github.com/jaegertracing/jaeger-client-go/config"
)

cfg := config.Configuration{
    Sampler: &config.SamplerConfig{
        Type:  jaeger.SamplerTypeProbabilistic,
        Param: 0.1, // 10% 采样率
    },
}

// 远程采样:从 Collector 获取策略
cfgRemote := config.Configuration{
    Sampler: &config.SamplerConfig{
        Type:                    jaeger.SamplerTypeRemote,
        Param:                   0.001, // 初始采样率
        SamplingServerURL:       "http://jaeger-collector:5778/sampling",
        MaxOperations:           1000,
        SamplingRefreshInterval: 60, // 每 60 秒刷新策略
    },
}

在变更冻结闸口场景下,可通过环境变量或配置中心动态覆盖采样率,例如设置 JAEGER_SAMPLER_TYPE=const 和 JAEGER_SAMPLER_PARAM=1 实现全量采样。