Spring Boot集成OpenTelemetry对接Jaeger报UNIMPLEMENTED未知服务错误
问题原因
你遇到的报错本质是导出协议和端口不匹配导致的,核心问题有三个:
- 原生Jaeger二进制包默认暴露的
14250端口是Jaeger私有gRPC协议的接收端口,仅支持Jaeger格式的链路数据,不支持OpenTelemetry标准的OTLP协议,你将OTLP导出器的端点指向14250端口,自然会触发未知服务的报错。 - 启动参数配置冲突:你同时指定了
otel.traces.exporter=jaeger(使用Jaeger私有协议导出)和一系列otel.exporter.otlp.*参数,Java Agent会同时加载两个导出器,导致多余的OTLP导出请求发往错误端口。 - 依赖冗余:使用OpenTelemetry Java Agent做无侵入埋点时,不需要在应用中手动引入OpenTelemetry相关依赖,Agent会自动注入所需的所有类,手动引入反而可能引发版本冲突。
解决方案
两种方案二选一即可:
方案1:使用Jaeger私有协议导出
删除所有otel.exporter.otlp.*开头的启动参数,若不需要导出指标可直接关闭指标导出器,修正后的启动命令如下:
java -javaagent:/Users/<user-name>/temp/opentelemetry-javaagent-all.jar -Dotel.traces.exporter=jaeger -Dotel.exporter.jaeger.endpoint=localhost:14250 -Dotel.resource.attributes=service.name=playground-app -Dotel.javaagent.debug=false -Dotel.metrics.exporter=none -jar playground-app-0.0.1-SNAPSHOT.jar
方案2:使用OTLP协议导出(推荐,为OpenTelemetry官方标准协议)
首先确认你本地运行的Jaeger版本 >= 1.35.0,该版本开始默认开启OTLP协议接收端口4317,修正启动参数如下:
java -javaagent:/Users/<user-name>/temp/opentelemetry-javaagent-all.jar -Dotel.traces.exporter=otlp -Dotel.metrics.exporter=otlp -Dotel.exporter.otlp.endpoint=localhost:4317 -Dotel.resource.attributes=service.name=playground-app -Dotel.javaagent.debug=false -jar playground-app-0.0.1-SNAPSHOT.jar
依赖修正建议
可以删除build.gradle中所有手动引入的OpenTelemetry相关依赖,仅保留业务所需的依赖即可,避免版本冲突:
// 删掉如下配置即可 // implementation platform("io.opentelemetry:opentelemetry-bom:1.9.0") // implementation platform('io.opentelemetry:opentelemetry-bom-alpha:1.9.0-alpha') // implementation('io.opentelemetry:opentelemetry-api') // implementation('io.opentelemetry:opentelemetry-api-metrics') // implementation group: 'io.opentelemetry', name: 'opentelemetry-proto', version: '1.7.1-alpha'
内容的提问来源于stack exchange,提问作者Bagira
相关产品推荐
相关产品推荐

