Grafana Tempo 分布式追踪介绍
Grafana Tempo 是由 Grafana Labs 开源的一款高扩展、低成本且易于运维的分布式追踪(Distributed Tracing)后端系统。
核心设计理念与特性
在现代微服务和云原生架构中,分布式追踪是定位微服务间调用延迟、排查错误链路的关键工具。Tempo 的诞生主要是为了解决传统追踪系统(如基于 Elasticsearch 或 Cassandra 的方案)成本高昂、架构复杂和维护困难的问题。
极低成本的存储(基于对象存储)
- 存储介质:Tempo 抛弃了昂贵的搜索引擎或传统数据库,直接使用对象存储(如 AWS S3、Google Cloud Storage、Azure Blob、MinIO 等)作为持久化存储底座。
- 低成本高吞吐:由于对象存储成本极低且容量几乎无限,用户可以低成本保存海量(100% 采样率)的 Trace 数据,而不再需要为了节省存储开销而做极端的采样丢弃。
无外部依赖,架构轻量
- 传统的追踪系统通常重度依赖 Elasticsearch、Cassandra 等分布式数据库来建索引。
- Tempo 采用类似 Grafana Loki(日志系统)的思路,本身是无状态/轻状态架构,不依赖重型外部数据库,部署和横向扩容非常简单。
强大的查询语言:TraceQL
- 早期 Tempo 仅支持通过
TraceID直接点查(与 Loki/Prometheus 联动时极快)。 - 后来 Tempo 引入了 TraceQL(受 PromQL 和 LogQL 启发)。TraceQL 允许用户像查询指标或日志一样,根据 Span 属性、持续时间、状态码、服务名等复杂条件直接检索 Trace(例如:查找持续时间大于 500ms 且 HTTP 状态码为 500 的链路)。
广泛的协议兼容
Tempo 支持主流的分布式追踪协议和格式,几乎无需修改客户端即可无缝接入:
- OpenTelemetry (OTLP)(官方主推标准)
- Jaeger
- Zipkin
可观测性三位一体的无缝联动
Tempo 与 Grafana 生态深度集成,形成了完整的可观测性闭环:
- Metrics(Prometheus/Mimir):在仪表盘中发现接口延迟异常或错误率升高。
- Logs(Loki):点击图表下钻到对应服务在该时间段的异常日志(日志中携带 TraceID)。
- Traces(Tempo):通过日志中的 TraceID 一键跳转到 Tempo,完整展开整个调用链路瀑布图,快速定位到具体哪个下游服务或 SQL 查询导致了故障。
核心架构组件
Tempo 的架构设计与 Loki、Mimir 高度一致,支持单体运行(Monolithic)或微服务模式(Microservices):
- Distributor(分发器):接收客户端或 OpenTelemetry Collector 发送的 Trace 数据,验证格式后根据哈希环分发给 Ingester。
- Ingester(摄取器):将收到的 Trace 数据暂存在内存中并构建块(Block),达到一定阈值或时间后刷盘并上传到对象存储。
- Querier(查询器):处理查询请求,既可以从 Ingester 读取还在内存中的最新 Trace,也可以从对象存储中检索历史 Trace。
- Query-Frontend(查询前端):可选组件,负责切分复杂查询、缓存查询结果并加速响应。
- Compactor(压缩器):后台运行组件,将对象存储中的小数据块合并为大块,并执行数据过期清理(Retention)。
适用场景与优势对比
| 维度 | Grafana Tempo | 传统方案(如 Jaeger + Elasticsearch) |
|---|---|---|
| 存储成本 | 极低(对象存储 S3/GCS/MinIO) | 较高(ES 节点、高配置磁盘及内存) |
| 运维复杂度 | 低(微服务无状态设计,易扩容) | 高(需调优维护 ES 集群与分片) |
| 生态集成 | 与 Grafana、Prometheus、Loki 天生一体 | 需额外配置与打通 |
| 查询模式 | TraceID 精确查询 + TraceQL 过滤 | 全文索引搜索、条件组合查询 |
主要适用场景:
- 大规模微服务调用链路监控:需要高并发写入、海量 Trace 留存,但预算有限的场景。
- 已有 Grafana 技术栈的团队:希望打通 Metrics、Logs、Traces,降低排障门槛的团队。
- 全面拥抱 OpenTelemetry 的现代云原生系统。