Tempo 架构与使用

Grafana Tempo 是一个专门为大规模云原生环境设计的分布式追踪系统。它的核心设计目标是极低的运营成本和极高的可扩展性——通过与对象存储(如 S3、GCS)的深度集成,Tempo 可以在 PB 级别的数据量下保持合理的成本,同时通过 Grafana 的原生集成提供无缝的可视化体验。

Tempo 与 Jaeger、Zipkin 的定位有所不同。Jaeger 和 Zipkin 是完整的追踪系统,包含采集、存储、查询、可视化全链路能力;Tempo 则专注于存储和查询,采集层通过 OTLP 协议接收数据,可视化层依赖 Grafana。这种专注使得 Tempo 在存储层的优化上做到极致。

架构设计

Tempo 的架构分为四个层次:

Distributor:接收来自 OTel SDK 或其他追踪客户端的 Span 数据,验证格式后分发到 Ingester 组件。Distributor 通过 gRPC 负载均衡实现水平扩展。

Ingester:接收 Distributor 分发的数据,聚合为完整的 Trace 后写入后端存储。Ingester 是有状态组件,数据在内存中暂存,满了或超时后写入存储。

Querier:查询层,负责接收 Trace 查询请求,从后端存储中检索数据。Querier 可以直接查询对象存储,也可以通过 Query Frontend 并行查询多个 Ingester。

Query Frontend:查询前端,将大的查询请求拆分为多个小请求并行查询,提高查询性能。Query Frontend 还提供查询缓存,避免重复查询。

与 Grafana 的深度集成

Tempo 与 Grafana 的集成是其最大优势。Grafana Explore 页面原生支持 Tempo 数据源,可以直接展示 Trace 瀑布图、Span 详情、时间线等可视化内容。

更重要的是,Tempo 支持多数据源关联:在同一个 Grafana 面板中,可以同时展示 Metrics、Logs 和 Tracing 数据。例如,告警触发时,可以直接展示「这条告警对应的 Trace ID」,点击后跳转到该 Trace 的完整链路视图。这种集成能力是其他追踪系统难以企及的。

存储后端

Tempo 支持多种存储后端:

后端适用规模成本性能
S3/GCSPB 级中等
Azure BlobPB 级
MinIO中等中等
Local测试

对象存储的成本是本地 SSD �� 1/10 左右,但查询延迟更高。Tempo 通过预取(Prefetch)机制缓解这个问题:当查询某个 Trace 时,Tempo 会预取相邻数据块,利用对象存储的顺序读取优势。