文章目录
- Jaeger 入门与实践:分布式追踪的利器
- 一、什么是 Jaeger?
- 二、核心概念
- 1. Trace(追踪)
- 2. Span(跨度)
- 3. Context(上下文)
- 三、Jaeger 架构解析
- 1. Client(客户端)
- 2. Agent
- 3. Collector
- 4. Storage(存储层)
- 5. Query + UI
- 四、Jaeger 的核心能力
- 1. 分布式调用链可视化
- 2. 性能分析
- 3. 根因分析(Root Cause Analysis)
- 4. 采样机制(Sampling)
- 五、Jaeger 与 OpenTelemetry
- 推荐架构:
- 六、快速上手(本地部署)
- 七、使用场景
- 1. 微服务架构
- 2. 云原生系统(Kubernetes)
- 3. 异步系统
- 八、Jaeger vs Tempo
- 九、最佳实践
- 1. 合理设置采样率
- 2. 规范 Span 命名
- 3. 与日志/指标结合
- 十、总结
Jaeger 入门与实践:分布式追踪的利器
在微服务架构日益复杂的今天,一次用户请求往往会穿越多个服务、队列、数据库。如果没有可观测性工具,我们很难回答一个简单的问题:“这次请求到底慢在哪里?”
这正是分布式追踪(Distributed Tracing)要解决的问题,而 Jaeger 是其中最流行、最成熟的开源方案之一。
一、什么是 Jaeger?
Jaeger 是由 Uber Technologies 开源的分布式追踪系统,用于:
- 追踪请求在微服务间的调用路径
- 分析系统性能瓶颈
- 排查复杂的分布式故障
它的设计目标包括:
- 高可扩展性(支持大规模数据)
- 低开销(适合生产环境)
- 与云原生生态深度集成
如今,Jaeger 已成为 Cloud Native Computing Foundation(CNCF)的毕业项目之一。
二、核心概念
在理解 Jaeger 之前,需要掌握几个关键概念:
1. Trace(追踪)
一次完整请求的生命周期,例如:
用户请求 -> API 网关 -> 服务 A -> 服务 B -> 数据库2. Span(跨度)
Trace 中的一个操作单元,例如:
- HTTP 请求
- 数据库查询
- RPC 调用
每个 Span 包含:
- 开始/结束时间
- 标签(tags)
- 日志(logs)
3. Context(上下文)
用于在服务之间传递 Trace 信息,确保调用链不断裂。
三、Jaeger 架构解析
Jaeger 的整体架构如下:
Client -> Agent -> Collector -> Storage -> Query -> UI1. Client(客户端)
- 嵌入在应用中
- 负责生成 Span 和 Trace
- 常通过 SDK(如 OpenTelemetry)实现
👉 推荐使用:OpenTelemetry
2. Agent
- 运行在本地(通常以 sidecar 或 DaemonSet)
- 接收客户端数据(UDP)
- 转发给 Collector
3. Collector
- 接收并处理追踪数据
- 执行采样、验证
- 写入存储后端
4. Storage(存储层)
支持多种存储:
- Elasticsearch(常用)
- Cassandra
- 内存存储(开发环境)
5. Query + UI
- 提供查询接口
- Web UI 可视化调用链
四、Jaeger 的核心能力
1. 分布式调用链可视化
你可以清晰看到:
- 哪个服务最慢
- 哪一步出现异常
- 调用顺序和依赖关系
2. 性能分析
通过 Span 时长分析:
- 找出慢接口
- 定位数据库瓶颈
- 识别网络延迟问题
3. 根因分析(Root Cause Analysis)
当某个请求失败时:
- 快速定位错误服务
- 查看错误日志(Span logs)
- 分析上下游影响
4. 采样机制(Sampling)
避免全量追踪带来的成本问题:
- 固定采样(如 1%)
- 动态采样(根据流量调整)
五、Jaeger 与 OpenTelemetry
现代可观测性体系中,Jaeger 通常不会单独使用,而是与 OpenTelemetry 搭配:
推荐架构:
应用 -> OpenTelemetry SDK -> OTLP -> Jaeger / Tempo优势:
- 标准化协议(OTLP)
- 多后端支持(Jaeger、Tempo 等)
- 更好的生态兼容性
六、快速上手(本地部署)
使用 Docker 一键启动 Jaeger:
dockerrun-d--namejaeger\-eCOLLECTOR_ZIPKIN_HOST_PORT=:9411\-p6831:6831/udp\-p16686:16686\-p14268:14268\jaegertracing/all-in-one:latest访问 UI:
http://localhost:16686七、使用场景
Jaeger 常用于:
1. 微服务架构
- 分析服务调用链
- 优化接口性能
2. 云原生系统(Kubernetes)
- 配合 Service Mesh(如 Istio)
- 实现全链路可观测
3. 异步系统
- Kafka / RabbitMQ 消息追踪
- 事件驱动架构分析
八、Jaeger vs Tempo
与 Grafana Tempo 对比:
| 特性 | Jaeger | Tempo |
|---|---|---|
| 存储 | 自带存储方案 | 依赖对象存储 |
| 成熟度 | 高 | 新兴 |
| 查询能力 | 强 | 较弱(依赖日志) |
| 成本 | 较高 | 更低 |
👉 简单理解:
- Jaeger:功能全面,适合复杂系统
- Tempo:成本优先,适合大规模追踪
九、最佳实践
1. 合理设置采样率
- 高流量服务:低采样(1%)
- 核心业务:提高采样
2. 规范 Span 命名
- 使用统一命名规则(如 REST 路径)
- 添加关键 tag(user_id、order_id)
3. 与日志/指标结合
- Tracing + Metrics + Logs = 完整可观测性
十、总结
Jaeger 是分布式追踪领域的“瑞士军刀”:
- ✅ 强大的调用链分析能力
- ✅ 成熟稳定的生态
- ✅ 与 OpenTelemetry 无缝集成
如果你正在构建微服务或云原生系统,Jaeger 几乎是必备工具之一。