From 1d938b7ea3d57b3cad361c5669e785d5968be3db Mon Sep 17 00:00:00 2001 From: Walter Oggioni Date: Wed, 29 Apr 2026 02:50:55 +0800 Subject: [PATCH] Add optional OpenTelemetry Netty server instrumentation - Update lys.version to 2026.04.14 - Add optional compileOnly dependency on opentelemetry-netty-4.1 in rbcs-server - Add runtime guard to only activate instrumentation when OTel classes are on classpath - Insert OTel combined handler after HttpServerCodec in the Netty pipeline - Add requires-static JPMS directives for optional module support --- .gitea/workflows/build-dev.yaml | 12 ++++ .gitea/workflows/build.yaml | 13 ++++ .gitignore | 5 ++ doc/server_configuration.md | 2 + docker/Dockerfile | 12 ++++ docker/build.gradle | 1 + gradle.properties | 2 +- .../net/woggioni/rbcs/api/Configuration.java | 7 +- rbcs-cli/build.gradle | 11 ++-- .../graal/GraalNativeImageConfiguration.kt | 3 +- rbcs-server-otel/build.gradle | 60 +++++++++++++++++ rbcs-server/build.gradle | 5 ++ rbcs-server/src/main/java/module-info.java | 5 ++ .../rbcs/server/RemoteBuildCacheServer.kt | 65 ++++++++----------- .../rbcs/server/configuration/Parser.kt | 3 + .../rbcs/server/configuration/Serializer.kt | 1 + .../rbcs/server/otel/OtelSdkIntegration.kt | 51 +++++++++++++++ .../net/woggioni/rbcs/server/rbcs-default.xml | 3 +- .../rbcs/server/schema/rbcs-server.xsd | 8 +++ .../test/AbstractBasicAuthServerTest.kt | 1 + .../rbcs/server/test/AbstractTlsServerTest.kt | 4 +- .../rbcs/server/test/NoAuthServerTest.kt | 3 +- .../rbcs/server/test/valid/rbcs-default.xml | 3 +- settings.gradle | 1 + 24 files changed, 230 insertions(+), 51 deletions(-) create mode 100644 rbcs-server-otel/build.gradle create mode 100644 rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/otel/OtelSdkIntegration.kt diff --git a/.gitea/workflows/build-dev.yaml b/.gitea/workflows/build-dev.yaml index 8640cbf..c58f88c 100644 --- a/.gitea/workflows/build-dev.yaml +++ b/.gitea/workflows/build-dev.yaml @@ -58,6 +58,18 @@ jobs: tags: | gitea.woggioni.net/woggioni/rbcs:dev-redis target: release-redis + - + name: Build rbcs full Docker image + uses: docker/build-push-action@v5.3.0 + with: + builder: "multiplatform-builder" + context: "docker/build/docker" + platforms: linux/amd64,linux/arm64 + push: true + pull: true + tags: | + gitea.woggioni.net/woggioni/rbcs:dev-full + target: release-full - name: Build rbcs native Docker image uses: docker/build-push-action@v5.3.0 diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index 49eda0d..885d195 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -61,6 +61,19 @@ jobs: gitea.woggioni.net/woggioni/rbcs:redis gitea.woggioni.net/woggioni/rbcs:${{ steps.retrieve-version.outputs.VERSION }}-redis target: release-redis + - + name: Build rbcs full Docker image + uses: docker/build-push-action@v5.3.0 + with: + builder: "multiplatform-builder" + context: "docker/build/docker" + platforms: linux/amd64,linux/arm64 + push: true + pull: true + tags: | + gitea.woggioni.net/woggioni/rbcs:full + gitea.woggioni.net/woggioni/rbcs:${{ steps.retrieve-version.outputs.VERSION }}-full + target: release-full - name: Build rbcs native Docker image uses: docker/build-push-action@v5.3.0 diff --git a/.gitignore b/.gitignore index c268a30..7c36b3d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,8 @@ build rbcs-cli/native-image/*.json + +# Ignore JDTLS files +.classpath +.project +.settings diff --git a/doc/server_configuration.md b/doc/server_configuration.md index 1874fc8..1d5ca78 100644 --- a/doc/server_configuration.md +++ b/doc/server_configuration.md @@ -5,6 +5,7 @@ The root element that contains all server configuration. **Attributes:** - `path` (optional): URI path prefix for cache requests. Example: if set to "cache", requests would be made to "http://www.example.com/cache/KEY" +- `enable-telemetry` (optional): If set to "true" it will enable opentelemetry integration (you will need to make sure the `rbcs-server-otel` has been unpacked in the `plugins` folder) #### Child Elements @@ -139,6 +140,7 @@ Configures TLS encryption. diff --git a/docker/Dockerfile b/docker/Dockerfile index 23b391f..5a3fb41 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -29,6 +29,18 @@ ADD logback.xml /etc/rbcs/logback.xml ENV RBCS_CONFIGURATION_DIR="/etc/rbcs" ENTRYPOINT ["java", "-Dlogback.configurationFile=/etc/rbcs/logback.xml", "-XX:MaxRAMPercentage=70", "-XX:GCTimeRatio=24", "-XX:+UseZGC", "-jar", "/var/lib/rbcs/rbcs.jar"] +FROM base-release AS release-full +ADD --chown=rbcs:rbcs rbcs-cli-envelope-*.jar rbcs.jar +RUN mkdir plugins +WORKDIR /var/lib/rbcs/plugins +RUN --mount=type=bind,source=.,target=/build/distributions tar -xf /build/distributions/rbcs-server-memcache*.tar +RUN --mount=type=bind,source=.,target=/build/distributions tar -xf /build/distributions/rbcs-server-redis*.tar +RUN --mount=type=bind,source=.,target=/build/distributions tar -xf /build/distributions/rbcs-server-otel*.tar +WORKDIR /var/lib/rbcs +ADD logback.xml /etc/rbcs/logback.xml +ENV RBCS_CONFIGURATION_DIR="/etc/rbcs" +ENTRYPOINT ["java", "-Dlogback.configurationFile=/etc/rbcs/logback.xml", "-XX:MaxRAMPercentage=70", "-XX:GCTimeRatio=24", "-XX:+UseZGC", "-jar", "/var/lib/rbcs/rbcs.jar"] + FROM busybox:musl AS base-native RUN mkdir -p /var/lib/rbcs /var/tmp/rbcs /etc/rbcs RUN adduser -D -u 1000 rbcs -h /var/lib/rbcs diff --git a/docker/build.gradle b/docker/build.gradle index f08e848..2b98364 100644 --- a/docker/build.gradle +++ b/docker/build.gradle @@ -21,6 +21,7 @@ dependencies { docker project(path: ':rbcs-cli', configuration: 'release') docker project(path: ':rbcs-server-memcache', configuration: 'release') docker project(path: ':rbcs-server-redis', configuration: 'release') + docker project(path: ':rbcs-server-otel', configuration: 'release') } Provider cleanTaskProvider = tasks.named(BasePlugin.CLEAN_TASK_NAME) {} diff --git a/gradle.properties b/gradle.properties index 2ef0284..f4ced78 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.caching=true rbcs.version = 0.5.0 -lys.version = 2026.03.26 +lys.version = 2026.04.28 gitea.maven.url = https://gitea.woggioni.net/api/packages/woggioni/maven docker.registry.url=gitea.woggioni.net diff --git a/rbcs-api/src/main/java/net/woggioni/rbcs/api/Configuration.java b/rbcs-api/src/main/java/net/woggioni/rbcs/api/Configuration.java index 0fe1e73..86cc4b7 100644 --- a/rbcs-api/src/main/java/net/woggioni/rbcs/api/Configuration.java +++ b/rbcs-api/src/main/java/net/woggioni/rbcs/api/Configuration.java @@ -18,10 +18,11 @@ import java.util.stream.Collectors; public class Configuration { String host; int port; + String serverPath; boolean proxyProtocolEnabled; List trustedProxyIPs; + boolean enableTelemetry; int incomingConnectionsBacklogSize; - String serverPath; @NonNull EventExecutor eventExecutor; @NonNull @@ -150,6 +151,7 @@ public class Configuration { } public static Configuration of( + boolean enableTelemetry, String host, int port, boolean proxyProtocolEnabled, @@ -168,10 +170,11 @@ public class Configuration { return new Configuration( host, port, + serverPath != null && !serverPath.isEmpty() && !serverPath.equals("/") ? serverPath : null, proxyProtocolEnabled, trustedProxyIPs, + enableTelemetry, incomingConnectionsBacklogSize, - serverPath != null && !serverPath.isEmpty() && !serverPath.equals("/") ? serverPath : null, eventExecutor, rateLimiter, connection, diff --git a/rbcs-cli/build.gradle b/rbcs-cli/build.gradle index e804bcb..700efd4 100644 --- a/rbcs-cli/build.gradle +++ b/rbcs-cli/build.gradle @@ -30,7 +30,6 @@ configurations { transitive = false canBeConsumed = true canBeResolved = true - visible = true } configureNativeImageImplementation { @@ -51,6 +50,7 @@ dependencies { configureNativeImageImplementation project configureNativeImageImplementation project(':rbcs-server-memcache') configureNativeImageImplementation project(':rbcs-server-redis') +// configureNativeImageImplementation project(':rbcs-server-otel') implementation catalog.jwo implementation catalog.slf4j.api @@ -59,9 +59,7 @@ dependencies { implementation project(':rbcs-client') implementation project(':rbcs-server') -// runtimeOnly catalog.slf4j.jdk14 runtimeOnly catalog.logback.classic -// runtimeOnly catalog.slf4j.simple nativeImage project(':rbcs-server-memcache') nativeImage project(':rbcs-server-redis') @@ -142,7 +140,12 @@ Provider jlinkTaskProvider = tasks.named(JlinkPlugin.JLINK_TASK_NAME, 'net.woggioni.rbcs.server.memcache', 'net.woggioni.rbcs.server.redis', 'ch.qos.logback.classic', - 'jdk.crypto.ec' + 'jdk.crypto.ec', +// 'io.opentelemetry.api', +// 'io.opentelemetry.instrumentation.netty_4_1', +// 'io.opentelemetry.sdk.autoconfigure', +// 'io.opentelemetry.instrumentation.logback_appender_1_0', +// 'io.opentelemetry.extension.trace.propagation' ] compressionLevel = 2 stripDebug = false diff --git a/rbcs-cli/src/configureNativeImage/kotlin/net/woggioni/rbcs/cli/graal/GraalNativeImageConfiguration.kt b/rbcs-cli/src/configureNativeImage/kotlin/net/woggioni/rbcs/cli/graal/GraalNativeImageConfiguration.kt index fcc3343..e99afa8 100644 --- a/rbcs-cli/src/configureNativeImage/kotlin/net/woggioni/rbcs/cli/graal/GraalNativeImageConfiguration.kt +++ b/rbcs-cli/src/configureNativeImage/kotlin/net/woggioni/rbcs/cli/graal/GraalNativeImageConfiguration.kt @@ -120,10 +120,11 @@ object GraalNativeImageConfiguration { val serverConfiguration = Configuration( "127.0.0.1", serverPort, + null, false, emptyList(), + false, 100, - null, Configuration.EventExecutor(true), Configuration.RateLimiter( false, 0x100000, 10 diff --git a/rbcs-server-otel/build.gradle b/rbcs-server-otel/build.gradle new file mode 100644 index 0000000..2934d10 --- /dev/null +++ b/rbcs-server-otel/build.gradle @@ -0,0 +1,60 @@ +plugins { + id 'java-library' + id 'maven-publish' + alias catalog.plugins.kotlin.jvm +} + +configurations { + bundle { + canBeResolved = true + canBeConsumed = false + transitive = true + + resolutionStrategy { + dependencies { + exclude group: 'org.slf4j', module: 'slf4j-api' + exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib' + exclude group: 'org.jetbrains', module: 'annotations' + } + } + } + + implementation { + extendsFrom bundle + } + + release { + transitive = false + canBeConsumed = true + canBeResolved = true + } +} + +dependencies { + bundle catalog.opentelemetry.netty['4']['1'] + bundle catalog.opentelemetry.sdk.extension.autoconfigure + bundle catalog.opentelemetry.logback.appender['1']['0'] + bundle catalog.opentelemetry.extension.trace.propagators + bundle catalog.opentelemetry.exporter.otlp +} + +Provider bundleTask = tasks.register("bundle", Tar) { + from(configurations.bundle) + group = BasePlugin.BUILD_GROUP +} + +tasks.named(BasePlugin.ASSEMBLE_TASK_NAME) { + dependsOn(bundleTask) +} + +artifacts { + release(bundleTask) +} + +publishing { + publications { + maven(MavenPublication) { + artifact bundleTask + } + } +} diff --git a/rbcs-server/build.gradle b/rbcs-server/build.gradle index 91e5eb9..640fbc5 100644 --- a/rbcs-server/build.gradle +++ b/rbcs-server/build.gradle @@ -13,6 +13,11 @@ dependencies { implementation catalog.netty.buffer implementation catalog.netty.transport implementation catalog.netty.codec.haproxy + compileOnly catalog.opentelemetry.netty['4']['1'] + compileOnly catalog.opentelemetry.sdk.extension.autoconfigure + compileOnly catalog.opentelemetry.logback.appender['1']['0'] + compileOnly catalog.opentelemetry.extension.trace.propagators + compileOnly catalog.logback.classic api project(':rbcs-common') api project(':rbcs-api') diff --git a/rbcs-server/src/main/java/module-info.java b/rbcs-server/src/main/java/module-info.java index 627df67..9aaf4c1 100644 --- a/rbcs-server/src/main/java/module-info.java +++ b/rbcs-server/src/main/java/module-info.java @@ -17,6 +17,11 @@ module net.woggioni.rbcs.server { requires io.netty.common; requires io.netty.codec; requires io.netty.codec.haproxy; + requires static io.opentelemetry.api; + requires static io.opentelemetry.instrumentation.netty_4_1; + requires static io.opentelemetry.sdk.autoconfigure; + requires static io.opentelemetry.instrumentation.logback_appender_1_0; + requires static io.opentelemetry.extension.trace.propagation; requires org.slf4j; exports net.woggioni.rbcs.server; diff --git a/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/RemoteBuildCacheServer.kt b/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/RemoteBuildCacheServer.kt index e3d76f0..3cd454e 100644 --- a/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/RemoteBuildCacheServer.kt +++ b/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/RemoteBuildCacheServer.kt @@ -2,16 +2,8 @@ package net.woggioni.rbcs.server import io.netty.bootstrap.ServerBootstrap import io.netty.buffer.ByteBuf -import io.netty.channel.Channel -import io.netty.channel.ChannelFactory -import io.netty.channel.ChannelFuture +import io.netty.channel.* import io.netty.channel.ChannelHandler.Sharable -import io.netty.channel.ChannelHandlerContext -import io.netty.channel.ChannelInboundHandlerAdapter -import io.netty.channel.ChannelInitializer -import io.netty.channel.ChannelOption -import io.netty.channel.ChannelPromise -import io.netty.channel.MultiThreadIoEventLoopGroup import io.netty.channel.nio.NioIoHandler import io.netty.channel.socket.DatagramChannel import io.netty.channel.socket.ServerSocketChannel @@ -21,12 +13,7 @@ import io.netty.channel.socket.nio.NioServerSocketChannel import io.netty.channel.socket.nio.NioSocketChannel import io.netty.handler.codec.compression.CompressionOptions import io.netty.handler.codec.haproxy.HAProxyMessageDecoder -import io.netty.handler.codec.http.DefaultHttpContent -import io.netty.handler.codec.http.HttpContentCompressor -import io.netty.handler.codec.http.HttpDecoderConfig -import io.netty.handler.codec.http.HttpHeaderNames -import io.netty.handler.codec.http.HttpRequest -import io.netty.handler.codec.http.HttpServerCodec +import io.netty.handler.codec.http.* import io.netty.handler.ssl.ClientAuth import io.netty.handler.ssl.SslContext import io.netty.handler.ssl.SslContextBuilder @@ -37,37 +24,15 @@ import io.netty.handler.timeout.IdleStateEvent import io.netty.handler.timeout.IdleStateHandler import io.netty.util.AttributeKey import io.netty.util.concurrent.EventExecutorGroup -import java.io.OutputStream -import java.net.InetSocketAddress -import java.nio.file.Files -import java.nio.file.Path -import java.security.PrivateKey -import java.security.cert.X509Certificate -import java.time.Duration -import java.time.Instant -import java.util.Arrays -import java.util.Base64 -import java.util.concurrent.CompletableFuture -import java.util.concurrent.Future -import java.util.concurrent.TimeUnit -import java.util.concurrent.TimeoutException -import java.util.regex.Matcher -import java.util.regex.Pattern -import javax.naming.ldap.LdapName -import javax.net.ssl.SSLPeerUnverifiedException import net.woggioni.rbcs.api.AsyncCloseable import net.woggioni.rbcs.api.Configuration import net.woggioni.rbcs.api.exception.ConfigurationException -import net.woggioni.rbcs.common.Cidr +import net.woggioni.rbcs.common.* import net.woggioni.rbcs.common.PasswordSecurity.decodePasswordHash import net.woggioni.rbcs.common.PasswordSecurity.hashPassword import net.woggioni.rbcs.common.RBCS.getTrustManager import net.woggioni.rbcs.common.RBCS.loadKeystore import net.woggioni.rbcs.common.RBCS.toUrl -import net.woggioni.rbcs.common.Xml -import net.woggioni.rbcs.common.createLogger -import net.woggioni.rbcs.common.debug -import net.woggioni.rbcs.common.info import net.woggioni.rbcs.server.auth.AbstractNettyHttpAuthenticator import net.woggioni.rbcs.server.auth.Authorizer import net.woggioni.rbcs.server.auth.RoleAuthorizer @@ -78,8 +43,26 @@ import net.woggioni.rbcs.server.handler.MaxRequestSizeHandler import net.woggioni.rbcs.server.handler.ProxyProtocolHandler import net.woggioni.rbcs.server.handler.ReadTriggerDuplexHandler import net.woggioni.rbcs.server.handler.ServerHandler +import net.woggioni.rbcs.server.otel.OtelSdkIntegration import net.woggioni.rbcs.server.throttling.BucketManager import net.woggioni.rbcs.server.throttling.ThrottlingHandler +import java.io.OutputStream +import java.net.InetSocketAddress +import java.nio.file.Files +import java.nio.file.Path +import java.security.PrivateKey +import java.security.cert.X509Certificate +import java.time.Duration +import java.time.Instant +import java.util.* +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Future +import java.util.concurrent.TimeUnit +import java.util.concurrent.TimeoutException +import java.util.regex.Matcher +import java.util.regex.Pattern +import javax.naming.ldap.LdapName +import javax.net.ssl.SSLPeerUnverifiedException class RemoteBuildCacheServer(private val cfg: Configuration) { @@ -431,6 +414,9 @@ class RemoteBuildCacheServer(private val cfg: Configuration) { maxChunkSize = cfg.connection.chunkSize } pipeline.addLast(HttpServerCodec(httpDecoderConfig)) + if(cfg.isEnableTelemetry) { + OtelSdkIntegration.createHandler().let { pipeline.addLast(it) } + } pipeline.addLast(ReadTriggerDuplexHandler.NAME, ReadTriggerDuplexHandler()) pipeline.addLast(MaxRequestSizeHandler.NAME, MaxRequestSizeHandler(cfg.connection.maxRequestSize)) pipeline.addLast(HttpChunkContentCompressor(1024)) @@ -525,6 +511,9 @@ class RemoteBuildCacheServer(private val cfg: Configuration) { } fun run(): ServerHandle { + if(cfg.isEnableTelemetry) { + OtelSdkIntegration.initialize() + } // Create the multithreaded event loops for the server val bossGroup = MultiThreadIoEventLoopGroup(1, NioIoHandler.newFactory()) val channelFactory = ChannelFactory { NioSocketChannel() } diff --git a/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/configuration/Parser.kt b/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/configuration/Parser.kt index f1ac5c6..355fc6e 100644 --- a/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/configuration/Parser.kt +++ b/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/configuration/Parser.kt @@ -46,6 +46,8 @@ object Parser { var groups = emptyMap() var tls: Tls? = null val serverPath = root.renderAttribute("path") + var enableTelemetry = root.renderAttribute("enable-telemetry") + ?.let(String::toBoolean) ?: false var incomingConnectionsBacklogSize = 1024 var authentication: Authentication? = null for (child in root.asIterable()) { @@ -233,6 +235,7 @@ object Parser { } } return Configuration.of( + enableTelemetry, host, port, proxyProtocolEnabled, diff --git a/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/configuration/Serializer.kt b/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/configuration/Serializer.kt index 67e78d3..f7506fb 100644 --- a/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/configuration/Serializer.kt +++ b/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/configuration/Serializer.kt @@ -29,6 +29,7 @@ object Serializer { ?.let { serverPath -> attr("path", serverPath) } + attr("enable-telemetry", conf.isEnableTelemetry.toString()) node("bind") { attr("host", conf.host) attr("port", conf.port.toString()) 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 new file mode 100644 index 0000000..b2f792b --- /dev/null +++ b/rbcs-server/src/main/kotlin/net/woggioni/rbcs/server/otel/OtelSdkIntegration.kt @@ -0,0 +1,51 @@ +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 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 = io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk.builder() + .setResultAsGlobal() + .build() + .openTelemetrySdk + + if (appenderAvailable) { + runCatching { + val clazz = Class.forName("io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender") + clazz.getMethod("install", Class.forName("io.opentelemetry.api.OpenTelemetry")) + .invoke(null, 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/resources/net/woggioni/rbcs/server/rbcs-default.xml b/rbcs-server/src/main/resources/net/woggioni/rbcs/server/rbcs-default.xml index 6d45ea1..55f3710 100644 --- a/rbcs-server/src/main/resources/net/woggioni/rbcs/server/rbcs-default.xml +++ b/rbcs-server/src/main/resources/net/woggioni/rbcs/server/rbcs-default.xml @@ -2,7 +2,8 @@ + xs:schemaLocation="urn:net.woggioni.rbcs.server jpms://net.woggioni.rbcs.server/net/woggioni/rbcs/server/schema/rbcs-server.xsd" + enable-telemetry="false"> \ No newline at end of file diff --git a/rbcs-server/src/main/resources/net/woggioni/rbcs/server/schema/rbcs-server.xsd b/rbcs-server/src/main/resources/net/woggioni/rbcs/server/schema/rbcs-server.xsd index 65aa616..b4c5399 100644 --- a/rbcs-server/src/main/resources/net/woggioni/rbcs/server/schema/rbcs-server.xsd +++ b/rbcs-server/src/main/resources/net/woggioni/rbcs/server/schema/rbcs-server.xsd @@ -59,6 +59,14 @@ + + + + Enable OpenTelemetry distributed tracing for the server. + Even when enabled, telemetry only activates if OpenTelemetry classes are present on the classpath. + + + diff --git a/rbcs-server/src/test/kotlin/net/woggioni/rbcs/server/test/AbstractBasicAuthServerTest.kt b/rbcs-server/src/test/kotlin/net/woggioni/rbcs/server/test/AbstractBasicAuthServerTest.kt index 31d024c..acb5474 100644 --- a/rbcs-server/src/test/kotlin/net/woggioni/rbcs/server/test/AbstractBasicAuthServerTest.kt +++ b/rbcs-server/src/test/kotlin/net/woggioni/rbcs/server/test/AbstractBasicAuthServerTest.kt @@ -32,6 +32,7 @@ abstract class AbstractBasicAuthServerTest : AbstractServerTest() { override fun setUp() { this.cacheDir = testDir.resolve("cache") cfg = Configuration.of( + false, "127.0.0.1", getFreePort(), false, diff --git a/rbcs-server/src/test/kotlin/net/woggioni/rbcs/server/test/AbstractTlsServerTest.kt b/rbcs-server/src/test/kotlin/net/woggioni/rbcs/server/test/AbstractTlsServerTest.kt index ad8d660..9d376a0 100644 --- a/rbcs-server/src/test/kotlin/net/woggioni/rbcs/server/test/AbstractTlsServerTest.kt +++ b/rbcs-server/src/test/kotlin/net/woggioni/rbcs/server/test/AbstractTlsServerTest.kt @@ -140,11 +140,11 @@ abstract class AbstractTlsServerTest : AbstractServerTest() { cfg = Configuration( "127.0.0.1", getFreePort(), + serverPath, false, emptyList(), - + false, 100, - serverPath, Configuration.EventExecutor(false), Configuration.RateLimiter(true, 0x100000, 50), Configuration.Connection( diff --git a/rbcs-server/src/test/kotlin/net/woggioni/rbcs/server/test/NoAuthServerTest.kt b/rbcs-server/src/test/kotlin/net/woggioni/rbcs/server/test/NoAuthServerTest.kt index d81f4d6..9b72364 100644 --- a/rbcs-server/src/test/kotlin/net/woggioni/rbcs/server/test/NoAuthServerTest.kt +++ b/rbcs-server/src/test/kotlin/net/woggioni/rbcs/server/test/NoAuthServerTest.kt @@ -34,10 +34,11 @@ class NoAuthServerTest : AbstractServerTest() { cfg = Configuration( "127.0.0.1", getFreePort(), + serverPath, false, emptyList(), + false, 100, - serverPath, Configuration.EventExecutor(false), Configuration.RateLimiter(true, 0x100000, 50), Configuration.Connection( diff --git a/rbcs-server/src/test/resources/net/woggioni/rbcs/server/test/valid/rbcs-default.xml b/rbcs-server/src/test/resources/net/woggioni/rbcs/server/test/valid/rbcs-default.xml index 984260c..c36fa12 100644 --- a/rbcs-server/src/test/resources/net/woggioni/rbcs/server/test/valid/rbcs-default.xml +++ b/rbcs-server/src/test/resources/net/woggioni/rbcs/server/test/valid/rbcs-default.xml @@ -1,7 +1,8 @@ + xs:schemaLocation="urn:net.woggioni.rbcs.server jpms://net.woggioni.rbcs.server/net/woggioni/rbcs/server/schema/rbcs-server.xsd" + enable-telemetry="true" path="/my/custom/path"> diff --git a/settings.gradle b/settings.gradle index 7186d54..48c9c24 100644 --- a/settings.gradle +++ b/settings.gradle @@ -33,4 +33,5 @@ include 'rbcs-cli' include 'rbcs-client' include 'rbcs-server' include 'rbcs-servlet' +include 'rbcs-server-otel' include 'docker'