链路追踪对比(Jaeger / Zipkin / Tempo)
选择链路追踪工具时,很多人会纠结:Jaeger 是 CNCF 毕业项目,Zipkin 是老牌选手,Tempo 是 Grafana 生态的新贵。它们之间有什么本质区别?选错了会有什么后果?
其实,理解了这三者的设计哲学,选择就不难了。
核心对比
Jaeger 架构
架构图
存储后端选型
部署配置
jaeger-production.yml
Zipkin 架构
架构图
Zipkin 的局限
Zipkin 是链路追踪领域的老前辈,但已经功能冻结(2023 年移至 CNCF 归档):
- 不支持 OpenTelemetry 原生采集(需要 Zipkin 原生 SDK)
- 存储后端配置复杂
- UI 功能相对基础
不推荐新项目使用 Zipkin。如果团队已经在用,可以继续维护。
Grafana Tempo 架构
核心设计:极低存储成本
Tempo 的设计哲学是「只索引,不存储完整数据」:
- Span 数据压缩后存入对象存储(S3/GCS/Azure Blob)
- 只在索引中存储 TraceID → 数据块的映射
- 查询时先查索引定位数据块,再从对象存储拉取
存储成本对比
Tempo 的存储成本约为 Jaeger 的 10%。
部署配置
tempo.yml
选型决策树
混合架构:Tempo + Jaeger
如果你既想用 Grafana 生态,又需要 Jaeger 的某些高级功能,可以采用混合架构:
混合架构配置
数据互通性
OpenTelemetry 兼容
三个工具都支持 OpenTelemetry 的 OTLP 协议:
OTel
数据格式对比
迁移路径
从 Zipkin 迁移到 Jaeger/Tempo
OTel
质量判断标准
读完本节后,你应该能够回答:
- Jaeger、Zipkin、Tempo 三者的核心设计哲学分别是什么?为什么它们的存储成本差异如此巨大?
- Grafana Tempo 为什么选择「只索引,不存储完整数据」的设计?这个设计带来了哪些优势和局限?
- 为什么 Zipkin 已经被 CNCF 归档(功能冻结)?对于正在使用 Zipkin 的团队,建议怎么做?
- 在什么场景下 Jaeger + Elasticsearch 是更优选择?什么场景下 Tempo + S3 是更优选择?
- 如果团队已经在使用 Grafana + Prometheus + Loki,引入链路追踪工具时应该如何选择?为什么?