Ktor-2.0集成Aspect.io遇DuplicatePluginException问题求助
Ktor 2.0集成OpenTelemetry(Aspecto)时DuplicatePluginException的解决方法
错误原因
你同时启用了OpenTelemetry Java Agent和手动安装KtorServerTracing插件:
- OpenTelemetry Java Agent会自动检测Ktor应用,隐式安装OpenTelemetry插件以实现全链路自动追踪
- 手动调用
install(KtorServerTracing)会再次安装同名插件,触发DuplicatePluginException
解决方案
方案1:保留Java Agent(推荐,自动覆盖更多链路场景)
Java Agent能自动捕获JDBC、HTTP客户端、第三方库等链路数据,无需手动配置各组件的instrumentation:
- 移除
App.kt中手动安装插件的代码块:
// 删掉这段代码 install(KtorServerTracing) { setOpenTelemetry(GlobalOpenTelemetry.get()) }
- 调整依赖,移除手动的Ktor instrumentation依赖(Agent会自动处理):
dependencies { ... implementation(platform("io.opentelemetry:opentelemetry-bom:1.32.0")) implementation("io.opentelemetry:opentelemetry-api") implementation("io.opentelemetry:opentelemetry-extension-kotlin") // 移除这行 // implementation("io.opentelemetry.instrumentation:opentelemetry-ktor-2.0:1.31.0-alpha") implementation("io.opentelemetry.instrumentation:opentelemetry-logback-appender-1.0:1.31.0-alpha") openTelemetry("io.opentelemetry.javaagent:opentelemetry-javaagent:1.31.0") ... }
- 确保JVM参数配置正确,Agent会自动读取这些参数初始化OpenTelemetry:
applicationDefaultJvmArgs = listOf( "-javaagent:$buildDir/otel/otel-javaagent.jar", "-Dotel.service.name=mservice", "-Dotel.exporter.otlp.traces.endpoint=https://otelcol.aspecto.io:4317", "-Dotel.exporter.otlp.headers=Authorization=<auth-token>" )
方案2:不使用Java Agent,纯手动配置
若不需要Agent的自动追踪能力,可手动管理OpenTelemetry实例:
- 移除JVM参数中的
-javaagent配置:
applicationDefaultJvmArgs = listOf( "-Dotel.service.name=mservice" // 删掉这行:"-javaagent:$buildDir/otel/otel-javaagent.jar", )
- 保留
KtorServerTracing安装代码,但需手动初始化OpenTelemetry实例(避免依赖Global未初始化的实例):
import io.opentelemetry.api.OpenTelemetry import io.opentelemetry.sdk.OpenTelemetrySdk import io.opentelemetry.sdk.resources.Resource import io.opentelemetry.sdk.trace.SdkTracerProvider import io.opentelemetry.sdk.trace.export.BatchSpanProcessor import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter fun Application.main() { ... // 手动初始化OpenTelemetry val otlpExporter = OtlpGrpcSpanExporter.builder() .setEndpoint("https://otelcol.aspecto.io:4317") .addHeader("Authorization", "<auth-token>") .build() val openTelemetry = OpenTelemetrySdk.builder() .setResource(Resource.getDefault().toBuilder() .put("service.name", "mservice") .build()) .setTracerProvider(SdkTracerProvider.builder() .addSpanProcessor(BatchSpanProcessor.builder(otlpExporter).build()) .build()) .buildAndRegisterGlobal() install(KtorServerTracing) { setOpenTelemetry(openTelemetry) } ... }
- 保留所有相关依赖,确保版本与opentelemetry-bom对齐。
额外检查点
- 查看
application.conf中是否配置了ktor.plugins相关的OpenTelemetry插件,若有需移除避免重复加载 - 确保OpenTelemetry BOM版本与instrumentation版本一致(比如BOM用1.32.0,instrumentation也用1.32.0-alpha),避免版本冲突
内容的提问来源于stack exchange,提问作者500865
相关产品推荐
相关产品推荐

