Jaeger 基础回顾:架构、核心概念与采样策略
在深入事件触发下的变更冻结闸口故障排查之前,必须先牢固掌握 Jaeger 的基础知识。本章将系统回顾 Jaeger 的架构组件、Span 与 Trace 的核心数据模型,以及采样策略——这些是后续所有追踪分析工作的基石。
2.1 Jaeger 架构:四大核心组件
Jaeger 采用微服务架构设计,由四个主要组件协同工作,完成分布式追踪数据的采集、处理、存储与可视化。理解每个组件的职责,是定位故障链路的第一步。
架构要点: Agent 与 Collector 之间的数据流是故障排查的关键路径。Agent 丢失、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:时间戳 + 结构化日志,用于记录异常堆栈或关键事件。
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 实现全量采样。