3. Jaeger 基础概念:架构、核心组件与数据模型

在分布式系统排障中,Jaeger 是业界标准的分布式追踪系统。理解其架构、组件与数据模型,是后续利用 Jaeger 联动排查配置发布环境一致性偏差的前提。本节从三个维度拆解 Jaeger 的核心设计。

3.1 Jaeger 整体架构

Jaeger 采用 端到端异步收集 架构,数据流从应用进程出发,经过 Agent 缓冲、Collector 处理、存储持久化,最终在 Query/UI 呈现。整体分为 数据面(产生与收集)和 控制面(存储与查询)。

Jaeger 整体架构图 Jaeger 整体架构(数据流) 应用进程 (Instrumented Service) 产生 Span / Trace Jaeger Agent (Sidecar / DaemonSet) UDP 缓冲 + 采样 Jaeger Collector (无状态集群) 验证 / 索引 / 存储 UDP (Thrift) gRPC / HTTP 存储后端(Cassandra / Elasticsearch / Badger) 持久化 Span 数据,支持 TTL 与索引 Jaeger Query API 服务 Jaeger UI Web 控制台 JSON / gRPC 架构要点 • Agent 与进程同节点部署 • Collector 无状态,可水平扩展 • 存储后端可插拔
架构要点:Agent 采用 UDP 协议与应用程序通信,避免阻塞业务线程;Collector 无状态设计使得在配置发布高峰期可以快速扩容,降低数据丢失风险。

3.2 核心组件详解

Jaeger 由五个核心组件构成,每个组件承担明确的职责。下表从部署形态、通信协议、关键配置三个维度进行对比。

组件 部署形态 通信协议 关键配置项
Jaeger Client 嵌入应用进程(库) 内部 API 采样率、服务名、Tags
Jaeger Agent Sidecar / DaemonSet UDP (Thrift) 端口、Collector 端点、队列大小
Jaeger Collector 无状态服务集群 gRPC / HTTP 存储后端地址、最大消息大小
Jaeger Query 无状态服务 gRPC / HTTP 存储后端地址、端口
Jaeger UI Web 应用(静态资源) HTTP (Browser) Query 服务地址

3.3 数据模型:Trace、Span 与 SpanContext

Jaeger 的数据模型基于 Dapper 设计,核心概念包括 Trace、Span 和 SpanContext。理解这三者的关系是进行分布式追踪分析的基础。

  • Trace(追踪):一个完整的请求链路,由多个 Span 组成,通过 TraceID 唯一标识。
  • Span(跨度):链路中的最小工作单元,记录一个操作(如 RPC 调用、数据库查询)的开始、结束时间、状态和标签。
  • SpanContext(跨度上下文):跨进程传递的元数据,包含 TraceID、SpanID、Baggage 等,用于在分布式环境中串联上下游。
Trace 与 Span 关系图 Trace 与 Span 关系(时间轴) 时间 Span A: /api/order (Root Span) — TraceID: abc123 Span B: validateUser Span C: createOrder Span D: insertDB 数据模型关键字段: TraceID: 全局唯一 128bit ID | SpanID: 64bit ID | ParentSpanID: 父 Span 引用 | OperationName: 操作名 | StartTime / Duration | Tags / Logs
排查配置偏差的关键点:在配置发布场景中,通过 TraceID 可以串联同一请求在不同服务实例上的 Span。如果某个 Span 的 Tags 中携带了 config.version 或 env.id,就能快速定位到哪个实例使用了错误的配置版本。

3.4 数据模型核心字段速查

下表列出 Span 中与配置排查最相关的字段,方便后续在 Jaeger UI 中筛选和定位。

字段 类型 说明 配置排查用途
traceID string 全局唯一追踪 ID 关联同一请求的所有 Span
spanID string 当前 Span 唯一 ID 定位具体操作
operationName string 操作名称(如 HTTP 路由) 识别配置加载入口
tags map 键值对标签 注入配置版本号、环境标识
logs list 事件日志(时间戳 + 字段) 记录配置加载失败事件
process.serviceName string 服务名称 区分不同微服务
常见误区:不要将 TraceID 与 SpanID 混淆。TraceID 用于跨服务串联,SpanID 用于服务内定位。在配置发布一致性排查中,应优先关注 tags 字段中是否携带了自定义的配置版本标签,如果没有,需要在客户端代码中主动注入。