You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus原生模式下OtlpSpanExporterProvider找不到问题求助

Quarkus原生镜像下OpenTelemetry OTLP导出器启动失败问题

在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。

求可行的解决思路?


解决思路

  1. 替换为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>
    
  2. 校验版本兼容性
    确保quarkus-opentelemetry和quarkus-opentelemetry-exporter-otlp的版本与Quarkus核心版本完全一致,版本不匹配会导致原生镜像构建时的SPI服务加载异常。

  3. 禁用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
    
  4. 清理缓存后重新构建
    删除target目录清除旧构建缓存,避免残留的无效配置或未处理的类影响原生镜像生成。

内容的提问来源于stack exchange,提问作者Sergio Pio Alvarez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:23:24