Spring Boot 3.0集成Micrometer Tracing与OTLP时类缺失错误排查
我有一个基于Spring Boot 3.0、Kotlin的项目,使用Micrometer Tracing(替代Spring Cloud Sleuth),尝试将其连接到Jaeger的OTLP收集器。
配置类
@Configuration class OpenTelemetryConfiguration( @Value("\${otel.exporter.otlp.traces.endpoint:http://localhost:4317}") private val tracesEndpoint: String ) { @Bean fun spanExporter(): SpanExporter = OtlpGrpcSpanExporter.builder().setEndpoint(tracesEndpoint).build() @Bean fun jaegerPropagator(): TextMapPropagator = JaegerPropagator.getInstance() }
Gradle依赖配置
implementation("io.micrometer:micrometer-core:1.11.0") implementation("io.micrometer:micrometer-tracing:1.1.1") implementation("io.micrometer:micrometer-registry-prometheus:1.10.5") implementation("io.micrometer:micrometer-tracing-bridge-otel:1.1.1") implementation("io.opentelemetry:opentelemetry-sdk:1.26.0") implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.26.0") implementation("io.opentelemetry:opentelemetry-exporter-common:1.26.0") implementation("io.opentelemetry:opentelemetry-exporter-otlp:1.26.0")
启动错误信息
Failed to instantiate [io.opentelemetry.sdk.trace.export.SpanExporter]: Factory method 'spanExporter' threw exception with message: io/opentelemetry/exporter/internal/otlp/OtlpUserAgent at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:171) at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ... 170 common frames omitted Caused by: java.lang.NoClassDefFoundError: io/opentelemetry/exporter/internal/otlp/OtlpUserAgent at io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder.<init>(OtlpGrpcSpanExporterBuilder.java:48) at io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter.builder(OtlpGrpcSpanExporter.java:40) at com.logindex.geoservice.configuration.OtelConfiguration.spanExporter(OtelConfiguration.kt:19) ... 171 common frames omitted Caused by: java.lang.ClassNotFoundException: io.opentelemetry.exporter.internal.otlp.OtlpUserAgent at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
该io.opentelemetry.exporter.internal.otlp.OtlpUserAgent类在io.opentelemetry:opentelemetry-exporter-otlp:1.26.0库中不存在,请问缺失了什么依赖?
- 补充缺失的依赖
OtlpUserAgent类属于OpenTelemetry的OTLP导出器内部公共模块,你需要添加以下Gradle依赖:
implementation("io.opentelemetry:opentelemetry-exporter-otlp-common:1.26.0")
注意你当前依赖中的opentelemetry-exporter-common和这个是不同的模块,前者是通用导出器工具类,后者是OTLP专属的内部公共模块。
版本兼容性对齐
Micrometer Tracing 1.1.x系列与OpenTelemetry 1.25.x版本是官方推荐的兼容组合,你当前使用的OpenTelemetry 1.26.0超出了兼容范围,这也可能引发依赖类找不到的问题。建议将所有OpenTelemetry相关依赖版本降级到1.25.0,或者升级Micrometer Tracing相关依赖到匹配1.26.0的版本。推荐使用自动配置替代手动Bean
实际上你不需要手动编写SpanExporter的Bean,Micrometer Tracing与OpenTelemetry的桥接已经支持通过配置文件自动创建OTLP导出器。只需在application.yml或application.properties中配置以下参数即可:
otel.exporter.otlp.traces.endpoint=http://localhost:4317
这样可以避免手动配置带来的依赖管理问题,同时简化代码。
内容的提问来源于stack exchange,提问作者Victor Mikhailov

