Go Trace 流程:从 Jaeger 到 Tempo 的可视化对比
分布式追踪工具很多。本文对比 Jaeger、Zipkin、Tempo、Datadog,给出选型指南。
一、Jaeger:Uber 开源
import"go.opentelemetry.io/otel/exporters/jaeger"exp,_:=jaeger.New(jaeger.WithCollectorEndpoint("http://jaeger:14268"))tp:=sdktrace.NewTracerProvider(sdktrace.WithBatcher(exp))特点:
- 全功能 UI
- 全局索引(service / operation)
- 性能优化:Cassandra / Elasticsearch 后端
二、Zipkin:Twitter 出身
import"github.com/openzipkin/zipkin-go"tracer,_:=zipkin.NewTracer(...)exp:=zipkinhttp.NewEndpoint("http://zipkin:9411/api/v2/spans")UI 简洁,存储基于 ES / Cassandra。
三、Tempo:Grafana 生态
exp,_:=otlptracehttp.New(ctx,otlptracehttp.WithEndpoint("tempo:4317"))特点:
- 把 trace ID 直接给 Loki / Prometheus
- trace + metrics + logs 在 Grafana 联动
四、对比
| 维度 | Jaeger | Zipkin | Tempo |
|---|---|---|---|
| 后端存储 | Cassandra/ES | ES/Cassandra | S3/GCS/local |
| 全局索引 | 强 | 中 | 弱 |
| DevOps 入口 | 独立 | 独立 | Grafana |
| 多语言 | 多 | 多 | OTel |
五、生产实战:集成 Grafana + Tempo + Loki + Prometheus
app → OTel → Tempo trace + Loki logs + Prometheus metrics dashboard → Grafana 把三者以 trace_id / service 关联六、OTel collector 接入
otel-collector-config.yaml:
receivers:otlp:protocols:grpc:{}exporters:jaeger:endpoint:jaeger:14250service:pipelines:traces:receivers:[otlp]exporters:[jaeger]七、采样策略
processors:tail_sampling:decision_wait:10spolicies:-name:errorstype:status_codestatus_code:{status_codes:[ERROR]}错误请求全采,正常 1% 采样。
八、查询语法
{span.http.status_code="500"}(Grafana 集成 Tempo 后)
九、实战:应用卡顿排查
5xx 高发 → Grafana alert → 跳到 Tempo 看慢 span stack → 找到 1.2s SQL → DB trace。
十、踩坑清单
- 采样率过低:错误漏掉
- 索引限制:Jaeger 全局索引吃存储
- 跨服务 trace 链断裂:propagator 要带 traceparent
十一、未来趋势
- Trace + AI 异常检测
- Span 颗粒度可配置
- 服务拓扑自动生成(依赖关系图)
十二、总结与展望
Jaeger / Zipkin / Tempo / Datadog 各有所长。Go 项目配合 OTel SDK,可以无痛切换后端。
未来:ITOA + AIOps 集成 trace 数据,让 SRE 自动根因分析。
十三、参考文献
- Jaeger 官方文档
- Tempo 文档
- Datadog APM 介绍