Quarkus原生模式下OtlpSpanExporterProvider找不到问题求助
在Quarkus应用中集成OpenTelemetry,通过OTLP(http/protobuf)协议导出追踪数据时,Java模式和dev模式运行正常,但构建为原生可执行文件后启动报错:
RuntimeException: Failed to start quarkus ... Caused by: java.util.ServiceConfigurationError: io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider: Provider io.opentelemetry.exporter.otlp.internal.OtlpSpanExporterProvider not found
当前配置
pom.xml依赖:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-opentelemetry</artifactId> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-otlp</artifactId> </dependency>
application.properties配置:
quarkus.otel.traces.enabled=true quarkus.otel.traces.exporter=otlp quarkus.otel.metrics.enabled=false quarkus.otel.metrics.exporter=none quarkus.otel.logs.enabled=false quarkus.otel.logs.exporter=none
运行时环境变量:
QUARKUS_OTEL_SDK_DISABLED=false QUARKUS_OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf QUARKUS_OTEL_EXPORTER_OTLP_ENDPOINT=... QUARKUS_OTEL_EXPORTER_OTLP_HEADERS="Authorization=Api-Token ..."
已尝试的无效方案
- 在
reflect-config.json中注册反射类:
[ { "name": "io.opentelemetry.exporter.otlp.internal.OtlpSpanExporterProvider" }, { "name": "io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter" } ]
- 配置
jni-config.json,并注册io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener和io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider服务 - 尝试实例化提供者类进行"虚拟加载":
OtlpSpanExporterProvider dummy = new OtlpSpanExporterProvider(); System.out.println("dummy.getName(): "+dummy.getName());
但添加这段代码构建原生镜像时,报错Unsupported type io.opentelemetry.exporter.otlp.internal.OtlpSpanExporterProvider is reachable,dev模式下该代码可正常输出dummy.getName(): otlp。
求可行的解决思路?
解决思路
替换为Quarkus原生适配的OTLP导出器
移除手动引入的opentelemetry-exporter-otlp,改用Quarkus官方提供的适配扩展,它已经为原生镜像预配置了所有必要的反射、资源和服务注册:<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-opentelemetry</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-opentelemetry-exporter-otlp</artifactId> </dependency>校验版本兼容性
确保quarkus-opentelemetry和quarkus-opentelemetry-exporter-otlp的版本与Quarkus核心版本完全一致,版本不匹配会导致原生镜像构建时的SPI服务加载异常。禁用OTel自动配置避免冲突
如果必须使用原生opentelemetry-exporter-otlp,在application.properties中添加:quarkus.otel.sdk.autoconfigure.enabled=false同时在
native-image.properties中强制包含服务注册文件:-H:IncludeResources=META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider清理缓存后重新构建
删除target目录清除旧构建缓存,避免残留的无效配置或未处理的类影响原生镜像生成。
内容的提问来源于stack exchange,提问作者Sergio Pio Alvarez

