Docker Compose中OpenTelemetry Java Agent无法向同编排的Collector导出数据
Docker Compose中OpenTelemetry Java Agent无法向同编排的Collector导出数据
我帮你排查了一下,核心问题出在Docker Compose的环境变量配置格式错误,导致你设置的OpenTelemetry导出端点根本没生效,Java Agent依然在使用默认的gRPC端口4317尝试连接Collector,这就是你看到Failed to connect to otel-collector/172.19.0.2:4317错误的原因。
下面是具体的修复步骤和优化建议:
1. 修正环境变量的配置格式
Docker Compose的environment字段中,环境变量的正确写法是KEY=VALUE,你之前用了冒号:的格式,这会导致变量无法被正确识别。另外,OTLP HTTP端点建议加上标准的v1路径(比如/v1/traces),避免出现404错误。
修改后的jpetstore服务环境变量部分:
environment: - JAVA_TOOL_OPTIONS="-javaagent:/opentelemetry-javaagent.jar" # 修正格式为KEY=VALUE,同时添加标准v1路径 - OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://otel-collector:4318/v1/traces - OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=http://otel-collector:4318/v1/metrics - OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://otel-collector:4318/v1/logs # 建议添加服务名,这是OpenTelemetry的最佳实践 - OTEL_SERVICE_NAME=jpetstore-service
2. 为Collector添加健康检查,确保就绪后再启动JPetStore
depends_on仅保证启动顺序,不保证Collector已经完成初始化并可以接受连接。添加健康检查后,JPetStore会等待Collector完全就绪后再启动,避免连接失败。
修改otel-collector服务,添加健康检查:
otel-collector: image: otel/opentelemetry-collector-contrib:latest command: ["--config=/otel-collector-config.yaml"] volumes: - ./otel-collector-config.yaml:/otel-collector-config.yaml expose: - "4317" - "4318" ports: - "4317:4317" - "4318:4318" restart: always # 添加健康检查,检查Collector的默认健康端口13133 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:13133/"] interval: 10s timeout: 5s retries: 5
同时更新jpetstore的depends_on配置,等待Collector健康:
depends_on: otel-collector: condition: service_healthy
3. 验证修复效果
- 停止并重新部署服务:
docker-compose down -v docker-compose up -d
- 进入JPetStore容器,检查环境变量是否正确设置:
docker exec -it jpetstore printenv | grep OTEL
你应该能看到正确的导出端点配置。
- 查看Collector的日志,确认是否接收到来自JPetStore的数据:
docker logs -f otel-collector
如果配置正确,你会看到类似Received traces的日志信息。
额外注意点
- 确保你使用的OpenTelemetry Java Agent版本是最新的,和Collector版本尽量兼容,避免出现协议不匹配的问题。
- 你的Collector配置已经正确启用了OTLP的HTTP和gRPC协议,这部分不需要修改。
备注:内容来源于stack exchange,提问作者Giovanni Zago
相关产品推荐
相关产品推荐

