无法通过OpenTelemetry Collector向Jaeger Query发送遥测数据
问题诊断与解决方案
核心问题梳理
- 端口冲突:OpenTelemetry Collector(以下简称OTel Collector)的OTLP Receiver绑定了
localhost:4317,而Jaeger all-in-one启动时默认也会占用4317端口,导致Jaeger启动失败,同时OTel Collector无法将数据导出到未正常启动的Jaeger服务。 - 主机名解析失败:OTel Collector配置中
exporters.otlp.endpoint设为jaeger-all-in-one:4317,如果是本地直接运行(非Docker容器环境),这个主机名无法被系统解析,导致导出请求报错。 - 错误的Jaeger组件使用:Jaeger Query仅负责从存储中查询并展示追踪数据,不具备接收追踪数据的能力,直接将Collector导出指向Query的端口完全无效。
分步解决方案
1. 解决端口冲突
调整Jaeger的OTLP端口(保持Collector端口不变,减少客户端配置修改):
启动Jaeger all-in-one时指定新的OTLP端口:
./jaeger-all-in-one --collector.otlp.grpc.host-port=:4319 --collector.otlp.http.host-port=:4320 --query.port=16686
这样Jaeger的OTLP GRPC端口改为4319,HTTP端口改为4320,彻底避开Collector占用的4317/4318端口。
2. 修正OTel Collector导出配置
更新config.yaml中的OTLP exporter配置,将endpoint指向Jaeger的新OTLP GRPC端口:
exporters: debug: verbosity: detailed otlp: endpoint: localhost:4319 # 改为Jaeger的OTLP GRPC端口 tls: insecure: true # 其他exporter配置保留
如果是Docker容器环境运行两者,需确保容器在同一网络,此时可直接用容器名称作为主机名(比如jaeger:4319),同时Jaeger的启动命令也要对应调整端口映射。
3. 确保客户端数据发送到OTel Collector
启动telemetrygen时明确指定Collector的OTLP端点,避免数据直接发送到Jaeger:
$GOBIN/telemetrygen traces --otlp-insecure --endpoint localhost:4317 --traces 3
4. 验证数据流程
- 先启动OTel Collector:
/usr/bin/otelcol --config=file:/etc/otelcol/config.yaml --feature-gates=-component.UseLocalHostAsDefaultHost
- 再启动调整后的Jaeger all-in-one
- 运行
telemetrygen发送数据 - 查看Collector日志,确认数据被接收并成功导出到Jaeger;打开Jaeger UI(默认
http://localhost:16686),即可看到带some.ip属性的追踪数据。
Docker Compose 正确配置示例
如果用Docker Compose部署,确保两者在同一网络,端口不冲突,配置如下:
version: '3.8' services: otel-collector: image: otel/opentelemetry-collector-contrib:latest command: ["--config=/etc/otelcol/config.yaml"] volumes: - ./otel-config.yaml:/etc/otelcol/config.yaml ports: - "4317:4317" # OTLP GRPC - "4318:4318" # OTLP HTTP networks: - tracing-network jaeger: image: jaegertracing/all-in-one:latest command: ["--collector.otlp.grpc.host-port=:4319", "--collector.otlp.http.host-port=:4320"] ports: - "16686:16686" # Jaeger UI - "4319:4319" # Jaeger OTLP GRPC - "4320:4320" # Jaeger OTLP HTTP networks: - tracing-network networks: tracing-network: driver: bridge
对应的OTel Collector配置(otel-config.yaml)中,exporter endpoint改为jaeger:4319即可。
额外说明
- 你的
attributesprocessor配置是正确的,只要数据经过该processor,some.ip属性会被插入到追踪数据中,可通过Jaeger UI的Span详情查看。 - 如果需要过滤数据,可以添加
filterprocessor到traces pipeline中,例如:
processors: filter: traces: span: exclude: attributes: - key: "some.key" value: "exclude-value"
然后在traces pipeline的processors列表中加入filter即可。
内容的提问来源于stack exchange,提问作者Stan Mchof
相关产品推荐
相关产品推荐

