From 1dcee62c047ce29e577293d43aad19062a5103b6 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Tue, 30 Sep 2025 10:55:25 -0400 Subject: [PATCH 01/11] add example for agent sampler --- .gitignore | 6 +- javaagent-declarative-configuration/README.md | 86 +++++++++++++++++++ .../build.gradle.kts | 20 +++++ .../otel-agent-config.yaml | 40 +++++++++ .../examples/fileconfig/ApiController.java | 21 +++++ .../examples/fileconfig/Application.java | 17 ++++ settings.gradle.kts | 1 + 7 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 javaagent-declarative-configuration/README.md create mode 100644 javaagent-declarative-configuration/build.gradle.kts create mode 100644 javaagent-declarative-configuration/otel-agent-config.yaml create mode 100644 javaagent-declarative-configuration/src/main/java/io/opentelemetry/examples/fileconfig/ApiController.java create mode 100644 javaagent-declarative-configuration/src/main/java/io/opentelemetry/examples/fileconfig/Application.java diff --git a/.gitignore b/.gitignore index b29e8f003..44a205d8f 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,8 @@ bin .swp # Polyglot runtime manager (asdf rust clone) -.rtx.toml \ No newline at end of file +.rtx.toml + + +javaagent-declarative-configuration/opentelemetry-javaagent.jar +javaagent-declarative-configuration/opentelemetry-javaagent-extension.jar \ No newline at end of file diff --git a/javaagent-declarative-configuration/README.md b/javaagent-declarative-configuration/README.md new file mode 100644 index 000000000..22e080b68 --- /dev/null +++ b/javaagent-declarative-configuration/README.md @@ -0,0 +1,86 @@ +# Java Agent Declarative Configuration Example + +This example demonstrates how to use [declarative configuration](https://opentelemetry.io/docs/specs/otel/configuration/#declarative-configuration) with the OpenTelemetry Java Agent to configure tracing behavior. + +The configuration file is located at [otel-agent-config.yaml](./otel-agent-config.yaml). + +This Spring Boot application includes two endpoints: +- `/actuator/health` - A health check endpoint (from Spring Boot Actuator) that is configured to be excluded from tracing +- `/api/example` - A simple API endpoint that will be traced normally + +## End-to-End Instructions + +### Prerequisites +* Java 17 or higher +* OpenTelemetry Java Agent JAR file (see next step) +* OpenTelemetry contrib extension JAR file for rule-based sampling (see next step) + +Download the OpenTelemetry Java Agent and contrib extension: +```bash +# Download the latest OpenTelemetry Java Agent +curl -L -o opentelemetry-javaagent.jar https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar + +# Download the OpenTelemetry contrib extension for rule-based sampling +curl -L -o opentelemetry-javaagent-extension.jar https://repo1.maven.org/maven2/io/opentelemetry/contrib/opentelemetry-samplers/1.50.0-alpha/opentelemetry-samplers-1.50.0-alpha.jar +``` + +### Step 1: Build the Application + +```bash +# Build the JAR - Run from the javaagent-declarative-configuration directory +../gradlew bootJar +``` + +### Step 2: Run with OpenTelemetry Java Agent + +```bash +# From the javaagent-declarative-configuration directory + +# Run with the OpenTelemetry Java Agent and contrib extension +java -javaagent:opentelemetry-javaagent.jar \ + -Dotel.javaagent.extensions=opentelemetry-javaagent-extension.jar \ + -Dotel.experimental.config.file=$(pwd)/otel-agent-config.yaml \ + -jar build/libs/javaagent-declarative-configuration.jar +``` + +### Step 3: Test the Endpoints + +Open a new terminal and test both endpoints: + +```bash +# This endpoint will NOT be traced (excluded by configuration) +curl http://localhost:8080/actuator/health + +# This endpoint WILL be traced normally +curl http://localhost:8080/api/example +``` + +### Step 4: Verify Tracing Behavior + +Check the application logs to see: +- Health check requests (`/actuator/health`) should NOT generate traces (excluded by configuration) +- API requests (`/api/example`) should generate traces with console output + +## Configuration + +The `otel-agent-config.yaml` file demonstrates rule-based sampling using declarative configuration to exclude health checks from tracing: + +```yaml +tracer_provider: + sampler: + rule_based_routing: + fallback_sampler: + always_on: + span_kind: SERVER + rules: + - action: DROP + attribute: url.path + pattern: /actuator.* +``` + +This configuration: +- Uses the `rule_based_routing` sampler from the OpenTelemetry contrib extension +- Excludes health check endpoints (`/actuator.*`) from tracing using the `DROP` action +- Samples all other requests using the `always_on` fallback sampler +- Only applies to `SERVER` span kinds +- Requires the OpenTelemetry contrib extension JAR to be loaded diff --git a/javaagent-declarative-configuration/build.gradle.kts b/javaagent-declarative-configuration/build.gradle.kts new file mode 100644 index 000000000..c11f9c589 --- /dev/null +++ b/javaagent-declarative-configuration/build.gradle.kts @@ -0,0 +1,20 @@ +import org.springframework.boot.gradle.plugin.SpringBootPlugin +import org.springframework.boot.gradle.tasks.bundling.BootJar + +plugins { + id("java") + id("org.springframework.boot") version "3.5.6" +} + +description = "OpenTelemetry Java Agent Declarative Configuration Example" +val moduleName by extra { "io.opentelemetry.examples.javaagent.declarative" } + +dependencies { + implementation(platform(SpringBootPlugin.BOM_COORDINATES)) + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-actuator") +} + +tasks.named("bootJar") { + archiveFileName = "javaagent-declarative-configuration.jar" +} diff --git a/javaagent-declarative-configuration/otel-agent-config.yaml b/javaagent-declarative-configuration/otel-agent-config.yaml new file mode 100644 index 000000000..8ef9c8eba --- /dev/null +++ b/javaagent-declarative-configuration/otel-agent-config.yaml @@ -0,0 +1,40 @@ +# See https://github.com/open-telemetry/opentelemetry-configuration for details on schema and examples + +file_format: "1.0-rc.1" + +resource: + attributes: + - name: service.name + value: spring-boot-declarative-config-example + +propagator: + composite: + - tracecontext: + - baggage: + +tracer_provider: + processors: + - batch: + exporter: + console: + # Configure sampling to exclude health check endpoints + sampler: + rule_based_routing: + fallback_sampler: + always_on: + # Filter to spans of this span_kind. Must be one of: SERVER, CLIENT, INTERNAL, CONSUMER, PRODUCER. + span_kind: SERVER # only apply to server spans + # List of rules describing spans to drop. Spans are dropped if they match one of the rules. + rules: + # The action to take when the rule is matches. Must be of: DROP, RECORD_AND_SAMPLE. + - action: DROP + # The span attribute to match against. + attribute: url.path + # The pattern to compare the span attribute to. + pattern: /actuator.* + +meter_provider: + readers: + - periodic: + exporter: + console: \ No newline at end of file diff --git a/javaagent-declarative-configuration/src/main/java/io/opentelemetry/examples/fileconfig/ApiController.java b/javaagent-declarative-configuration/src/main/java/io/opentelemetry/examples/fileconfig/ApiController.java new file mode 100644 index 000000000..e9c3d43c1 --- /dev/null +++ b/javaagent-declarative-configuration/src/main/java/io/opentelemetry/examples/fileconfig/ApiController.java @@ -0,0 +1,21 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.examples.fileconfig; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api") +public class ApiController { + + @GetMapping("/example") + public ResponseEntity example() { + return ResponseEntity.ok("Hello from OpenTelemetry example API!"); + } +} diff --git a/javaagent-declarative-configuration/src/main/java/io/opentelemetry/examples/fileconfig/Application.java b/javaagent-declarative-configuration/src/main/java/io/opentelemetry/examples/fileconfig/Application.java new file mode 100644 index 000000000..7987bb5c7 --- /dev/null +++ b/javaagent-declarative-configuration/src/main/java/io/opentelemetry/examples/fileconfig/Application.java @@ -0,0 +1,17 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.examples.fileconfig; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index b52a946bd..3ca4fda9a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -26,6 +26,7 @@ rootProject.name = "opentelemetry-java-examples" include( ":opentelemetry-examples-autoconfigure", ":opentelemetry-examples-declarative-configuration", + ":opentelemetry-examples-javaagent-declarative-configuration", ":opentelemetry-examples-http", ":opentelemetry-examples-jaeger", ":opentelemetry-examples-javaagent", From b20b8c4ce34423c6c938bc2ff86841b983201d07 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Tue, 30 Sep 2025 11:08:43 -0400 Subject: [PATCH 02/11] update extension approach --- javaagent-declarative-configuration/README.md | 15 +++++++++------ .../build.gradle.kts | 13 +++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/javaagent-declarative-configuration/README.md b/javaagent-declarative-configuration/README.md index 22e080b68..b84c318c2 100644 --- a/javaagent-declarative-configuration/README.md +++ b/javaagent-declarative-configuration/README.md @@ -13,17 +13,20 @@ This Spring Boot application includes two endpoints: ### Prerequisites * Java 17 or higher * OpenTelemetry Java Agent JAR file (see next step) -* OpenTelemetry contrib extension JAR file for rule-based sampling (see next step) -Download the OpenTelemetry Java Agent and contrib extension: +Download the OpenTelemetry Java Agent: ```bash # Download the latest OpenTelemetry Java Agent curl -L -o opentelemetry-javaagent.jar https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar - -# Download the OpenTelemetry contrib extension for rule-based sampling -curl -L -o opentelemetry-javaagent-extension.jar https://repo1.maven.org/maven2/io/opentelemetry/contrib/opentelemetry-samplers/1.50.0-alpha/opentelemetry-samplers-1.50.0-alpha.jar ``` +The OpenTelemetry contrib extension will be automatically downloaded during the build process. + +**Note:** If you prefer to download the extension manually or need a different version, you can: +1. Find the latest version at [Maven Central](https://mvnrepository.com/artifact/io.opentelemetry.contrib/opentelemetry-samplers) +2. Download it with: `curl -L -o opentelemetry-javaagent-extension.jar https://repo1.maven.org/maven2/io/opentelemetry/contrib/opentelemetry-samplers/[VERSION]/opentelemetry-samplers-[VERSION].jar` +3. Reference it in the run command: `-Dotel.javaagent.extensions=opentelemetry-javaagent-extension.jar` + ### Step 1: Build the Application ```bash @@ -38,7 +41,7 @@ curl -L -o opentelemetry-javaagent-extension.jar https://repo1.maven.org/maven2/ # Run with the OpenTelemetry Java Agent and contrib extension java -javaagent:opentelemetry-javaagent.jar \ - -Dotel.javaagent.extensions=opentelemetry-javaagent-extension.jar \ + -Dotel.javaagent.extensions=build/agent/opentelemetry-javaagent-extension.jar \ -Dotel.experimental.config.file=$(pwd)/otel-agent-config.yaml \ -jar build/libs/javaagent-declarative-configuration.jar ``` diff --git a/javaagent-declarative-configuration/build.gradle.kts b/javaagent-declarative-configuration/build.gradle.kts index c11f9c589..b5e8c2e4a 100644 --- a/javaagent-declarative-configuration/build.gradle.kts +++ b/javaagent-declarative-configuration/build.gradle.kts @@ -9,12 +9,25 @@ plugins { description = "OpenTelemetry Java Agent Declarative Configuration Example" val moduleName by extra { "io.opentelemetry.examples.javaagent.declarative" } +val extension = configurations.create("extension") + dependencies { implementation(platform(SpringBootPlugin.BOM_COORDINATES)) implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-actuator") + + extension("io.opentelemetry.contrib:opentelemetry-samplers:1.50.0-alpha") { + isTransitive = false + } +} + +val copyExtension = tasks.register("copyExtension") { + from(extension.singleFile) + into(layout.buildDirectory.dir("agent")) + rename(".*\\.jar", "opentelemetry-javaagent-extension.jar") } tasks.named("bootJar") { + dependsOn(copyExtension) archiveFileName = "javaagent-declarative-configuration.jar" } From 820413a90f6311c9c90aaaa5416d9c483e33e84d Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Tue, 30 Sep 2025 11:09:41 -0400 Subject: [PATCH 03/11] sonatype --- javaagent-declarative-configuration/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javaagent-declarative-configuration/README.md b/javaagent-declarative-configuration/README.md index b84c318c2..f9983eca6 100644 --- a/javaagent-declarative-configuration/README.md +++ b/javaagent-declarative-configuration/README.md @@ -23,7 +23,7 @@ curl -L -o opentelemetry-javaagent.jar https://github.com/open-telemetry/opentel The OpenTelemetry contrib extension will be automatically downloaded during the build process. **Note:** If you prefer to download the extension manually or need a different version, you can: -1. Find the latest version at [Maven Central](https://mvnrepository.com/artifact/io.opentelemetry.contrib/opentelemetry-samplers) +1. Find the latest version at [Sonatype](https://central.sonatype.com/artifact/io.opentelemetry.contrib/opentelemetry-samplers) 2. Download it with: `curl -L -o opentelemetry-javaagent-extension.jar https://repo1.maven.org/maven2/io/opentelemetry/contrib/opentelemetry-samplers/[VERSION]/opentelemetry-samplers-[VERSION].jar` 3. Reference it in the run command: `-Dotel.javaagent.extensions=opentelemetry-javaagent-extension.jar` From 93d72ed4e09628ca68396d74be80bcb859458142 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 20 Oct 2025 08:30:42 -0400 Subject: [PATCH 04/11] pull in new agent version --- javaagent-declarative-configuration/README.md | 9 --------- javaagent/build.gradle.kts | 12 +----------- javaagent/sdk-config.yaml | 8 +++++--- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/javaagent-declarative-configuration/README.md b/javaagent-declarative-configuration/README.md index f9983eca6..1cd1c1d69 100644 --- a/javaagent-declarative-configuration/README.md +++ b/javaagent-declarative-configuration/README.md @@ -20,13 +20,6 @@ Download the OpenTelemetry Java Agent: curl -L -o opentelemetry-javaagent.jar https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar ``` -The OpenTelemetry contrib extension will be automatically downloaded during the build process. - -**Note:** If you prefer to download the extension manually or need a different version, you can: -1. Find the latest version at [Sonatype](https://central.sonatype.com/artifact/io.opentelemetry.contrib/opentelemetry-samplers) -2. Download it with: `curl -L -o opentelemetry-javaagent-extension.jar https://repo1.maven.org/maven2/io/opentelemetry/contrib/opentelemetry-samplers/[VERSION]/opentelemetry-samplers-[VERSION].jar` -3. Reference it in the run command: `-Dotel.javaagent.extensions=opentelemetry-javaagent-extension.jar` - ### Step 1: Build the Application ```bash @@ -41,7 +34,6 @@ The OpenTelemetry contrib extension will be automatically downloaded during the # Run with the OpenTelemetry Java Agent and contrib extension java -javaagent:opentelemetry-javaagent.jar \ - -Dotel.javaagent.extensions=build/agent/opentelemetry-javaagent-extension.jar \ -Dotel.experimental.config.file=$(pwd)/otel-agent-config.yaml \ -jar build/libs/javaagent-declarative-configuration.jar ``` @@ -86,4 +78,3 @@ This configuration: - Excludes health check endpoints (`/actuator.*`) from tracing using the `DROP` action - Samples all other requests using the `always_on` fallback sampler - Only applies to `SERVER` span kinds -- Requires the OpenTelemetry contrib extension JAR to be loaded diff --git a/javaagent/build.gradle.kts b/javaagent/build.gradle.kts index d28f1a228..e0086cb33 100644 --- a/javaagent/build.gradle.kts +++ b/javaagent/build.gradle.kts @@ -16,7 +16,6 @@ java { } val agent = configurations.create("agent") -val extension = configurations.create("extension") dependencies { implementation(platform(SpringBootPlugin.BOM_COORDINATES)) @@ -26,10 +25,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-actuator") - agent("io.opentelemetry.javaagent:opentelemetry-javaagent:2.20.1") - extension("io.opentelemetry.contrib:opentelemetry-samplers:1.50.0-alpha") { - isTransitive = false - } + agent("io.opentelemetry.javaagent:opentelemetry-javaagent:2.21.0") } val copyAgent = tasks.register("copyAgent") { @@ -38,15 +34,9 @@ val copyAgent = tasks.register("copyAgent") { rename("opentelemetry-javaagent-.*\\.jar", "opentelemetry-javaagent.jar") } -val copyExtension = tasks.register("copyExtension") { - from(extension.singleFile) - into(layout.buildDirectory.dir("agent")) - rename(".*\\.jar", "opentelemetry-javaagent-extension.jar") -} tasks.named("bootJar") { dependsOn(copyAgent) - dependsOn(copyExtension) archiveFileName = "app.jar" } diff --git a/javaagent/sdk-config.yaml b/javaagent/sdk-config.yaml index d2f1826d2..253c37f64 100644 --- a/javaagent/sdk-config.yaml +++ b/javaagent/sdk-config.yaml @@ -1,4 +1,4 @@ -# Copy of https://github.com/open-telemetry/opentelemetry-configuration/blob/v0.3.0/examples/sdk-config.yaml +# Copy of https://github.com/open-telemetry/opentelemetry-configuration/blob/v1.0.0-rc.2/examples/sdk-config.yaml # with the following changes: # - OpenTelemetry Java Agent properties added at .instrumentation.java. # - OTLP exporter endpoints modified to point to http://collector:4318/v1/{path} to export to collector from docker-compose.yml @@ -13,7 +13,7 @@ # vars defined in https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/. # The file format version. -file_format: "0.3" +file_format: "1.0-rc.2" # Configure if the SDK is disabled or not. This is not required to be provided to ensure the SDK isn't disabled, the default value when this is not provided is for the SDK to be enabled. disabled: false @@ -36,7 +36,9 @@ attribute_limits: # Configure text map context propagators. propagator: # Configure the set of propagators to include in the composite text map propagator. - composite: [ tracecontext, baggage ] + composite: + - tracecontext: + - baggage: # Configure tracer provider. tracer_provider: From 1335eed5bbe69312cddc3c9fb958f6bb340c6fc2 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 20 Oct 2025 08:36:21 -0400 Subject: [PATCH 05/11] cleanup gradle --- javaagent-declarative-configuration/build.gradle.kts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/javaagent-declarative-configuration/build.gradle.kts b/javaagent-declarative-configuration/build.gradle.kts index b5e8c2e4a..3d9765346 100644 --- a/javaagent-declarative-configuration/build.gradle.kts +++ b/javaagent-declarative-configuration/build.gradle.kts @@ -9,20 +9,13 @@ plugins { description = "OpenTelemetry Java Agent Declarative Configuration Example" val moduleName by extra { "io.opentelemetry.examples.javaagent.declarative" } -val extension = configurations.create("extension") - dependencies { implementation(platform(SpringBootPlugin.BOM_COORDINATES)) implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-actuator") - - extension("io.opentelemetry.contrib:opentelemetry-samplers:1.50.0-alpha") { - isTransitive = false - } } val copyExtension = tasks.register("copyExtension") { - from(extension.singleFile) into(layout.buildDirectory.dir("agent")) rename(".*\\.jar", "opentelemetry-javaagent-extension.jar") } From ef714eb62c9c51d2b24f90338e34ffa5c73c3355 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 20 Oct 2025 08:37:21 -0400 Subject: [PATCH 06/11] cleanup gradle --- javaagent-declarative-configuration/build.gradle.kts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/javaagent-declarative-configuration/build.gradle.kts b/javaagent-declarative-configuration/build.gradle.kts index 3d9765346..c11f9c589 100644 --- a/javaagent-declarative-configuration/build.gradle.kts +++ b/javaagent-declarative-configuration/build.gradle.kts @@ -15,12 +15,6 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-actuator") } -val copyExtension = tasks.register("copyExtension") { - into(layout.buildDirectory.dir("agent")) - rename(".*\\.jar", "opentelemetry-javaagent-extension.jar") -} - tasks.named("bootJar") { - dependsOn(copyExtension) archiveFileName = "javaagent-declarative-configuration.jar" } From 83249e8ef1fd0b32f7192eb7cac7a08201db7a1c Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 20 Oct 2025 08:53:13 -0400 Subject: [PATCH 07/11] rc2 --- javaagent-declarative-configuration/otel-agent-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javaagent-declarative-configuration/otel-agent-config.yaml b/javaagent-declarative-configuration/otel-agent-config.yaml index 8ef9c8eba..a6009b28d 100644 --- a/javaagent-declarative-configuration/otel-agent-config.yaml +++ b/javaagent-declarative-configuration/otel-agent-config.yaml @@ -1,6 +1,6 @@ # See https://github.com/open-telemetry/opentelemetry-configuration for details on schema and examples -file_format: "1.0-rc.1" +file_format: "1.0-rc.2" resource: attributes: From 09b325fd8ee8806c6eecac73e5506fc9cd2c223f Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 20 Oct 2025 14:58:28 -0400 Subject: [PATCH 08/11] add oats test --- .github/scripts/run-oats-tests.sh | 1 + .github/workflows/oats-tests.yml | 1 + .../Dockerfile | 15 +++++++++++ .../docker-compose.yml | 16 ++++++++++++ javaagent-declarative-configuration/oats.yaml | 26 +++++++++++++++++++ .../otel-agent-config.yaml | 17 +++++++++++- 6 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 javaagent-declarative-configuration/Dockerfile create mode 100644 javaagent-declarative-configuration/docker-compose.yml create mode 100644 javaagent-declarative-configuration/oats.yaml diff --git a/.github/scripts/run-oats-tests.sh b/.github/scripts/run-oats-tests.sh index e3adbb600..1ae2d580e 100755 --- a/.github/scripts/run-oats-tests.sh +++ b/.github/scripts/run-oats-tests.sh @@ -10,3 +10,4 @@ wget -q -O - https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash go install github.com/grafana/oats@v0.3.1 oats -timeout 5m logging-k8s-stdout-otlp-json/ +oats -timeout 5m javaagent-declarative-configuration/ diff --git a/.github/workflows/oats-tests.yml b/.github/workflows/oats-tests.yml index 141f91a71..06c41b5f9 100644 --- a/.github/workflows/oats-tests.yml +++ b/.github/workflows/oats-tests.yml @@ -7,6 +7,7 @@ on: paths: - .github/workflows/oats-tests.yml - 'logging-k8s-stdout-otlp-json/**' + - 'javaagent-declarative-configuration/**' workflow_dispatch: permissions: diff --git a/javaagent-declarative-configuration/Dockerfile b/javaagent-declarative-configuration/Dockerfile new file mode 100644 index 000000000..f4ff9cb7a --- /dev/null +++ b/javaagent-declarative-configuration/Dockerfile @@ -0,0 +1,15 @@ +FROM eclipse-temurin:21.0.8_9-jre@sha256:9dc74491b9c961b24cd16939b26c4dc82259df7f55677b232392d85eef7f6ed0 + +WORKDIR /usr/src/app/ + +# renovate: datasource=github-releases depName=opentelemetry-java-instrumentation packageName=open-telemetry/opentelemetry-java-instrumentation +ENV OPENTELEMETRY_JAVA_INSTRUMENTATION_VERSION=v2.21.0 + +ADD build/libs/javaagent-declarative-configuration.jar ./app.jar +ADD --chmod=644 https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/$OPENTELEMETRY_JAVA_INSTRUMENTATION_VERSION/opentelemetry-javaagent.jar ./opentelemetry-javaagent.jar +ADD otel-agent-config.yaml ./otel-agent-config.yaml +ENV JAVA_TOOL_OPTIONS=-javaagent:./opentelemetry-javaagent.jar +ENV OTEL_EXPERIMENTAL_CONFIG_FILE=/usr/src/app/otel-agent-config.yaml + +EXPOSE 8080 +ENTRYPOINT [ "java", "-jar", "./app.jar" ] \ No newline at end of file diff --git a/javaagent-declarative-configuration/docker-compose.yml b/javaagent-declarative-configuration/docker-compose.yml new file mode 100644 index 000000000..3c4829af9 --- /dev/null +++ b/javaagent-declarative-configuration/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' +services: + app: + build: ./ + environment: + OTEL_SERVICE_NAME: "declarative-config-example-app" + OTEL_EXPORTER_OTLP_ENDPOINT: http://lgtm:4318 + OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: http://lgtm:4318 + OTEL_EXPORTER_OTLP_PROTOCOL: http/protobuf + ports: + - "8080:8080" + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] + interval: 10s + timeout: 5s + retries: 3 \ No newline at end of file diff --git a/javaagent-declarative-configuration/oats.yaml b/javaagent-declarative-configuration/oats.yaml new file mode 100644 index 000000000..3be11e39e --- /dev/null +++ b/javaagent-declarative-configuration/oats.yaml @@ -0,0 +1,26 @@ +# OATS is an acceptance testing framework for OpenTelemetry - https://github.com/grafana/oats + +docker-compose: + files: + - ./docker-compose.yml + app-service: app + app-docker-tag: javaagent-declarative-config:latest + app-docker-port: 8080 + +input: + # This endpoint should be traced normally + - path: /api/example + # This endpoint should NOT be traced (excluded by declarative config) + # We send the request but don't assert spans for it - the absence of spans + # for /actuator/health demonstrates the sampling rule is working + - path: /actuator/health + +expected: + traces: + # Verify that /api/example creates a trace with SERVER span + - traceql: '{ span.http.route = "/api/example" }' + spans: + - name: "GET /api/example" + attributes: + http.request.method: "GET" + http.route: "/api/example" \ No newline at end of file diff --git a/javaagent-declarative-configuration/otel-agent-config.yaml b/javaagent-declarative-configuration/otel-agent-config.yaml index a6009b28d..9e2392039 100644 --- a/javaagent-declarative-configuration/otel-agent-config.yaml +++ b/javaagent-declarative-configuration/otel-agent-config.yaml @@ -14,9 +14,16 @@ propagator: tracer_provider: processors: + - batch: + exporter: + otlp_http: + endpoint: ${OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:-http://localhost:4318}/v1/traces + + # Configure a console exporter for exploring without a collector/backend - batch: exporter: console: + # Configure sampling to exclude health check endpoints sampler: rule_based_routing: @@ -37,4 +44,12 @@ meter_provider: readers: - periodic: exporter: - console: \ No newline at end of file + otlp_http: + endpoint: ${OTEL_EXPORTER_OTLP_METRICS_ENDPOINT:-http://localhost:4318}/v1/metrics + +logger_provider: + processors: + - batch: + exporter: + otlp_http: + endpoint: ${OTEL_EXPORTER_OTLP_ENDPOINT:-http://localhost:4318}/v1/logs From edd9e5421612857700b1132fe35b30218f650e27 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 20 Oct 2025 15:09:34 -0400 Subject: [PATCH 09/11] build in script: --- .github/scripts/run-oats-tests.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/scripts/run-oats-tests.sh b/.github/scripts/run-oats-tests.sh index 1ae2d580e..a54c739b2 100755 --- a/.github/scripts/run-oats-tests.sh +++ b/.github/scripts/run-oats-tests.sh @@ -6,6 +6,10 @@ pushd logging-k8s-stdout-otlp-json ../gradlew assemble popd +pushd javaagent-declarative-configuration +../gradlew bootJar +popd + wget -q -O - https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash go install github.com/grafana/oats@v0.3.1 From 4bbf0eaecad98227a97bc0410a9a3853c4275f1b Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 20 Oct 2025 15:56:35 -0400 Subject: [PATCH 10/11] move oats stuff into own directory --- .github/scripts/run-oats-tests.sh | 2 +- .github/workflows/oats-tests.yml | 2 +- .gitignore | 6 +----- javaagent-declarative-configuration/.gitignore | 1 + javaagent-declarative-configuration/{ => oats}/Dockerfile | 4 ++-- .../{ => oats}/docker-compose.yml | 4 +++- javaagent-declarative-configuration/{ => oats}/oats.yaml | 0 7 files changed, 9 insertions(+), 10 deletions(-) create mode 100644 javaagent-declarative-configuration/.gitignore rename javaagent-declarative-configuration/{ => oats}/Dockerfile (85%) rename javaagent-declarative-configuration/{ => oats}/docker-compose.yml (87%) rename javaagent-declarative-configuration/{ => oats}/oats.yaml (100%) diff --git a/.github/scripts/run-oats-tests.sh b/.github/scripts/run-oats-tests.sh index a54c739b2..a85e6d879 100755 --- a/.github/scripts/run-oats-tests.sh +++ b/.github/scripts/run-oats-tests.sh @@ -14,4 +14,4 @@ wget -q -O - https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash go install github.com/grafana/oats@v0.3.1 oats -timeout 5m logging-k8s-stdout-otlp-json/ -oats -timeout 5m javaagent-declarative-configuration/ +oats -timeout 5m javaagent-declarative-configuration/oats diff --git a/.github/workflows/oats-tests.yml b/.github/workflows/oats-tests.yml index d37f10f05..0c789d01c 100644 --- a/.github/workflows/oats-tests.yml +++ b/.github/workflows/oats-tests.yml @@ -7,7 +7,7 @@ on: paths: - .github/workflows/oats-tests.yml - 'logging-k8s-stdout-otlp-json/**' - - 'javaagent-declarative-configuration/**' + - 'javaagent-declarative-configuration/oats/**' workflow_dispatch: permissions: diff --git a/.gitignore b/.gitignore index 44a205d8f..b29e8f003 100644 --- a/.gitignore +++ b/.gitignore @@ -35,8 +35,4 @@ bin .swp # Polyglot runtime manager (asdf rust clone) -.rtx.toml - - -javaagent-declarative-configuration/opentelemetry-javaagent.jar -javaagent-declarative-configuration/opentelemetry-javaagent-extension.jar \ No newline at end of file +.rtx.toml \ No newline at end of file diff --git a/javaagent-declarative-configuration/.gitignore b/javaagent-declarative-configuration/.gitignore new file mode 100644 index 000000000..363af2af7 --- /dev/null +++ b/javaagent-declarative-configuration/.gitignore @@ -0,0 +1 @@ +opentelemetry-javaagent.jar \ No newline at end of file diff --git a/javaagent-declarative-configuration/Dockerfile b/javaagent-declarative-configuration/oats/Dockerfile similarity index 85% rename from javaagent-declarative-configuration/Dockerfile rename to javaagent-declarative-configuration/oats/Dockerfile index 8cc8132dc..03ac989ae 100644 --- a/javaagent-declarative-configuration/Dockerfile +++ b/javaagent-declarative-configuration/oats/Dockerfile @@ -5,9 +5,9 @@ WORKDIR /usr/src/app/ # renovate: datasource=github-releases depName=opentelemetry-java-instrumentation packageName=open-telemetry/opentelemetry-java-instrumentation ENV OPENTELEMETRY_JAVA_INSTRUMENTATION_VERSION=v2.21.0 -ADD build/libs/javaagent-declarative-configuration.jar ./app.jar +ADD ./build/libs/javaagent-declarative-configuration.jar ./app.jar ADD --chmod=644 https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/$OPENTELEMETRY_JAVA_INSTRUMENTATION_VERSION/opentelemetry-javaagent.jar ./opentelemetry-javaagent.jar -ADD otel-agent-config.yaml ./otel-agent-config.yaml +ADD ./otel-agent-config.yaml ./otel-agent-config.yaml ENV JAVA_TOOL_OPTIONS=-javaagent:./opentelemetry-javaagent.jar ENV OTEL_EXPERIMENTAL_CONFIG_FILE=/usr/src/app/otel-agent-config.yaml diff --git a/javaagent-declarative-configuration/docker-compose.yml b/javaagent-declarative-configuration/oats/docker-compose.yml similarity index 87% rename from javaagent-declarative-configuration/docker-compose.yml rename to javaagent-declarative-configuration/oats/docker-compose.yml index 3c4829af9..b43478e7d 100644 --- a/javaagent-declarative-configuration/docker-compose.yml +++ b/javaagent-declarative-configuration/oats/docker-compose.yml @@ -1,7 +1,9 @@ version: '3' services: app: - build: ./ + build: + context: ../ + dockerfile: oats/Dockerfile environment: OTEL_SERVICE_NAME: "declarative-config-example-app" OTEL_EXPORTER_OTLP_ENDPOINT: http://lgtm:4318 diff --git a/javaagent-declarative-configuration/oats.yaml b/javaagent-declarative-configuration/oats/oats.yaml similarity index 100% rename from javaagent-declarative-configuration/oats.yaml rename to javaagent-declarative-configuration/oats/oats.yaml From 8ea7b790957c6b458893bea4f415c958776b1631 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 20 Oct 2025 15:58:18 -0400 Subject: [PATCH 11/11] trailing slash --- .github/scripts/run-oats-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/run-oats-tests.sh b/.github/scripts/run-oats-tests.sh index a85e6d879..5f286b445 100755 --- a/.github/scripts/run-oats-tests.sh +++ b/.github/scripts/run-oats-tests.sh @@ -14,4 +14,4 @@ wget -q -O - https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash go install github.com/grafana/oats@v0.3.1 oats -timeout 5m logging-k8s-stdout-otlp-json/ -oats -timeout 5m javaagent-declarative-configuration/oats +oats -timeout 5m javaagent-declarative-configuration/oats/