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

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:

  1. 移除App.kt中手动安装插件的代码块:
// 删掉这段代码
install(KtorServerTracing) {
    setOpenTelemetry(GlobalOpenTelemetry.get())
}
  1. 调整依赖,移除手动的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")
    ...
}
  1. 确保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实例:

  1. 移除JVM参数中的-javaagent配置:
applicationDefaultJvmArgs = listOf(
    "-Dotel.service.name=mservice"
    // 删掉这行:"-javaagent:$buildDir/otel/otel-javaagent.jar",
)
  1. 保留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)
    }

    ...
}
  1. 保留所有相关依赖,确保版本与opentelemetry-bom对齐。

额外检查点

  • 查看application.conf中是否配置了ktor.plugins相关的OpenTelemetry插件,若有需移除避免重复加载
  • 确保OpenTelemetry BOM版本与instrumentation版本一致(比如BOM用1.32.0,instrumentation也用1.32.0-alpha),避免版本冲突

内容的提问来源于stack exchange,提问作者500865

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:34:53