Jaeger 分布式追踪 系统详解
一、起源与定位 🧭
Jaeger 是由 Uber 于 2015 年开源,并于 2017 年进入 CNCF(云原生计算基金会),2019 年正式毕业。它受谷歌 Dapper 和 Twitter 的 Zipkin 启发,旨在为微服务架构提供请求级的可观察性,主要解决以下问题:
- 分布式上下文传播:追踪请求如何在多个服务之间传播;
- 事务链路监控:分析跨服务调用的时延、依赖和瓶颈;
- 根因分析:快速定位问题源头;
- 服务依赖关系分析:构建调用拓扑;
- 性能优化:发现慢调用与瓶颈服务。
Jaeger 的目标是成为云原生微服务架构下的标准追踪工具,性能高、易扩展、支持多种部署方式,并完全开源。
二、系统架构
Jaeger 的系统架构包含以下核心组件:
- Instrumentation SDK(追踪埋点)
提供多语言支持(Java、Go、Python、Node.js、C#等),应用程序通过 SDK 在关键位置埋点,生成 Trace 和 Span 数据。 - Agent(代理)
部署在每台宿主机上,接受应用发送的追踪数据(通常通过 UDP),并转发给 Collector。它起到缓冲、批量处理和负载均衡的作用。 - Collector(收集器)
接收 Agent 发送的数据,进行格式校验、批处理、写入存储等操作。Collector 可以部署多个实例以支持高可用和水平扩展。 - Storage(存储)
用于存储 Trace 数据,支持 Cassandra、Elasticsearch、OpenSearch、Badger(内存)等。也支持远程存储插件接入如 ClickHouse。 - Query Service + UI
提供 API 和 Web UI,让用户可以通过 Web 浏览器检索 Trace,分析各个 Span 的时延与服务依赖。 - 命令行工具(CLI)
提供部署测试、Trace 查询、健康检查等功能。
三、采样机制
采样策略决定了哪些请求会被记录下来。Jaeger 支持:
Head-based Sampling(前采样)
在请求产生的第一步决定是否采样:
- 固定比率采样(如 1%)
- 基于规则的采样(例如按服务、操作名分类)
- 远程动态采样(从服务器下发配置)
Tail-based Sampling(尾采样)
先收集所有数据,在 Collector 或 Processor 中再决定保留哪些 Trace。优点是可基于完整的 Trace 信息做决策,缺点是性能消耗大,需更多内存和缓存控制。
四、与 OpenTelemetry 的整合
OpenTelemetry 是 CNCF 支持的新一代可观察性标准。Jaeger 已全面支持 OpenTelemetry,包括:
- 支持使用 OpenTelemetry SDK 埋点;
- 支持接收 OTLP 格式数据;
- 可与 OpenTelemetry Collector 进行整合,实现 Tail Sampling、自定义处理流程、数据过滤等;
- 利用 Collector 实现统一的日志、指标、追踪三者聚合处理;
- Jaeger UI 依然可作为 OpenTelemetry 后端查看 Trace。
五、部署方式
Jaeger 提供多种部署模式:
1. All-in-One 模式(单体部署)
适用于开发环境,将 Agent、Collector、UI、Query 等组件集成在一个进程中运行。
2. 生产模式(组件拆分)
建议在生产中将各个组件分别部署,以实现高可用、可扩展的架构,支持使用容器(Docker)、Kubernetes、Helm Chart 等方式部署。
3. Streaming 模式(Kafka 等)
在流量大、数据量大的情况下,可以使用 Kafka 作为 Trace 数据的中间缓存,通过消费者组异步处理。
六、存储后端详解
Jaeger 支持多种存储后端,不同存储具有不同特点:
- Cassandra:分布式、高可用、适合写入密集型应用;
- Elasticsearch / OpenSearch:查询能力强,支持复杂条件过滤,适合需要频繁查询 Trace 的场景;
- Badger / In-Memory:适合开发、测试;
- ClickHouse(远程插件):支持大数据量的快速分析,适合历史 Trace 查询。
选择存储时应结合场景、运维能力、数据保留周期等综合考量。
七、性能优化建议
Jaeger 在高并发场景下仍需注意以下几点:
- 采样策略合理设置,避免数据量过大;
- Collector 实例水平扩展;
- 使用批量写入与压缩协议(gRPC);
- 使用高性能存储(如 Elasticsearch 集群);
- 限制 Trace 保存时长,设置清理策略;
- Prometheus + Grafana 监控 Jaeger 自身性能指标;
- 合理配置缓存大小与队列长度,防止数据丢失或堵塞。
八、安全与权限控制
- 支持启用 TLS 对 Collector、Query 服务进行加密;
- 可使用 API 网关对访问 UI 和 API 设置认证;
- 在 OpenTelemetry Collector 中可以设置脱敏处理器,屏蔽敏感信息(如 token、密码);
- 日志与监控应统一接入运维平台,便于审计和故障排查。
九、常见使用流程
- 在应用中引入 SDK,并初始化 Jaeger Exporter;
- 设置采样策略;
- 部署 Agent + Collector + Storage + UI;
- 用户通过 UI 查询某一请求 ID(TraceID);
- 查看 Trace 中每个服务的执行耗时、错误信息等;
- 配合指标系统(如 Prometheus)发现异常指标后,利用 Trace 进行深入分析。
十、生态系统集成能力
Jaeger 支持和多个可观察性工具集成:
- 与 Prometheus / Grafana 联动,可将追踪数据与系统指标、日志联合分析;
- 与 OpenTelemetry Collector 配合,支持数据过滤、聚合、转发;
- 与 Zipkin 协议兼容,方便老项目迁移;
- 与 Kubernetes / Istio / Envoy 联合使用,实现服务网格下的自动追踪;
- 可输出到 Kafka 等消息队列,支持与大数据分析系统结合。
十一、Jaeger 与其他追踪工具对比
工具 | 特点 |
---|---|
Jaeger | 开源、可扩展、支持多种存储、生态兼容 OpenTelemetry |
Zipkin | 社区活跃,轻量,适合小型项目 |
SkyWalking | UI 交互好、支持链路 + 指标 + 拓扑图,多用于国产项目 |
Tempo | 高性能,支持 Loki 联动,优化存储开销 |
AWS X-Ray | 云服务集成好,但闭源、不可控 |
Jaeger 的优势是中立、灵活、开源,部署和定制自由度高,适合中大型微服务系统。
十二、未来趋势
- 全面向 OpenTelemetry Collector 架构过渡;
- Tail Sampling 成为主流采样策略;
- 支持更多插件化后端,如 ClickHouse;
- 更强的数据脱敏与权限控制功能;
- 与日志系统深度融合,实现 TraceID 联动查日志;
- UI 重构,提升可用性与分析能力。
总结
Jaeger 是云原生时代的分布式追踪利器,具备以下优点:
- 完整的链路追踪能力;
- 多语言 SDK;
- 多存储支持与可扩展架构;
- 与 OpenTelemetry 无缝整合;
- 强大的可视化 UI;
- 良好的社区支持。
它适合在微服务架构中提供深入的性能分析与根因诊断,是构建现代可观察性平台的重要组成部分。