Tempo介绍

Grafana Tempo 是一个开源的、易于使用的且高吞容量的分布式追踪后端。Tempo 具有成本效益高的特点,只需要一个对象存储来运行。Tempo 可以和 Grafana、Mimir、Prometheus 和 Loki 深度集成。可以使用 Tempo 与包括 Jaeger、Zipkin 或 OpenTelemetry 在内的开源追踪协议一起使用。

Tempo 与许多现有的开源工具集成良好:

Tempo从高基数的 trace-id 字段构建索引。由于 Tempo 使用对象存储作为后端,因此 Tempo 可以同时查询多个块(blocks),因此查询具有高度并行性。

Tempo的架构

Tempo 由以下组件组成:

|

  • Distributor(分发器) : distributor接受多种格式的spans数据,包括Jaeger、OpenTelemetry和 Zipkin。它通过哈希 traceID 并使用分布式一致性哈希环将spans路由到ingesters。distributor使用了 OpenTelemetry Collector 的接收器层。为了获得最佳性能,建议提取 OTel Proto 格式的 spans。因此,Grafana Agent 使用 otlp exporter/receiver 将 spans 发送到 Tempo。
  • Ingester : ingester 将跟踪数据批处理为块(blocks),创建布隆过滤器和索引,然后将其全部刷新到后端存储。后端存储中的块按照以下布局生成。
<bucketname> / <tenantID> / <blockID> / <meta.json>
                                          / <index>
                                          / <data>
                                          / <bloom_0>
                                          / <bloom_1>
                                            ...
                                          / <bloom_n>
  • Query Frontend : 查询前端负责对传入的查询请求进行分片,以便进行搜索。跟踪数据通过简单的HTTP端点公开:GET /api/traces/<traceID> 在内部,查询前端将块 ID 空间分割为可配置数量的分片,并将这些请求排入队列。查询器(Queriers)通过流式 gRPC 连接与查询前端连接,以处理这些分片查询。
  • Querier : 查询器(Querier)负责在Ingester或后端存储中查找所请求的traceID。根据参数的不同,它将同时查询ingesters,并从后端存储中提取布隆过滤器和索引来搜索对象存储中的块(blocks)。查询器在以下HTTP端点上公开接口:GET /querier/api/traces/<traceID>,但不建议直接使用该接口。查询应该发送到查询前端(Query Frontend)。
  • Compactor : 压缩器(Compactors)通过流式传输将块(blocks)从后端存储中进行压缩,以减少总块数。
  • Metrics generator : 指标生成器是一个可选的组件,从提取的跟踪数据中产生指标,并将其写入指标存储。

在 Grafana 中和其他信号集成

integrate-other-telemetry-signals

参考