大数跨境
0
0

opentelemetry+tempo采集服务trace

opentelemetry+tempo采集服务trace 运维小白成长之路
2025-10-31
2
导读:opentelemetry+tempo采集服务trace

前面介绍过通过 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> :3000, 默认用户名密码都为 admin

添加 tempo 数据源:

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

2.访问下示例应用

http://<server IP> :18080,分别点击下几个按钮进行测试:

3.然后到 grafan 中进行查询

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

随便点击一条 trace:

然后就能看到详情了:

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


好了,今天的分享就到这里了,希望对大家有所帮助。如果觉得还不错的话,各位看官动动小手点赞加关注,点击下面的链接可以直接进入本公众号,查看历史文章,谢谢大家^_^
                 



【声明】内容源于网络
0
0
运维小白成长之路
1234
内容 119
粉丝 0
运维小白成长之路 1234
总阅读142
粉丝0
内容119