Skip to content

Ktor 3 Sentry OpenTelemetry Agentless ClassNotFoundException #4345

Open
@Ynnck123

Description

@Ynnck123

Environment

SaaS (https://sentry.io/)

Steps to Reproduce

Potentially relevant used plugin versions:

Ktor Server version 3.1.2
Kotlin 2.1.20
Sentry jvm gradle plugin 5.3.0

I added the following to my dependencies { .. } block in my build.gradle.kts

    implementation(platform("io.sentry:sentry-bom:8.8.0"))
    implementation("io.sentry:sentry")
    implementation("io.sentry:sentry-opentelemetry-agentless")

    implementation("io.opentelemetry.instrumentation:opentelemetry-ktor-3.0:2.15.0-alpha")

I start sentry in my Ktor application and then configure the ktor 3 plugin in the following way:

fun Application.configureMonitoring() {

        install(KtorServerTelemetry) {
            val openTelemetry = createOpenTelemetry()
            setOpenTelemetry(openTelemetry)

            attributesExtractor {
                onStart {
                    attributes.put("start-time", Clock.System.now().toEpochMilliseconds())
                }
                onEnd {
                    attributes.put("end-time", Clock.System.now().toEpochMilliseconds())
                }
            }
        }
}

private fun createOpenTelemetry(): OpenTelemetry =
    AutoConfiguredOpenTelemetrySdk.builder().addResourceCustomizer { oldResource, _ ->
        oldResource.toBuilder()
            .putAll(oldResource.attributes)
            .put(ServiceAttributes.SERVICE_NAME, "my-app-backend")
            .build()
    }
        .build()
        .openTelemetrySdk

This was what I came up with based on this Ktor opentelemetry example and the Sentry Agentless Opentelemetry docs.

Expected Result

The app starts and reports the traces to Sentry cloud.

Actual Result

My application doesn't come up, I see the following crash in my logs:

java.lang.ClassNotFoundException: io.opentelemetry.api.incubator.events.EventLoggerProvider
at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk.builder(AutoConfiguredOpenTelemetrySdk.java:44)
at io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk.initialize(AutoConfiguredOpenTelemetrySdk.java:36)
at myktorapp.com.plugins.MonitoringKt.configureMonitoring$lambda$3(Monitoring.kt:28)
at io.ktor.server.application.CreatePluginUtilsKt.createRouteScopedPluginInstance(CreatePluginUtils.kt:277)
at io.ktor.server.application.CreatePluginUtilsKt.access$createRouteScopedPluginInstance(CreatePluginUtils.kt:1)
at io.ktor.server.application.RouteScopedPluginImpl.install(CreatePluginUtils.kt:182)
at io.ktor.server.application.RouteScopedPluginImpl.install(CreatePluginUtils.kt:164)
at io.ktor.server.application.ApplicationPluginKt.install(ApplicationPlugin.kt:121)
at myktorapp.com.plugins.MonitoringKt.configureMonitoring(Monitoring.kt:26)
at myktorapp.com.ApplicationKt.module(Application.kt:51)
        at myktorapp.com.ApplicationKt.module$default(Application.kt:43)
        at myktorapp.com.ApplicationKt.initialize(Application.kt:30)
        at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
        at java.lang.reflect.Method.invoke(Method.java:578)
        at kotlin.reflect.jvm.internal.calls.CallerImpl$Method.callMethod(CallerImpl.kt:97)
        at kotlin.reflect.jvm.internal.calls.CallerImpl$Method$Static.call(CallerImpl.kt:106)
        at kotlin.reflect.jvm.internal.KCallableImpl.callDefaultMethod$kotlin_reflection(KCallableImpl.kt:207)
        at kotlin.reflect.jvm.internal.KCallableImpl.callBy(KCallableImpl.kt:112)
        at io.ktor.server.engine.internal.CallableUtilsKt.callFunctionWithInjection(CallableUtils.kt:127)
        at io.ktor.server.engine.internal.CallableUtilsKt.executeModuleFunction(CallableUtils.kt:40)
        at io.ktor.server.engine.EmbeddedServer.launchModuleByName$lambda$32(EmbeddedServerJvm.kt:422)
        at io.ktor.server.engine.EmbeddedServer.avoidingDoubleStartupFor(EmbeddedServerJvm.kt:446)
        at io.ktor.server.engine.EmbeddedServer.launchModuleByName(EmbeddedServerJvm.kt:421)
        at io.ktor.server.engine.EmbeddedServer.dynamicModule$lambda$26(EmbeddedServerJvm.kt:381)
        at io.ktor.server.engine.EmbeddedServer.instantiateAndConfigureApplication$lambda$25(EmbeddedServerJvm.kt:371)
        at io.ktor.server.engine.EmbeddedServer.avoidingDoubleStartup(EmbeddedServerJvm.kt:428)
        at io.ktor.server.engine.EmbeddedServer.instantiateAndConfigureApplication(EmbeddedServerJvm.kt:370)
        at io.ktor.server.engine.EmbeddedServer.createApplication(EmbeddedServerJvm.kt:171)
        at io.ktor.server.engine.EmbeddedServer.start(EmbeddedServerJvm.kt:301)
        at io.ktor.server.netty.EngineMain.main(EngineMain.kt:25)
        at myktorapp.com.ApplicationKt.main(Application.kt:17)
        java.lang.NoClassDefFoundError: io/opentelemetry/api/incubator/events/EventLoggerProvider
        at io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk.builder(AutoConfiguredOpenTelemetrySdk.java:44)
        at io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk.initialize(AutoConfiguredOpenTelemetrySdk.java:36)
        at myktorapp.com.plugins.MonitoringKt.configureMonitoring$lambda$3(Monitoring.kt:28)
        at io.ktor.server.application.CreatePluginUtilsKt.createRouteScopedPluginInstance(CreatePluginUtils.kt:277)
        at io.ktor.server.application.CreatePluginUtilsKt.access$createRouteScopedPluginInstance(CreatePluginUtils.kt:1)
        at io.ktor.server.application.RouteScopedPluginImpl.install(CreatePluginUtils.kt:182)
        at io.ktor.server.application.RouteScopedPluginImpl.install(CreatePluginUtils.kt:164)
        at io.ktor.server.application.ApplicationPluginKt.install(ApplicationPlugin.kt:121)
        at myktorapp.com.plugins.MonitoringKt.configureMonitoring(Monitoring.kt:26)
        at myktorapp.com.ApplicationKt.module(Application.kt:51)
        at myktorapp.com.ApplicationKt.module$default(Application.kt:43)
        at myktorapp.com.ApplicationKt.initialize(Application.kt:30)
        at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
        at java.lang.reflect.Method.invoke(Method.java:578)
        at kotlin.reflect.jvm.internal.calls.CallerImpl$Method.callMethod(CallerImpl.kt:97)
        at kotlin.reflect.jvm.internal.calls.CallerImpl$Method$Static.call(CallerImpl.kt:106)
        at kotlin.reflect.jvm.internal.KCallableImpl.callDefaultMethod$kotlin_reflection(KCallableImpl.kt:207)
        at kotlin.reflect.jvm.internal.KCallableImpl.callBy(KCallableImpl.kt:112)
        at io.ktor.server.engine.internal.CallableUtilsKt.callFunctionWithInjection(CallableUtils.kt:127)
        at io.ktor.server.engine.internal.CallableUtilsKt.executeModuleFunction(CallableUtils.kt:40)
        at io.ktor.server.engine.EmbeddedServer.launchModuleByName$lambda$32(EmbeddedServerJvm.kt:422)
        at io.ktor.server.engine.EmbeddedServer.avoidingDoubleStartupFor(EmbeddedServerJvm.kt:446)
        at io.ktor.server.engine.EmbeddedServer.launchModuleByName(EmbeddedServerJvm.kt:421)
        at io.ktor.server.engine.EmbeddedServer.dynamicModule$lambda$26(EmbeddedServerJvm.kt:381)
        at io.ktor.server.engine.EmbeddedServer.instantiateAndConfigureApplication$lambda$25(EmbeddedServerJvm.kt:371)
        at io.ktor.server.engine.EmbeddedServer.avoidingDoubleStartup(EmbeddedServerJvm.kt:428)
        at io.ktor.server.engine.EmbeddedServer.instantiateAndConfigureApplication(EmbeddedServerJvm.kt:370)
        at io.ktor.server.engine.EmbeddedServer.createApplication(EmbeddedServerJvm.kt:171)
        at io.ktor.server.engine.EmbeddedServer.start(EmbeddedServerJvm.kt:301)
        at io.ktor.server.netty.EngineMain.main(EngineMain.kt:25)
        at myktorapp.com.ApplicationKt.main(Application.kt:17)

Product Area

Performance

Link

No response

DSN

No response

Version

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions