前面介绍过通过 otel+jaeger 的方式采集服务 trace,今天再分享另外一个方案otel+tempo+grafana
一. tempo 简介
Grafana Tempo 是一款开源的分布式追踪系统,专注于低成本、易扩展 的分布式追踪数据存储与查询,由 Grafana Labs 开发并维护.兼容主流追踪协议和格式,包括 Jaeger、Zipkin、OpenTelemetry 等,无需修改现有追踪 instrumentation 代码即可接入。
官方文档:https://grafana.com/docs/tempo/latest/
二. 部署
2.1 部署grafana+tempo
1.编写 docker-compose.yaml
services:
# grafana 服务
grafana:
container_name: "grafana"
image: grafana/grafana-oss:12.2.0-17142428006
hostname: grafana
restart: always
ports:
- "3000:3000"
volumes:
- $PWD/grafana/data:/var/lib/grafana #数据目录
environment:
GF_SERVER_ROOT_URL: http://192.168.31.103:3000/
networks:
- trace
# Tempo 服务(分布式追踪后端)
tempo:
image: grafana/tempo:r224-3f5070b# 使用最新版 Tempo 镜像
container_name: tempo
volumes:
- $PWD/tempo/tempo-config.yml:/etc/tempo/config.yml# 挂载配置文件
- $PWD/tempo/tempo-data:/tmp/tempo # 挂载数据卷(持久化存储)
ports:
- "3200:3200" # Tempo HTTP 接口(查询用)
#- "4317:4317" # OTLP gRPC 接收端口
#- "4318:4318" # OTLP HTTP 接收端口
command: ["-config.file=/etc/tempo/config.yml"]
restart: unless-stopped
networks:
- trace
networks:
trace:
driver: bridge
driver_opts:
com.docker.network.enable_ipv6: "false"
2.编写 tempo 的配置文件
# Tempo 配置:启用 OTLP 协议接收
server:
http_listen_port: 3200# Tempo 管理端口(供 Grafana 查询)
distributor:
receivers:
# 关键:启用 OTLP 接收器,支持 HTTP 和 gRPC 协议
otlp:
protocols:
http:
endpoint: 0.0.0.0:4318# 接收 OTLP HTTP 数据(对应 Collector 的 otlphttp exporter)
grpc:
endpoint: 0.0.0.0:4317# 可选:接收 OTLP gRPC 数据(若 Collector 用 otlp exporter)
storage:
trace:
backend: local# 测试用本地存储,生产可以用 S3/MinIO 等
local:
path: /tmp/tempo
block:
retention: 72h# 数据保留时间
3.启动
mkdir grafana
chown -R 472:472 grafana
docker compose up -d
2.2 部署opentelementry collector
1.docker-compose.yaml文件中添加collector 服务
...
# 1. OTLP Collector:统一接收各端OTLP数据
otel-collectoriotel-collector:
image:otel/opentelemetry-collector-contrib:0.136.0
container_name: otel-collector
hostname: otel-collector
restart: always
ports:
- "4317:4317"# gRPC接收端口
- "4318:4318"# HTTP接收端口
volumes:
- $PWD/otel/otel-collector-config.yml:/etc/otelcol-contrib/config.yaml# 挂载配置文件
networks:
- trace# 所有服务加入同一网络,确保互通
2. 编写 collector 配置文件otel-collector-config.yml
# OpenTelemetry Collector 配置:接收数据并转发到 Tempo
receivers:
# 1. 接收应用通过 OTLP gRPC 发送的追踪数据(最常用)
otlp:
protocols:
grpc:
endpoint: "0.0.0.0:4317"# Collector 监听的 gRPC 端口,应用需向此端口发数据
http:
endpoint: "0.0.0.0:4318"# 监听所有网卡的 4318 端口(HTTP 标准端口)
processors:
# 2. 数据处理(可选,如添加服务名、过滤无效数据)
resource:
attributes:
- key: env
value: "dev"# 给所有追踪数据添加统一服务名,便于后续查询
action: upsert
exporters:
# 3. 转发数据到 Tempo:使用 OTLP HTTP 协议(Tempo 默认支持)
otlphttp:
endpoint: "http://tempo:4318" # Tempo 的 OTLP HTTP 接收地址
tls:
insecure: true # 测试环境关闭 TLS,生产环境需配置证书
service:
# 4. 绑定 receiver、processor、exporter
pipelines:
traces:
receivers: [otlp] # 启用 OTLP 数据源
processors: [resource] # 启用数据处理(可选)
exporters: [otlphttp] # 启用 Tempo 出口
3.启动服务
docker compose up -d
2.3 部署示例应用
1.docker-compose.yaml中再添加 jaeger 的一个示例应用(这个上期文档也有用到它做测试),对接 otel collector
...
# 3. jaeger应用示例
jaeger-example-hotrod:
image: jaegertracing/example-hotrod:1.72.0
container_name: jaeger-example-hotrod
hostname: jaeger-example-hotrod
restart: always
command: ["all", "--otel-exporter=otlp"]
ports:
- "18080-18083:8080-8083"
# 映射 HotROD 服务端口(8080 为入口,8081-8083 为子服务)
environment:
# 对接otel-collector的 HTTP
- OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collectoriotel-collector:4318
depends_on:
- otel-collector
networks:
- trace
三. 使用
1.打开 grafana,对接 tempo
http://<server IP>

添加 tempo 数据源:


这里还可以关联 log和 metrics,这样就能通过 trceID 进行一些关联查询,我这里暂时没有,就先不管了,直接 save and test:



2.访问下示例应用
http://<server IP>

3.然后到 grafan 中进行查询

新版本的查询已经从 expolore移到 drilldown 了:

随便点击一条 trace:

然后就能看到详情了:

怎么说,这个 UI 做的还是差点意思, 在一些小屏幕上有点地方都没法滚动,但是可以和 loki 日志和 promethus 的指标等结合起来用还是可以的。

