diff --git a/rbcs-server-otel/build.gradle b/rbcs-server-otel/build.gradle index 2934d10..bc1c046 100644 --- a/rbcs-server-otel/build.gradle +++ b/rbcs-server-otel/build.gradle @@ -19,10 +19,6 @@ configurations { } } - implementation { - extendsFrom bundle - } - release { transitive = false canBeConsumed = true @@ -31,6 +27,19 @@ configurations { } dependencies { + implementation project(':rbcs-common') + + implementation catalog.opentelemetry.netty['4']['1'] + implementation catalog.opentelemetry.sdk.extension.autoconfigure + implementation catalog.opentelemetry.logback.appender['1']['0'] + implementation catalog.opentelemetry.extension.trace.propagators + implementation catalog.opentelemetry.exporter.otlp + implementation catalog.netty.transport + implementation catalog.slf4j.api + + compileOnly catalog.logback.core + compileOnly catalog.logback.classic + bundle catalog.opentelemetry.netty['4']['1'] bundle catalog.opentelemetry.sdk.extension.autoconfigure bundle catalog.opentelemetry.logback.appender['1']['0'] @@ -39,6 +48,7 @@ dependencies { } Provider bundleTask = tasks.register("bundle", Tar) { + from(tasks.named(JavaPlugin.JAR_TASK_NAME)) from(configurations.bundle) group = BasePlugin.BUILD_GROUP } diff --git a/rbcs-server-otel/src/main/java/module-info.java b/rbcs-server-otel/src/main/java/module-info.java new file mode 100644 index 0000000..06534ff --- /dev/null +++ b/rbcs-server-otel/src/main/java/module-info.java @@ -0,0 +1,17 @@ +module net.woggioni.rbcs.server.otel { + requires net.woggioni.rbcs.common; + requires kotlin.stdlib; + requires io.netty.transport; + requires io.netty.common; + requires io.netty.buffer; + requires org.slf4j; + + + requires ch.qos.logback.core; + requires ch.qos.logback.classic; + requires io.opentelemetry.api; + requires io.opentelemetry.instrumentation.netty_4_1; + requires io.opentelemetry.sdk.autoconfigure; + requires io.opentelemetry.instrumentation.logback_appender_1_0; + requires io.opentelemetry.extension.trace.propagation; +} diff --git a/rbcs-server-otel/src/main/kotlin/net/woggioni/rbcs/server/otel/OtelSdkIntegration.kt b/rbcs-server-otel/src/main/kotlin/net/woggioni/rbcs/server/otel/OtelSdkIntegration.kt new file mode 100644 index 0000000..edc5479 --- /dev/null +++ b/rbcs-server-otel/src/main/kotlin/net/woggioni/rbcs/server/otel/OtelSdkIntegration.kt @@ -0,0 +1,50 @@ +package net.woggioni.rbcs.server.otel + +import io.netty.channel.ChannelHandler +import io.opentelemetry.api.GlobalOpenTelemetry +import io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender +import io.opentelemetry.instrumentation.netty.v4_1.NettyServerTelemetry +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk +import net.woggioni.rbcs.common.createLogger +import net.woggioni.rbcs.common.info + +object OtelSdkIntegration { + + private val log = createLogger() + + private val appenderAvailable: Boolean by lazy { + runCatching { + Class.forName("io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender") + }.fold( + onSuccess = { true }, + onFailure = { + log.info { "OpenTelemetry logback appender not on classpath" } + false + }, + ) + } + + fun initialize() { + log.info { "Initializing OpenTelemetry SDK with auto-configuration" } + + val sdk = AutoConfiguredOpenTelemetrySdk.builder() + .setResultAsGlobal() + .build() + .openTelemetrySdk + + if (appenderAvailable) { + runCatching { + OpenTelemetryAppender.install(sdk) + log.info { "OpenTelemetry logback appender installed" } + }.onFailure { ex -> + val msg = ex.localizedMessage ?: ex.javaClass.name + log.info { "Failed to install OpenTelemetry logback appender: $msg" } + } + } + log.info { "OpenTelemetry SDK initialized successfully" } + } + + fun createHandler(): ChannelHandler { + return NettyServerTelemetry.create(GlobalOpenTelemetry.get()).createCombinedHandler() + } +} diff --git a/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/otel/OtelSdkIntegration.kt b/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/otel/OtelSdkIntegration.kt index b2f792b..d212eaa 100644 --- a/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/otel/OtelSdkIntegration.kt +++ b/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/otel/OtelSdkIntegration.kt @@ -3,6 +3,7 @@ package net.woggioni.rbcs.server.otel import io.netty.channel.ChannelHandler import io.opentelemetry.api.GlobalOpenTelemetry import io.opentelemetry.instrumentation.netty.v4_1.NettyServerTelemetry +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk import net.woggioni.rbcs.common.createLogger import net.woggioni.rbcs.common.info @@ -25,10 +26,7 @@ object OtelSdkIntegration { fun initialize() { log.info { "Initializing OpenTelemetry SDK with auto-configuration" } - val sdk = io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk.builder() - .setResultAsGlobal() - .build() - .openTelemetrySdk + val sdk = AutoConfiguredOpenTelemetrySdk.initialize().openTelemetrySdk if (appenderAvailable) { runCatching {