Spring Boot中如何修改Grafana Tempo分发器的Base URL?
我有一个由多个微服务组成的Docker部署应用,目前正在学习可观测性,已成功对接Loki日志系统、Prometheus指标系统以及Tracing系统Grafana Tempo。日志与指标功能运行正常,但启动应用后,负责发送追踪数据的服务出现如下错误:
Dropped 1 spans due to ResourceAccessException(I/O error on POST request for
"http://localhost:9411/api/v2/spans": Connect to http://localhost:9411
[localhost/127.0.0.1] failed: Connection refused)
我分析问题在于服务无法通过http://localhost:9411连接Tempo的Zipkin分发器服务,因为该服务位于容器内,正确地址应为http://tempo:9411(tempo为容器名称)。
以下是相关配置:
tempo.yml
server: http_listen_port: 3110 distributor: receivers: zipkin: storage: trace: backend: local local: path: /tmp/tempo/blocks
compose.yml
// Other services... tempo: container_name: tempo image: grafana/tempo:2.2.2 command: [ "-config.file=/etc/tempo.yaml" ] volumes: - ./docker/tempo/tempo.yml:/etc/tempo.yaml:ro - ./docker/tempo/tempo-data:/tmp/tempo ports: - "3110:3100" # Tempo - "9411:9411" # zipkin networks: - application-network
我的问题是:如何将分发器的Base URL从http://localhost:9411修改为http://tempo:9411?我已查阅多个网站及官方文档,但均未找到解决方案。
你搞错了配置对象——不需要修改Tempo的分发器配置,问题出在发送追踪数据的微服务本身的配置里。
Tempo的Zipkin接收器只是在容器内监听9411端口,等待同一Docker网络内的服务发送数据。而报错信息显示,你的微服务在尝试向localhost:9411发送Span数据,容器环境里的localhost指的是微服务自身的容器,而非Tempo容器。
解决步骤:
- 找到你的微服务中配置OpenTelemetry/Zipkin追踪的部分,把发送Span的目标地址从
http://localhost:9411/api/v2/spans改成http://tempo:9411/api/v2/spans - 确认你的微服务和Tempo服务都在同一个Docker网络
application-network下(从你的compose.yml看已满足此条件)
举几个常见场景的配置示例(不同语言/框架配置方式不同,核心是修改目标URL):
- 若使用OpenTelemetry SDK的Java服务,可设置环境变量:
OTEL_EXPORTER_ZIPKIN_ENDPOINT=http://tempo:9411/api/v2/spans - 若为Spring Boot应用,可在
application.yml中配置:management: tracing: sampling: probability: 1.0 zipkin: tracing: endpoint: http://tempo:9411/api/v2/spans
总结:Tempo的分发器不需要调整Base URL,它只负责接收数据;真正要修改的是**发送追踪数据的客户端(你的微服务)**的目标地址,用Docker服务名tempo代替localhost即可。
内容的提问来源于stack exchange,提问作者Nikent

