From 281e8f874505a514800e44a635dcec5ef0ff0540 Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Fri, 9 May 2025 23:48:43 +0000 Subject: [PATCH 1/7] Update the OpenTelemetry SDK version to 1.50.0 --- dependencyManagement/build.gradle.kts | 2 +- examples/distro/build.gradle | 2 +- examples/extension/build.gradle | 2 +- licenses/licenses.md | 44 +++++++++++++-------------- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/dependencyManagement/build.gradle.kts b/dependencyManagement/build.gradle.kts index 4246ee0331f1..32be3e2d83c6 100644 --- a/dependencyManagement/build.gradle.kts +++ b/dependencyManagement/build.gradle.kts @@ -5,7 +5,7 @@ plugins { data class DependencySet(val group: String, val version: String, val modules: List) // this line is managed by .github/scripts/update-sdk-version.sh -val otelSdkVersion = "1.49.0" +val otelSdkVersion = "1.50.0" val otelContribVersion = "1.46.0-alpha" val otelSdkAlphaVersion = otelSdkVersion.replaceFirst("(-SNAPSHOT)?$".toRegex(), "-alpha$1") diff --git a/examples/distro/build.gradle b/examples/distro/build.gradle index ae25e03c987f..d559519a5da3 100644 --- a/examples/distro/build.gradle +++ b/examples/distro/build.gradle @@ -27,7 +27,7 @@ subprojects { ext { versions = [ // this line is managed by .github/scripts/update-sdk-version.sh - opentelemetrySdk : "1.49.0", + opentelemetrySdk : "1.50.0", // these lines are managed by .github/scripts/update-version.sh opentelemetryJavaagent : "2.16.0-SNAPSHOT", diff --git a/examples/extension/build.gradle b/examples/extension/build.gradle index edb6ea886352..cc0269eb365b 100644 --- a/examples/extension/build.gradle +++ b/examples/extension/build.gradle @@ -23,7 +23,7 @@ version '1.0' ext { versions = [ // this line is managed by .github/scripts/update-sdk-version.sh - opentelemetrySdk : "1.49.0", + opentelemetrySdk : "1.50.0", // these lines are managed by .github/scripts/update-version.sh opentelemetryJavaagent : "2.16.0-SNAPSHOT", diff --git a/licenses/licenses.md b/licenses/licenses.md index f2ccf545fd1e..6200bf2ddb4c 100644 --- a/licenses/licenses.md +++ b/licenses/licenses.md @@ -62,91 +62,91 @@ > - **POM Project URL**: [https://github.com/square/okio/](https://github.com/square/okio/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**12** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api` **Version:** `1.49.0` +**12** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**13** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api-incubator` **Version:** `1.49.0-alpha` +**13** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api-incubator` **Version:** `1.50.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**14** **Group:** `io.opentelemetry` **Name:** `opentelemetry-context` **Version:** `1.49.0` +**14** **Group:** `io.opentelemetry` **Name:** `opentelemetry-context` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**15** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-common` **Version:** `1.49.0` +**15** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-common` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**16** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging` **Version:** `1.49.0` +**16** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**17** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging-otlp` **Version:** `1.49.0` +**17** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging-otlp` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**18** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp` **Version:** `1.49.0` +**18** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**19** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp-common` **Version:** `1.49.0` +**19** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp-common` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**20** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-prometheus` **Version:** `1.49.0-alpha` +**20** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-prometheus` **Version:** `1.50.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**21** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-sender-okhttp` **Version:** `1.49.0` +**21** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-sender-okhttp` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**22** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-zipkin` **Version:** `1.49.0` +**22** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-zipkin` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**23** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-kotlin` **Version:** `1.49.0` +**23** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-kotlin` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**24** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-trace-propagators` **Version:** `1.49.0` +**24** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-trace-propagators` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**25** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk` **Version:** `1.49.0` +**25** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**26** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-common` **Version:** `1.49.0` +**26** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-common` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**27** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure` **Version:** `1.49.0` +**27** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**28** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure-spi` **Version:** `1.49.0` +**28** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure-spi` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**29** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-incubator` **Version:** `1.49.0-alpha` +**29** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-incubator` **Version:** `1.50.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**30** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-jaeger-remote-sampler` **Version:** `1.49.0` +**30** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-jaeger-remote-sampler` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**31** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-logs` **Version:** `1.49.0` +**31** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-logs` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**32** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-metrics` **Version:** `1.49.0` +**32** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-metrics` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**33** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-trace` **Version:** `1.49.0` +**33** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-trace` **Version:** `1.50.0` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) From 0f465dd83f44c99068d952723b7e819c2cdbf135 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Sat, 10 May 2025 19:16:25 +0300 Subject: [PATCH 2/7] fix build errors --- .../runtimemetrics/java8/JarAnalyzerTest.java | 2 +- javaagent-bootstrap/build.gradle.kts | 1 + .../bootstrap/AgentClassLoaderTest.groovy | 24 +++++++++---------- ...DeclarativeConfigPropertiesBridgeTest.java | 3 ++- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java8/testing/src/test/java/io/opentelemetry/instrumentation/javaagent/runtimemetrics/java8/JarAnalyzerTest.java b/instrumentation/runtime-telemetry/runtime-telemetry-java8/testing/src/test/java/io/opentelemetry/instrumentation/javaagent/runtimemetrics/java8/JarAnalyzerTest.java index 2156a0eabf2d..69639878f190 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java8/testing/src/test/java/io/opentelemetry/instrumentation/javaagent/runtimemetrics/java8/JarAnalyzerTest.java +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java8/testing/src/test/java/io/opentelemetry/instrumentation/javaagent/runtimemetrics/java8/JarAnalyzerTest.java @@ -42,7 +42,7 @@ class JarAnalyzerTest { void processUrl_EmitsEvents(URL archiveUrl, Consumer attributesConsumer) { ExtendedLogRecordBuilder builder = mock(ExtendedLogRecordBuilder.class); when(builder.setEventName(eq("package.info"))).thenReturn(builder); - when(builder.setAllAttributes(any())).thenReturn(builder); + when(builder.setAllAttributes((Attributes) any())).thenReturn(builder); JarAnalyzer.processUrl(builder, archiveUrl); diff --git a/javaagent-bootstrap/build.gradle.kts b/javaagent-bootstrap/build.gradle.kts index 8cff55f24e24..6aef45035e36 100644 --- a/javaagent-bootstrap/build.gradle.kts +++ b/javaagent-bootstrap/build.gradle.kts @@ -9,6 +9,7 @@ dependencies { implementation(project(":instrumentation-api")) testImplementation(project(":testing-common")) + testImplementation(project(":instrumentation:resources:library")) } tasks.withType().configureEach { diff --git a/javaagent-bootstrap/src/test/groovy/io/opentelemetry/javaagent/bootstrap/AgentClassLoaderTest.groovy b/javaagent-bootstrap/src/test/groovy/io/opentelemetry/javaagent/bootstrap/AgentClassLoaderTest.groovy index da7193edc3b0..a0a73390d036 100644 --- a/javaagent-bootstrap/src/test/groovy/io/opentelemetry/javaagent/bootstrap/AgentClassLoaderTest.groovy +++ b/javaagent-bootstrap/src/test/groovy/io/opentelemetry/javaagent/bootstrap/AgentClassLoaderTest.groovy @@ -5,10 +5,10 @@ package io.opentelemetry.javaagent.bootstrap -import io.opentelemetry.sdk.internal.JavaVersionSpecific +import io.opentelemetry.sdk.OpenTelemetrySdk import spock.lang.Specification -import java.lang.reflect.Field +import java.lang.reflect.Method import java.util.concurrent.Phaser class AgentClassLoaderTest extends Specification { @@ -18,7 +18,7 @@ class AgentClassLoaderTest extends Specification { def className1 = 'some/class/Name1' def className2 = 'some/class/Name2' // any jar would do, use opentelemety sdk - URL testJarLocation = JavaVersionSpecific.getProtectionDomain().getCodeSource().getLocation() + URL testJarLocation = OpenTelemetrySdk.getProtectionDomain().getCodeSource().getLocation() AgentClassLoader loader = new AgentClassLoader(new File(testJarLocation.toURI())) Phaser threadHoldLockPhase = new Phaser(2) Phaser acquireLockFromMainThreadPhase = new Phaser(2) @@ -56,8 +56,9 @@ class AgentClassLoaderTest extends Specification { def "multi release jar"() { setup: boolean jdk8 = "1.8" == System.getProperty("java.specification.version") + def mrJarClass = Class.forName("io.opentelemetry.instrumentation.resources.ProcessArguments") // sdk is a multi release jar - URL multiReleaseJar = JavaVersionSpecific.getProtectionDomain().getCodeSource().getLocation() + URL multiReleaseJar = mrJarClass.getProtectionDomain().getCodeSource().getLocation() AgentClassLoader loader = new AgentClassLoader(new File(multiReleaseJar.toURI())) { @Override protected String getClassSuffix() { @@ -66,7 +67,7 @@ class AgentClassLoaderTest extends Specification { } when: - URL url = loader.findResource("io/opentelemetry/sdk/internal/CurrentJavaVersionSpecific.class") + URL url = loader.findResource("io/opentelemetry/instrumentation/resources/ProcessArguments.class") then: url != null @@ -74,14 +75,13 @@ class AgentClassLoaderTest extends Specification { jdk8 != url.toString().contains("META-INF/versions/9/") and: - Class clazz = loader.loadClass(JavaVersionSpecific.getName()) + Class clazz = loader.loadClass("io.opentelemetry.instrumentation.resources.ProcessArguments") // class was loaded by agent loader used in this test clazz.getClassLoader() == loader - // extract value of private static field that gets a different class depending on java version - Field field = clazz.getDeclaredField("CURRENT") - field.setAccessible(true) - Object javaVersionSpecific = field.get(null) - // expect a versioned class on java 9+ - jdk8 != javaVersionSpecific.getClass().getName().endsWith("Java9VersionSpecific") + Method method = clazz.getDeclaredMethod("getProcessArguments") + method.setAccessible(true) + String[] result = method.invoke(null) + // jdk8 versions returns empty array, jdk9 version does not + jdk8 != result.length > 0 } } diff --git a/javaagent-extension-api/src/test/java/io/opentelemetry/javaagent/extension/DeclarativeConfigPropertiesBridgeTest.java b/javaagent-extension-api/src/test/java/io/opentelemetry/javaagent/extension/DeclarativeConfigPropertiesBridgeTest.java index 6c564dbaa264..11569b792e69 100644 --- a/javaagent-extension-api/src/test/java/io/opentelemetry/javaagent/extension/DeclarativeConfigPropertiesBridgeTest.java +++ b/javaagent-extension-api/src/test/java/io/opentelemetry/javaagent/extension/DeclarativeConfigPropertiesBridgeTest.java @@ -60,7 +60,8 @@ void setup() { Objects.requireNonNull(configProvider.getInstrumentationConfig())); OpenTelemetryConfigurationModel emptyModel = - new OpenTelemetryConfigurationModel().withInstrumentation(new InstrumentationModel()); + new OpenTelemetryConfigurationModel() + .withAdditionalProperty("instrumentation", new InstrumentationModel()); SdkConfigProvider emptyConfigProvider = SdkConfigProvider.create(emptyModel); emptyBridge = new DeclarativeConfigPropertiesBridge( From 8ac978f4cec3f539f10049dcf836e0eda4b686c0 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 12 May 2025 19:44:54 +0300 Subject: [PATCH 3/7] add bridging for 1.50 api --- .fossa.yml | 3 + .../v1_27/ApplicationOpenTelemetry127.java | 16 +- .../javaagent/build.gradle.kts | 3 + .../javaagent/build.gradle.kts | 2 +- .../javaagent/build.gradle.kts | 4 + .../logs/ApplicationLogRecordBuilder142.java | 2 +- .../javaagent/build.gradle.kts | 11 ++ ...etryApiIncubatorInstrumentationModule.java | 9 +- ...plicationLogRecordBuilder147Incubator.java | 4 +- .../{ => incubator}/logs/LoggerTest.java | 2 +- .../{ => incubator}/metrics/MeterTest.java | 2 +- .../{ => incubator}/trace/TracerTest.java | 2 +- .../javaagent/build.gradle.kts | 32 ++++ .../v1_50/incubator/logs/LoggerTest.java | 149 ++++++++++++++ .../v1_50/incubator/metrics/MeterTest.java | 85 ++++++++ .../v1_50/incubator/trace/TracerTest.java | 117 +++++++++++ ...OpenTelemetryApiInstrumentationModule.java | 48 +++++ .../v1_50/OpenTelemetryInstrumentation.java | 40 ++++ ...etryApiIncubatorInstrumentationModule.java | 39 ++++ ...OpenTelemetryIncubatorInstrumentation.java | 46 +++++ ...plicationLogRecordBuilder150Incubator.java | 181 ++++++++++++++++++ .../logs/ApplicationLogger150Incubator.java | 30 +++ .../ApplicationLoggerFactory150Incubator.java | 19 ++ .../logs/ApplicationLogRecordBuilder150.java | 27 +++ .../v1_50/logs/ApplicationLogger150.java | 24 +++ .../logs/ApplicationLoggerFactory150.java | 19 ++ .../v1_50/logs/LoggerTest.java | 99 ++++++++++ .../opentelemetry-api-1.50/metadata.yaml | 1 + .../internal/DeclarativeConfigTest.java | 2 + javaagent/build.gradle.kts | 1 + .../build.gradle.kts | 21 ++ settings.gradle.kts | 1 + 32 files changed, 1030 insertions(+), 11 deletions(-) rename instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/{ => incubator}/logs/LoggerTest.java (99%) rename instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/{ => incubator}/metrics/MeterTest.java (99%) rename instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/{ => incubator}/trace/TracerTest.java (99%) create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/build.gradle.kts create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/LoggerTest.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/metrics/MeterTest.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/trace/TracerTest.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/OpenTelemetryApiInstrumentationModule.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/OpenTelemetryInstrumentation.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/OpenTelemetryApiIncubatorInstrumentationModule.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/OpenTelemetryIncubatorInstrumentation.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLogRecordBuilder150Incubator.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLogger150Incubator.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLoggerFactory150Incubator.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/ApplicationLogRecordBuilder150.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/ApplicationLogger150.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/ApplicationLoggerFactory150.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/LoggerTest.java create mode 100644 instrumentation/opentelemetry-api/opentelemetry-api-1.50/metadata.yaml diff --git a/.fossa.yml b/.fossa.yml index 2a4efeed0077..0d29905b0eb0 100644 --- a/.fossa.yml +++ b/.fossa.yml @@ -766,6 +766,9 @@ targets: - type: gradle path: ./ target: ':instrumentation:opentelemetry-api:opentelemetry-api-1.47:javaagent' + - type: gradle + path: ./ + target: ':instrumentation:opentelemetry-api:opentelemetry-api-1.50:javaagent' - type: gradle path: ./ target: ':instrumentation:pekko:pekko-actor-1.0:javaagent' diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.27/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_27/ApplicationOpenTelemetry127.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.27/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_27/ApplicationOpenTelemetry127.java index 4462588dd382..d5529f8ec94a 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.27/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_27/ApplicationOpenTelemetry127.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.27/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_27/ApplicationOpenTelemetry127.java @@ -120,10 +120,22 @@ private static ApplicationMeterFactory getMeterFactory(String className) { } private static ApplicationLoggerFactory getLoggerFactory() { - // this class is defined in opentelemetry-api-1.47 + // this class is defined in opentelemetry-api-1.50 ApplicationLoggerFactory loggerFactory = getLoggerFactory( - "io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.logs.ApplicationLoggerFactory147Incubator"); + "io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.incubator.logs.ApplicationLoggerFactory150Incubator"); + if (loggerFactory == null) { + // this class is defined in opentelemetry-api-1.50 + loggerFactory = + getLoggerFactory( + "io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.logs.ApplicationLoggerFactory150"); + } + if (loggerFactory == null) { + // this class is defined in opentelemetry-api-1.47 + loggerFactory = + getLoggerFactory( + "io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.logs.ApplicationLoggerFactory147Incubator"); + } if (loggerFactory == null) { // this class is defined in opentelemetry-api-1.42 loggerFactory = diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.31/javaagent/build.gradle.kts b/instrumentation/opentelemetry-api/opentelemetry-api-1.31/javaagent/build.gradle.kts index 5a99a9c1b60f..018ca495154c 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.31/javaagent/build.gradle.kts +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.31/javaagent/build.gradle.kts @@ -19,6 +19,9 @@ configurations.configureEach { force("io.opentelemetry:opentelemetry-api:1.31.0") } } + if (name == "testRuntimeClasspath" || name == "noopTestRuntimeClasspath") { + exclude(group = "io.opentelemetry", module = "opentelemetry-api-incubator") + } } testing { diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.32/javaagent/build.gradle.kts b/instrumentation/opentelemetry-api/opentelemetry-api-1.32/javaagent/build.gradle.kts index b952f068fc4e..b963892bb475 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.32/javaagent/build.gradle.kts +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.32/javaagent/build.gradle.kts @@ -20,7 +20,7 @@ configurations.configureEach { force("io.opentelemetry:opentelemetry-api:1.32.0") } } - if (name == "testRuntimeClasspath") { + if (name == "testRuntimeClasspath" || name == "incubatorTestRuntimeClasspath" || name == "noopTestRuntimeClasspath") { exclude(group = "io.opentelemetry", module = "opentelemetry-api-incubator") } } diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.42/javaagent/build.gradle.kts b/instrumentation/opentelemetry-api/opentelemetry-api-1.42/javaagent/build.gradle.kts index 82bf9687e884..0b244523d8da 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.42/javaagent/build.gradle.kts +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.42/javaagent/build.gradle.kts @@ -21,6 +21,10 @@ configurations.configureEach { if (name == "testRuntimeClasspath") { exclude(group = "io.opentelemetry", module = "opentelemetry-api-incubator") } + resolutionStrategy { + // use older version of opentelemetry-sdk-testing that does not depend on opentelemetry-api-incubator + force("io.opentelemetry:opentelemetry-sdk-testing:1.47.0") + } } testing { diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.42/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_42/logs/ApplicationLogRecordBuilder142.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.42/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_42/logs/ApplicationLogRecordBuilder142.java index d47a7db52b95..c22fdc043dbc 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.42/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_42/logs/ApplicationLogRecordBuilder142.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.42/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_42/logs/ApplicationLogRecordBuilder142.java @@ -31,7 +31,7 @@ public LogRecordBuilder setBody(Value body) { } @SuppressWarnings("unchecked") - private static io.opentelemetry.api.common.Value convertValue(Value value) { + protected static io.opentelemetry.api.common.Value convertValue(Value value) { if (value == null) { return null; } diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/build.gradle.kts b/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/build.gradle.kts index 103a2ce08f2e..488670294f09 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/build.gradle.kts +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/build.gradle.kts @@ -13,3 +13,14 @@ dependencies { testImplementation("io.opentelemetry:opentelemetry-api-incubator") } + +configurations.configureEach { + if (name.endsWith("testRuntimeClasspath", true) || name.endsWith("testCompileClasspath", true)) { + resolutionStrategy { + force("io.opentelemetry:opentelemetry-api:1.47.0") + force("io.opentelemetry:opentelemetry-api-incubator:1.47.0-alpha") + // use older version of opentelemetry-sdk-testing that works with opentelemetry-api-incubator:1.47.0-alpha + force("io.opentelemetry:opentelemetry-sdk-testing:1.47.0") + } + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/OpenTelemetryApiIncubatorInstrumentationModule.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/OpenTelemetryApiIncubatorInstrumentationModule.java index 3c5074403927..da3fdc2de6ac 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/OpenTelemetryApiIncubatorInstrumentationModule.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/OpenTelemetryApiIncubatorInstrumentationModule.java @@ -7,6 +7,7 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Collections.singletonList; +import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; @@ -25,8 +26,12 @@ public OpenTelemetryApiIncubatorInstrumentationModule() { @Override public ElementMatcher.Junction classLoaderMatcher() { return hasClassesNamed( - "application.io.opentelemetry.api.common.Value", - "application.io.opentelemetry.api.incubator.logs.ExtendedLogger"); + "application.io.opentelemetry.api.common.Value", + "application.io.opentelemetry.api.incubator.logs.ExtendedLogger") + .and( + not( + hasClassesNamed( + "application.io.opentelemetry.api.incubator.common.ExtendedAttributes"))); } @Override diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/logs/ApplicationLogRecordBuilder147Incubator.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/logs/ApplicationLogRecordBuilder147Incubator.java index 9e40ace8b3d8..aa9823cada4d 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/logs/ApplicationLogRecordBuilder147Incubator.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/logs/ApplicationLogRecordBuilder147Incubator.java @@ -6,7 +6,6 @@ package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.logs; import application.io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder; -import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.logs.ApplicationLogRecordBuilder142; public class ApplicationLogRecordBuilder147Incubator extends ApplicationLogRecordBuilder142 @@ -14,7 +13,8 @@ public class ApplicationLogRecordBuilder147Incubator extends ApplicationLogRecor private final io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder; - ApplicationLogRecordBuilder147Incubator(LogRecordBuilder agentLogRecordBuilder) { + ApplicationLogRecordBuilder147Incubator( + io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder) { super(agentLogRecordBuilder); this.agentLogRecordBuilder = agentLogRecordBuilder; } diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/logs/LoggerTest.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/logs/LoggerTest.java similarity index 99% rename from instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/logs/LoggerTest.java rename to instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/logs/LoggerTest.java index b15f1db45915..3ee2095ef4bb 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/logs/LoggerTest.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/logs/LoggerTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.logs; +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.logs; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/metrics/MeterTest.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/metrics/MeterTest.java similarity index 99% rename from instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/metrics/MeterTest.java rename to instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/metrics/MeterTest.java index d49c704fbcdd..13db16c2ecb8 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/metrics/MeterTest.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/metrics/MeterTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.metrics; +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.metrics; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/trace/TracerTest.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/trace/TracerTest.java similarity index 99% rename from instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/trace/TracerTest.java rename to instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/trace/TracerTest.java index 244f0155ae42..071faf7d1c25 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/trace/TracerTest.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.47/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_47/incubator/trace/TracerTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.trace; +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.trace; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/build.gradle.kts b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/build.gradle.kts new file mode 100644 index 000000000000..cc36f53baef5 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/build.gradle.kts @@ -0,0 +1,32 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +dependencies { + compileOnly(project(":opentelemetry-api-shaded-for-instrumenting", configuration = "v1_50")) + compileOnly("io.opentelemetry:opentelemetry-api-incubator") + + implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.0:javaagent")) + implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.27:javaagent")) + implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.40:javaagent")) + implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.42:javaagent")) + implementation(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.47:javaagent")) + + testImplementation("io.opentelemetry:opentelemetry-api-incubator") +} + +testing { + suites { + val incubatorTest by registering(JvmTestSuite::class) { + dependencies { + implementation("io.opentelemetry:opentelemetry-api-incubator:1.50.0-alpha") + } + } + } +} + +tasks { + test { + jvmArgs("-Dotel.instrumentation.opentelemetry-api-incubator-1.50.enabled=false") + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/LoggerTest.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/LoggerTest.java new file mode 100644 index 000000000000..d0ecd0099b1d --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/LoggerTest.java @@ -0,0 +1,149 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.incubator.logs; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.KeyValue; +import io.opentelemetry.api.common.Value; +import io.opentelemetry.api.common.ValueType; +import io.opentelemetry.api.incubator.logs.ExtendedLogger; +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.api.logs.Severity; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceState; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.sdk.logs.data.internal.ExtendedLogRecordData; +import io.opentelemetry.sdk.trace.IdGenerator; +import java.time.Instant; +import java.util.concurrent.TimeUnit; +import java.util.stream.Stream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class LoggerTest { + + @RegisterExtension + static final AgentInstrumentationExtension testing = AgentInstrumentationExtension.create(); + + private String instrumentationName; + private Logger logger; + + @BeforeEach + void setupLogger(TestInfo test) { + instrumentationName = "test-" + test.getDisplayName(); + logger = + GlobalOpenTelemetry.get() + .getLogsBridge() + .loggerBuilder(instrumentationName) + .setInstrumentationVersion("1.2.3") + .setSchemaUrl("http://schema.org") + .build(); + } + + @Test + void logRecordBuilder() { + assertThat(logger).isInstanceOf(ExtendedLogger.class); + + SpanContext spanContext = + SpanContext.create( + IdGenerator.random().generateTraceId(), + IdGenerator.random().generateSpanId(), + TraceFlags.getDefault(), + TraceState.getDefault()); + + ((ExtendedLogger) logger) + .logRecordBuilder() + .setEventName("eventName") + .setTimestamp(1, TimeUnit.SECONDS) + .setTimestamp(Instant.now()) + .setContext(Context.current().with(Span.wrap(spanContext))) + .setSeverity(Severity.DEBUG) + .setSeverityText("debug") + .setBody("body") + .setAttribute(AttributeKey.stringKey("key"), "value") + .setAllAttributes(Attributes.builder().put("key", "value").build()) + .emit(); + + await() + .untilAsserted( + () -> + assertThat(testing.logRecords()) + .satisfiesExactly( + logRecordData -> { + assertThat(logRecordData.getInstrumentationScopeInfo().getName()) + .isEqualTo(instrumentationName); + assertThat(((ExtendedLogRecordData) logRecordData).getEventName()) + .isEqualTo("eventName"); + assertThat(logRecordData.getInstrumentationScopeInfo().getVersion()) + .isEqualTo("1.2.3"); + assertThat(logRecordData.getTimestampEpochNanos()).isGreaterThan(0); + assertThat(logRecordData.getSpanContext()).isEqualTo(spanContext); + assertThat(logRecordData.getSeverity()).isEqualTo(Severity.DEBUG); + assertThat(logRecordData.getSeverityText()).isEqualTo("debug"); + assertThat(logRecordData.getBodyValue().getType()) + .isEqualTo(ValueType.STRING); + assertThat(logRecordData.getBodyValue().getValue()).isEqualTo("body"); + assertThat(logRecordData.getAttributes()) + .isEqualTo(Attributes.builder().put("key", "value").build()); + })); + } + + private static Stream bodyValues() { + return Stream.of( + Arguments.of(Value.of("hello")), + Arguments.of(Value.of(42)), + Arguments.of(Value.of(42.42)), + Arguments.of(Value.of(true)), + Arguments.of(Value.of(new byte[] {4, 2})), + Arguments.of(Value.of(Value.of("hello"), Value.of(42))), + Arguments.of(Value.of(KeyValue.of("key", Value.of(42))))); + } + + @ParameterizedTest + @MethodSource("bodyValues") + void logBodyValue() { + Value value = Value.of(42); + logger.logRecordBuilder().setBody(value).emit(); + + await() + .untilAsserted( + () -> + assertThat(testing.logRecords()) + .satisfiesExactly( + logRecordData -> { + assertThat(logRecordData.getBodyValue().getType()) + .isEqualTo(value.getType()); + assertThat(logRecordData.getBodyValue().getValue()) + .isEqualTo(value.getValue()); + })); + } + + @Test + void logNullBody() { + Value value = null; + logger.logRecordBuilder().setBody(value).emit(); + + await() + .untilAsserted( + () -> + assertThat(testing.logRecords()) + .satisfiesExactly( + logRecordData -> assertThat(logRecordData.getBodyValue()).isNull())); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/metrics/MeterTest.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/metrics/MeterTest.java new file mode 100644 index 000000000000..7bc4c94f3976 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/metrics/MeterTest.java @@ -0,0 +1,85 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.incubator.metrics; + +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; + +import io.opentelemetry.api.incubator.metrics.ExtendedDoubleCounter; +import io.opentelemetry.api.incubator.metrics.ExtendedDoubleGauge; +import io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogram; +import io.opentelemetry.api.incubator.metrics.ExtendedDoubleUpDownCounter; +import io.opentelemetry.api.incubator.metrics.ExtendedLongCounter; +import io.opentelemetry.api.incubator.metrics.ExtendedLongGauge; +import io.opentelemetry.api.incubator.metrics.ExtendedLongHistogram; +import io.opentelemetry.api.incubator.metrics.ExtendedLongUpDownCounter; +import io.opentelemetry.api.metrics.DoubleCounter; +import io.opentelemetry.api.metrics.DoubleGauge; +import io.opentelemetry.api.metrics.DoubleGaugeBuilder; +import io.opentelemetry.api.metrics.DoubleHistogram; +import io.opentelemetry.api.metrics.DoubleHistogramBuilder; +import io.opentelemetry.api.metrics.DoubleUpDownCounter; +import io.opentelemetry.api.metrics.LongCounter; +import io.opentelemetry.api.metrics.LongCounterBuilder; +import io.opentelemetry.api.metrics.LongGauge; +import io.opentelemetry.api.metrics.LongHistogram; +import io.opentelemetry.api.metrics.LongUpDownCounter; +import io.opentelemetry.api.metrics.LongUpDownCounterBuilder; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class MeterTest { + + @RegisterExtension + static final AgentInstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Test + void isEnabled() { + Meter disabledMeter = testing.getOpenTelemetry().getMeter("disabled-meter"); + Meter enabledMeter = testing.getOpenTelemetry().getMeter("enabled-meter"); + testEnabled(disabledMeter, false); + testEnabled(enabledMeter, true); + } + + private static void testEnabled(Meter meter, boolean expected) { + LongCounterBuilder counterBuilder = meter.counterBuilder("test"); + LongCounter longCounter = counterBuilder.build(); + assertThat(longCounter).isInstanceOf(ExtendedLongCounter.class); + assertThat(((ExtendedLongCounter) longCounter).isEnabled()).isEqualTo(expected); + + DoubleCounter doubleCounter = counterBuilder.ofDoubles().build(); + assertThat(doubleCounter).isInstanceOf(ExtendedDoubleCounter.class); + assertThat(((ExtendedDoubleCounter) doubleCounter).isEnabled()).isEqualTo(expected); + + LongUpDownCounterBuilder upDownCounterBuilder = meter.upDownCounterBuilder("test"); + LongUpDownCounter longUpDownCounter = upDownCounterBuilder.build(); + assertThat(longUpDownCounter).isInstanceOf(ExtendedLongUpDownCounter.class); + assertThat(((ExtendedLongUpDownCounter) longUpDownCounter).isEnabled()).isEqualTo(expected); + + DoubleUpDownCounter doubleUpDownCounter = upDownCounterBuilder.ofDoubles().build(); + assertThat(doubleUpDownCounter).isInstanceOf(ExtendedDoubleUpDownCounter.class); + assertThat(((ExtendedDoubleUpDownCounter) doubleUpDownCounter).isEnabled()).isEqualTo(expected); + + DoubleGaugeBuilder gaugeBuilder = meter.gaugeBuilder("test"); + DoubleGauge doubleGauge = gaugeBuilder.build(); + assertThat(doubleGauge).isInstanceOf(ExtendedDoubleGauge.class); + assertThat(((ExtendedDoubleGauge) doubleGauge).isEnabled()).isEqualTo(expected); + + LongGauge longGauge = gaugeBuilder.ofLongs().build(); + assertThat(longGauge).isInstanceOf(ExtendedLongGauge.class); + assertThat(((ExtendedLongGauge) longGauge).isEnabled()).isEqualTo(expected); + + DoubleHistogramBuilder histogramBuilder = meter.histogramBuilder("test"); + DoubleHistogram doubleHistogram = histogramBuilder.build(); + assertThat(doubleHistogram).isInstanceOf(ExtendedDoubleHistogram.class); + assertThat(((ExtendedDoubleHistogram) doubleHistogram).isEnabled()).isEqualTo(expected); + + LongHistogram longHistogram = histogramBuilder.ofLongs().build(); + assertThat(longHistogram).isInstanceOf(ExtendedLongHistogram.class); + assertThat(((ExtendedLongHistogram) longHistogram).isEnabled()).isEqualTo(expected); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/trace/TracerTest.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/trace/TracerTest.java new file mode 100644 index 000000000000..aaf840687d7a --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/trace/TracerTest.java @@ -0,0 +1,117 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.incubator.trace; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import io.opentelemetry.api.incubator.trace.ExtendedSpanBuilder; +import io.opentelemetry.api.incubator.trace.ExtendedTracer; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanId; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceId; +import io.opentelemetry.api.trace.TraceState; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class TracerTest { + + @RegisterExtension + private static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Test + void isEnabled() { + Tracer disabledTracer = testing.getOpenTelemetry().getTracer("disabled-tracer"); + Tracer enabledTracer = testing.getOpenTelemetry().getTracer("enabled-tracer"); + testEnabled(disabledTracer, false); + testEnabled(enabledTracer, true); + } + + private static void testEnabled(Tracer tracer, boolean expected) { + assertThat(tracer).isInstanceOf(ExtendedTracer.class); + assertThat(((ExtendedTracer) tracer).isEnabled()).isEqualTo(expected); + } + + @Test + void extendedSpanBuilder() { + Tracer tracer = testing.getOpenTelemetry().getTracer("test"); + assertThat(tracer).isInstanceOf(ExtendedTracer.class); + ExtendedTracer extendedTracer = (ExtendedTracer) tracer; + + ExtendedSpanBuilder builder = extendedTracer.spanBuilder("test"); + { + Span span = builder.startAndCall(Span::current); + assertThat(span.getSpanContext().getTraceId()).isNotEqualTo(TraceId.getInvalid()); + } + { + Span span = builder.startAndCall(Span::current, (s, t) -> {}); + assertThat(span.getSpanContext().getTraceId()).isNotEqualTo(TraceId.getInvalid()); + } + { + AtomicReference spanRef = new AtomicReference<>(); + assertThatThrownBy( + () -> + builder.startAndCall( + () -> { + throw new IllegalStateException("fail"); + }, + (s, t) -> spanRef.set(s))) + .isInstanceOf(IllegalStateException.class); + assertThat(spanRef.get().getSpanContext().getTraceId()).isNotEqualTo(TraceId.getInvalid()); + } + + { + AtomicReference spanRef = new AtomicReference<>(); + builder.startAndRun(() -> spanRef.set(Span.current())); + assertThat(spanRef.get().getSpanContext().getTraceId()).isNotEqualTo(TraceId.getInvalid()); + } + { + AtomicReference spanRef = new AtomicReference<>(); + builder.startAndRun(() -> spanRef.set(Span.current()), (s, t) -> {}); + assertThat(spanRef.get().getSpanContext().getTraceId()).isNotEqualTo(TraceId.getInvalid()); + } + { + AtomicReference spanRef = new AtomicReference<>(); + assertThatThrownBy( + () -> + builder.startAndRun( + () -> { + throw new IllegalStateException("fail"); + }, + (s, t) -> spanRef.set(s))) + .isInstanceOf(IllegalStateException.class); + assertThat(spanRef.get().getSpanContext().getTraceId()).isNotEqualTo(TraceId.getInvalid()); + } + + Map map = new HashMap<>(); + Context context = + Context.root() + .with( + Span.wrap( + SpanContext.create( + TraceId.fromLongs(0, 1), + SpanId.fromLong(2), + TraceFlags.getDefault(), + TraceState.getDefault()))); + + W3CTraceContextPropagator.getInstance() + .inject(context, map, (m, key, value) -> m.put(key, value)); + builder.setParentFrom(ContextPropagators.create(W3CTraceContextPropagator.getInstance()), map); + Span span = builder.startSpan(); + assertThat(span.getSpanContext().getTraceId()).isEqualTo(TraceId.fromLongs(0, 1)); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/OpenTelemetryApiInstrumentationModule.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/OpenTelemetryApiInstrumentationModule.java new file mode 100644 index 000000000000..cc4363bc1261 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/OpenTelemetryApiInstrumentationModule.java @@ -0,0 +1,48 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50; + +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static java.util.Collections.singletonList; +import static net.bytebuddy.matcher.ElementMatchers.not; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; +import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; + +@AutoService(InstrumentationModule.class) +public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { + public OpenTelemetryApiInstrumentationModule() { + super("opentelemetry-api", "opentelemetry-api-1.50"); + } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + return hasClassesNamed("application.io.opentelemetry.api.common.Value") + .and( + // disable when incubating api is present + not(hasClassesNamed("application.io.opentelemetry.api.incubator.logs.ExtendedLogger")) + // unless the incubating api is at least 1.50, test infra also depends on the + // incubating api, and we can't exclude that like we did for older versions + .or( + hasClassesNamed( + "application.io.opentelemetry.api.incubator.common.ExtendedAttributes"))); + } + + @Override + public List typeInstrumentations() { + return singletonList(new OpenTelemetryInstrumentation()); + } + + @Override + public String getModuleGroup() { + return "opentelemetry-api-bridge"; + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/OpenTelemetryInstrumentation.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/OpenTelemetryInstrumentation.java new file mode 100644 index 000000000000..dc6599343b4b --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/OpenTelemetryInstrumentation.java @@ -0,0 +1,40 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.none; + +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.logs.ApplicationLoggerFactory150; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class OpenTelemetryInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return named("application.io.opentelemetry.api.GlobalOpenTelemetry"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + none(), OpenTelemetryInstrumentation.class.getName() + "$InitAdvice"); + } + + @SuppressWarnings({"ReturnValueIgnored", "unused"}) + public static class InitAdvice { + @Advice.OnMethodEnter + public static void init() { + // the sole purpose of this advice is to ensure that ApplicationLoggerFactory150 is + // recognized as helper class and injected into class loader + ApplicationLoggerFactory150.class.getName(); + } + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/OpenTelemetryApiIncubatorInstrumentationModule.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/OpenTelemetryApiIncubatorInstrumentationModule.java new file mode 100644 index 000000000000..b0d35e3d0b7d --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/OpenTelemetryApiIncubatorInstrumentationModule.java @@ -0,0 +1,39 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.incubator; + +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static java.util.Collections.singletonList; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; +import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; + +@AutoService(InstrumentationModule.class) +public class OpenTelemetryApiIncubatorInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { + public OpenTelemetryApiIncubatorInstrumentationModule() { + super("opentelemetry-api", "opentelemetry-api-1.50", "opentelemetry-api-incubator-1.50"); + } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + return hasClassesNamed("application.io.opentelemetry.api.incubator.common.ExtendedAttributes"); + } + + @Override + public List typeInstrumentations() { + return singletonList(new OpenTelemetryIncubatorInstrumentation()); + } + + @Override + public String getModuleGroup() { + return "opentelemetry-api-bridge"; + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/OpenTelemetryIncubatorInstrumentation.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/OpenTelemetryIncubatorInstrumentation.java new file mode 100644 index 000000000000..d457e6974c37 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/OpenTelemetryIncubatorInstrumentation.java @@ -0,0 +1,46 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.incubator; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.none; + +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_40.incubator.metrics.ApplicationMeterFactory140Incubator; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_47.incubator.trace.ApplicationTracerFactory147Incubator; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.incubator.logs.ApplicationLoggerFactory150Incubator; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class OpenTelemetryIncubatorInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return named("application.io.opentelemetry.api.GlobalOpenTelemetry"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + none(), OpenTelemetryIncubatorInstrumentation.class.getName() + "$InitAdvice"); + } + + @SuppressWarnings({"ReturnValueIgnored", "unused"}) + public static class InitAdvice { + @Advice.OnMethodEnter + public static void init() { + // the sole purpose of this advice is to ensure that ApplicationLoggerFactory150Incubator is + // recognized as helper class and injected into class loader + ApplicationLoggerFactory150Incubator.class.getName(); + // 1.40 instrumentation does not apply on 1.50, we include only the metrics part here + ApplicationMeterFactory140Incubator.class.getName(); + // 1.47 instrumentation does not apply on 1.50, we include only the trace part here + ApplicationTracerFactory147Incubator.class.getName(); + } + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLogRecordBuilder150Incubator.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLogRecordBuilder150Incubator.java new file mode 100644 index 000000000000..eceeaa3dda13 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLogRecordBuilder150Incubator.java @@ -0,0 +1,181 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.incubator.logs; + +import application.io.opentelemetry.api.common.AttributeKey; +import application.io.opentelemetry.api.common.Attributes; +import application.io.opentelemetry.api.common.Value; +import application.io.opentelemetry.api.incubator.common.ExtendedAttributeKey; +import application.io.opentelemetry.api.incubator.common.ExtendedAttributes; +import application.io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder; +import application.io.opentelemetry.api.logs.Severity; +import application.io.opentelemetry.context.Context; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.context.AgentContextStorage; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.trace.Bridging; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.logs.ApplicationLogRecordBuilder150; +import java.time.Instant; +import java.util.concurrent.TimeUnit; +import javax.annotation.Nullable; + +public class ApplicationLogRecordBuilder150Incubator extends ApplicationLogRecordBuilder150 + implements ExtendedLogRecordBuilder { + + private final io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder agentLogRecordBuilder; + + ApplicationLogRecordBuilder150Incubator( + io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder) { + super(agentLogRecordBuilder); + this.agentLogRecordBuilder = + (io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder) agentLogRecordBuilder; + } + + @Override + public ExtendedLogRecordBuilder setEventName(String eventName) { + agentLogRecordBuilder.setEventName(eventName); + return this; + } + + @Override + public ExtendedLogRecordBuilder setTimestamp(long timestamp, TimeUnit unit) { + agentLogRecordBuilder.setTimestamp(timestamp, unit); + return this; + } + + @Override + public ExtendedLogRecordBuilder setTimestamp(Instant instant) { + agentLogRecordBuilder.setTimestamp(instant); + return this; + } + + @Override + public ExtendedLogRecordBuilder setObservedTimestamp(long timestamp, TimeUnit unit) { + agentLogRecordBuilder.setObservedTimestamp(timestamp, unit); + return this; + } + + @Override + public ExtendedLogRecordBuilder setObservedTimestamp(Instant instant) { + agentLogRecordBuilder.setObservedTimestamp(instant); + return this; + } + + @Override + public ExtendedLogRecordBuilder setContext(Context applicationContext) { + agentLogRecordBuilder.setContext(AgentContextStorage.getAgentContext(applicationContext)); + return this; + } + + @Override + public ExtendedLogRecordBuilder setSeverity(Severity severity) { + agentLogRecordBuilder.setSeverity(convertSeverity(severity)); + return this; + } + + @Override + public ExtendedLogRecordBuilder setSeverityText(String severityText) { + agentLogRecordBuilder.setSeverityText(severityText); + return this; + } + + @Override + public ExtendedLogRecordBuilder setBody(String body) { + agentLogRecordBuilder.setBody(body); + return this; + } + + @Override + public ExtendedLogRecordBuilder setBody(Value body) { + agentLogRecordBuilder.setBody(convertValue(body)); + return this; + } + + @Override + public ExtendedLogRecordBuilder setAllAttributes(Attributes applicationAttributes) { + agentLogRecordBuilder.setAllAttributes(Bridging.toAgent(applicationAttributes)); + return this; + } + + @Override + public ExtendedLogRecordBuilder setAllAttributes(ExtendedAttributes attributes) { + return this; + } + + @Override + public ExtendedLogRecordBuilder setAttribute(AttributeKey key, @Nullable T value) { + return (ExtendedLogRecordBuilder) super.setAttribute(key, value); + } + + @Override + public ExtendedLogRecordBuilder setAttribute(ExtendedAttributeKey key, T value) { + return this; + } + + @Override + public ExtendedLogRecordBuilder setException(Throwable throwable) { + agentLogRecordBuilder.setException(throwable); + return this; + } + + private static io.opentelemetry.api.logs.Severity convertSeverity(Severity applicationSeverity) { + if (applicationSeverity == null) { + return null; + } + switch (applicationSeverity) { + case UNDEFINED_SEVERITY_NUMBER: + return io.opentelemetry.api.logs.Severity.UNDEFINED_SEVERITY_NUMBER; + case TRACE: + return io.opentelemetry.api.logs.Severity.TRACE; + case TRACE2: + return io.opentelemetry.api.logs.Severity.TRACE2; + case TRACE3: + return io.opentelemetry.api.logs.Severity.TRACE3; + case TRACE4: + return io.opentelemetry.api.logs.Severity.TRACE4; + case DEBUG: + return io.opentelemetry.api.logs.Severity.DEBUG; + case DEBUG2: + return io.opentelemetry.api.logs.Severity.DEBUG2; + case DEBUG3: + return io.opentelemetry.api.logs.Severity.DEBUG3; + case DEBUG4: + return io.opentelemetry.api.logs.Severity.DEBUG4; + case INFO: + return io.opentelemetry.api.logs.Severity.INFO; + case INFO2: + return io.opentelemetry.api.logs.Severity.INFO2; + case INFO3: + return io.opentelemetry.api.logs.Severity.INFO3; + case INFO4: + return io.opentelemetry.api.logs.Severity.INFO4; + case WARN: + return io.opentelemetry.api.logs.Severity.WARN; + case WARN2: + return io.opentelemetry.api.logs.Severity.WARN2; + case WARN3: + return io.opentelemetry.api.logs.Severity.WARN3; + case WARN4: + return io.opentelemetry.api.logs.Severity.WARN4; + case ERROR: + return io.opentelemetry.api.logs.Severity.ERROR; + case ERROR2: + return io.opentelemetry.api.logs.Severity.ERROR2; + case ERROR3: + return io.opentelemetry.api.logs.Severity.ERROR3; + case ERROR4: + return io.opentelemetry.api.logs.Severity.ERROR4; + case FATAL: + return io.opentelemetry.api.logs.Severity.FATAL; + case FATAL2: + return io.opentelemetry.api.logs.Severity.FATAL2; + case FATAL3: + return io.opentelemetry.api.logs.Severity.FATAL3; + case FATAL4: + return io.opentelemetry.api.logs.Severity.FATAL4; + } + + throw new IllegalStateException("Unhandled severity: " + applicationSeverity.name()); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLogger150Incubator.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLogger150Incubator.java new file mode 100644 index 000000000000..4b6aef6aab9e --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLogger150Incubator.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.incubator.logs; + +import application.io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder; +import application.io.opentelemetry.api.incubator.logs.ExtendedLogger; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLogger; + +class ApplicationLogger150Incubator extends ApplicationLogger implements ExtendedLogger { + + private final io.opentelemetry.api.logs.Logger agentLogger; + + ApplicationLogger150Incubator(io.opentelemetry.api.logs.Logger agentLogger) { + super(agentLogger); + this.agentLogger = agentLogger; + } + + @Override + public boolean isEnabled() { + return ((io.opentelemetry.api.incubator.logs.ExtendedLogger) agentLogger).isEnabled(); + } + + @Override + public ExtendedLogRecordBuilder logRecordBuilder() { + return new ApplicationLogRecordBuilder150Incubator(agentLogger.logRecordBuilder()); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLoggerFactory150Incubator.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLoggerFactory150Incubator.java new file mode 100644 index 000000000000..1fc148cee453 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLoggerFactory150Incubator.java @@ -0,0 +1,19 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.incubator.logs; + +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLogger; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLoggerFactory; + +// this class is used from opentelemetry-api-1.27.0 via reflection +public class ApplicationLoggerFactory150Incubator implements ApplicationLoggerFactory { + + @Override + public ApplicationLogger newLogger(Logger agentLogger) { + return new ApplicationLogger150Incubator(agentLogger); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/ApplicationLogRecordBuilder150.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/ApplicationLogRecordBuilder150.java new file mode 100644 index 000000000000..7a78f78a2e65 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/ApplicationLogRecordBuilder150.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.logs; + +import application.io.opentelemetry.api.logs.LogRecordBuilder; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_42.logs.ApplicationLogRecordBuilder142; + +public class ApplicationLogRecordBuilder150 extends ApplicationLogRecordBuilder142 + implements LogRecordBuilder { + + private final io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder; + + protected ApplicationLogRecordBuilder150( + io.opentelemetry.api.logs.LogRecordBuilder agentLogRecordBuilder) { + super(agentLogRecordBuilder); + this.agentLogRecordBuilder = agentLogRecordBuilder; + } + + @Override + public LogRecordBuilder setEventName(String eventName) { + agentLogRecordBuilder.setEventName(eventName); + return this; + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/ApplicationLogger150.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/ApplicationLogger150.java new file mode 100644 index 000000000000..9556af85a944 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/ApplicationLogger150.java @@ -0,0 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.logs; + +import application.io.opentelemetry.api.logs.LogRecordBuilder; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLogger; + +class ApplicationLogger150 extends ApplicationLogger { + + private final io.opentelemetry.api.logs.Logger agentLogger; + + ApplicationLogger150(io.opentelemetry.api.logs.Logger agentLogger) { + super(agentLogger); + this.agentLogger = agentLogger; + } + + @Override + public LogRecordBuilder logRecordBuilder() { + return new ApplicationLogRecordBuilder150(agentLogger.logRecordBuilder()); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/ApplicationLoggerFactory150.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/ApplicationLoggerFactory150.java new file mode 100644 index 000000000000..9f4400268c98 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/ApplicationLoggerFactory150.java @@ -0,0 +1,19 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.logs; + +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLogger; +import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_27.logs.ApplicationLoggerFactory; + +// this class is used from opentelemetry-api-1.27.0 via reflection +public class ApplicationLoggerFactory150 implements ApplicationLoggerFactory { + + @Override + public ApplicationLogger newLogger(Logger agentLogger) { + return new ApplicationLogger150(agentLogger); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/LoggerTest.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/LoggerTest.java new file mode 100644 index 000000000000..d361682806e5 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/logs/LoggerTest.java @@ -0,0 +1,99 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.logs; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.ValueType; +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.api.logs.Severity; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceState; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.sdk.logs.data.internal.ExtendedLogRecordData; +import io.opentelemetry.sdk.trace.IdGenerator; +import java.time.Instant; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.extension.RegisterExtension; + +class LoggerTest { + + @RegisterExtension + static final AgentInstrumentationExtension testing = AgentInstrumentationExtension.create(); + + private String instrumentationName; + private Logger logger; + + @BeforeEach + void setupLogger(TestInfo test) { + instrumentationName = "test-" + test.getDisplayName(); + logger = + GlobalOpenTelemetry.get() + .getLogsBridge() + .loggerBuilder(instrumentationName) + .setInstrumentationVersion("1.2.3") + .setSchemaUrl("http://schema.org") + .build(); + } + + @Test + void logRecordBuilder() { + assertThat(logger.getClass().getName()).doesNotContain("Incubator"); + + SpanContext spanContext = + SpanContext.create( + IdGenerator.random().generateTraceId(), + IdGenerator.random().generateSpanId(), + TraceFlags.getDefault(), + TraceState.getDefault()); + + logger + .logRecordBuilder() + .setEventName("eventName") + .setTimestamp(1, TimeUnit.SECONDS) + .setTimestamp(Instant.now()) + .setContext(Context.current().with(Span.wrap(spanContext))) + .setSeverity(Severity.DEBUG) + .setSeverityText("debug") + .setBody("body") + .setAttribute(AttributeKey.stringKey("key"), "value") + .setAllAttributes(Attributes.builder().put("key", "value").build()) + .emit(); + + await() + .untilAsserted( + () -> + assertThat(testing.logRecords()) + .satisfiesExactly( + logRecordData -> { + assertThat(logRecordData.getInstrumentationScopeInfo().getName()) + .isEqualTo(instrumentationName); + assertThat(((ExtendedLogRecordData) logRecordData).getEventName()) + .isEqualTo("eventName"); + assertThat(logRecordData.getInstrumentationScopeInfo().getVersion()) + .isEqualTo("1.2.3"); + assertThat(logRecordData.getTimestampEpochNanos()).isGreaterThan(0); + assertThat(logRecordData.getSpanContext()).isEqualTo(spanContext); + assertThat(logRecordData.getSeverity()).isEqualTo(Severity.DEBUG); + assertThat(logRecordData.getSeverityText()).isEqualTo("debug"); + assertThat(logRecordData.getBodyValue().getType()) + .isEqualTo(ValueType.STRING); + assertThat(logRecordData.getBodyValue().getValue()).isEqualTo("body"); + assertThat(logRecordData.getAttributes()) + .isEqualTo(Attributes.builder().put("key", "value").build()); + })); + } +} diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/metadata.yaml b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/metadata.yaml new file mode 100644 index 000000000000..5a03ece2f748 --- /dev/null +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/metadata.yaml @@ -0,0 +1 @@ +classification: internal diff --git a/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/internal/DeclarativeConfigTest.java b/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/internal/DeclarativeConfigTest.java index 4e68c89e765b..e6aec1972730 100644 --- a/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/internal/DeclarativeConfigTest.java +++ b/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/internal/DeclarativeConfigTest.java @@ -17,8 +17,10 @@ import java.util.Set; import java.util.stream.Collectors; import org.assertj.core.api.InstanceOfAssertFactories; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +@Disabled // does not work after declarative config changes class DeclarativeConfigTest { @Test diff --git a/javaagent/build.gradle.kts b/javaagent/build.gradle.kts index 11637af5e7ff..c9839a0bea9a 100644 --- a/javaagent/build.gradle.kts +++ b/javaagent/build.gradle.kts @@ -86,6 +86,7 @@ dependencies { baseJavaagentLibs(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.40:javaagent")) baseJavaagentLibs(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.42:javaagent")) baseJavaagentLibs(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.47:javaagent")) + baseJavaagentLibs(project(":instrumentation:opentelemetry-api:opentelemetry-api-1.50:javaagent")) baseJavaagentLibs(project(":instrumentation:opentelemetry-instrumentation-api:javaagent")) baseJavaagentLibs(project(":instrumentation:opentelemetry-instrumentation-annotations-1.16:javaagent")) baseJavaagentLibs(project(":instrumentation:executors:javaagent")) diff --git a/opentelemetry-api-shaded-for-instrumenting/build.gradle.kts b/opentelemetry-api-shaded-for-instrumenting/build.gradle.kts index 86d8c2084e30..653c76f3158d 100644 --- a/opentelemetry-api-shaded-for-instrumenting/build.gradle.kts +++ b/opentelemetry-api-shaded-for-instrumenting/build.gradle.kts @@ -79,6 +79,13 @@ val v1_47Deps by configurations.creating { exclude("io.opentelemetry", "opentelemetry-bom") exclude("io.opentelemetry", "opentelemetry-bom-alpha") } +val v1_50Deps by configurations.creating { + isCanBeResolved = true + isCanBeConsumed = false + // exclude the bom added by dependencyManagement + exclude("io.opentelemetry", "opentelemetry-bom") + exclude("io.opentelemetry", "opentelemetry-bom-alpha") +} // configuration for publishing the shadowed artifact val v1_10 by configurations.creating { isCanBeConsumed = true @@ -120,6 +127,10 @@ val v1_47 by configurations.creating { isCanBeConsumed = true isCanBeResolved = false } +val v1_50 by configurations.creating { + isCanBeConsumed = true + isCanBeResolved = false +} dependencies { latestDeps("io.opentelemetry:opentelemetry-api") @@ -191,6 +202,11 @@ dependencies { strictly("1.47.0-alpha") } } + v1_50Deps("io.opentelemetry:$it") { + version { + strictly("1.50.0-alpha") + } + } } } @@ -246,6 +262,10 @@ tasks { configurations = listOf(v1_47Deps) archiveClassifier.set("v1_47") } + val v1_50Shadow by registering(ShadowJar::class) { + configurations = listOf(v1_50Deps) + archiveClassifier.set("v1_50") + } artifacts { add(v1_10.name, v1_10Shadow) @@ -258,5 +278,6 @@ tasks { add(v1_40.name, v1_40Shadow) add(v1_42.name, v1_42Shadow) add(v1_47.name, v1_47Shadow) + add(v1_50.name, v1_50Shadow) } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 475455388866..f1e3f353e9d8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -436,6 +436,7 @@ include(":instrumentation:opentelemetry-api:opentelemetry-api-1.38:javaagent") include(":instrumentation:opentelemetry-api:opentelemetry-api-1.40:javaagent") include(":instrumentation:opentelemetry-api:opentelemetry-api-1.42:javaagent") include(":instrumentation:opentelemetry-api:opentelemetry-api-1.47:javaagent") +include(":instrumentation:opentelemetry-api:opentelemetry-api-1.50:javaagent") include(":instrumentation:opentelemetry-extension-annotations-1.0:javaagent") include(":instrumentation:opentelemetry-extension-kotlin-1.0:javaagent") include(":instrumentation:opentelemetry-instrumentation-annotations-1.16:javaagent") From a9d95ab80a20969d2b42a9c689dac0b82cefa22a Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 12 May 2025 20:34:53 +0300 Subject: [PATCH 4/7] fix test --- .../OpenTelemetryApiIncubatorInstrumentationModule.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/OpenTelemetryApiIncubatorInstrumentationModule.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/OpenTelemetryApiIncubatorInstrumentationModule.java index b0d35e3d0b7d..f5c74abbd587 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/OpenTelemetryApiIncubatorInstrumentationModule.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/OpenTelemetryApiIncubatorInstrumentationModule.java @@ -24,7 +24,9 @@ public OpenTelemetryApiIncubatorInstrumentationModule() { @Override public ElementMatcher.Junction classLoaderMatcher() { - return hasClassesNamed("application.io.opentelemetry.api.incubator.common.ExtendedAttributes"); + return hasClassesNamed( + "application.io.opentelemetry.api.common.Value", + "application.io.opentelemetry.api.incubator.common.ExtendedAttributes"); } @Override From 8cce48a2c7490c9bab2787eb8b8a55b30c65281f Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 13 May 2025 12:53:29 +0300 Subject: [PATCH 5/7] add bridging for extended attributes --- .../v1_50/incubator/logs/LoggerTest.java | 28 +++++-- ...plicationLogRecordBuilder150Incubator.java | 71 ++++++++++++++++++ testing-common/build.gradle.kts | 1 + .../common/AgentTestingExporterAccess.java | 73 ++++++++++++++++++- 4 files changed, 166 insertions(+), 7 deletions(-) diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/LoggerTest.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/LoggerTest.java index d0ecd0099b1d..b992d9ead8f5 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/LoggerTest.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/incubatorTest/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/LoggerTest.java @@ -14,6 +14,8 @@ import io.opentelemetry.api.common.KeyValue; import io.opentelemetry.api.common.Value; import io.opentelemetry.api.common.ValueType; +import io.opentelemetry.api.incubator.common.ExtendedAttributeKey; +import io.opentelemetry.api.incubator.common.ExtendedAttributes; import io.opentelemetry.api.incubator.logs.ExtendedLogger; import io.opentelemetry.api.logs.Logger; import io.opentelemetry.api.logs.Severity; @@ -76,8 +78,13 @@ void logRecordBuilder() { .setSeverity(Severity.DEBUG) .setSeverityText("debug") .setBody("body") - .setAttribute(AttributeKey.stringKey("key"), "value") - .setAllAttributes(Attributes.builder().put("key", "value").build()) + .setAttribute(AttributeKey.stringKey("key1"), "value") + .setAttribute(ExtendedAttributeKey.stringKey("key2"), "value") + .setAllAttributes(Attributes.builder().put("key3", "value").build()) + .setAllAttributes(ExtendedAttributes.builder().put("key4", "value").build()) + .setAttribute( + ExtendedAttributeKey.extendedAttributesKey("key5"), + ExtendedAttributes.builder().put("key6", "value").build()) .emit(); await() @@ -88,8 +95,7 @@ void logRecordBuilder() { logRecordData -> { assertThat(logRecordData.getInstrumentationScopeInfo().getName()) .isEqualTo(instrumentationName); - assertThat(((ExtendedLogRecordData) logRecordData).getEventName()) - .isEqualTo("eventName"); + assertThat(logRecordData.getEventName()).isEqualTo("eventName"); assertThat(logRecordData.getInstrumentationScopeInfo().getVersion()) .isEqualTo("1.2.3"); assertThat(logRecordData.getTimestampEpochNanos()).isGreaterThan(0); @@ -99,8 +105,18 @@ void logRecordBuilder() { assertThat(logRecordData.getBodyValue().getType()) .isEqualTo(ValueType.STRING); assertThat(logRecordData.getBodyValue().getValue()).isEqualTo("body"); - assertThat(logRecordData.getAttributes()) - .isEqualTo(Attributes.builder().put("key", "value").build()); + assertThat( + ((ExtendedLogRecordData) logRecordData).getExtendedAttributes()) + .isEqualTo( + ExtendedAttributes.builder() + .put("key1", "value") + .put("key2", "value") + .put("key3", "value") + .put("key4", "value") + .put( + "key5", + ExtendedAttributes.builder().put("key6", "value").build()) + .build()); })); } diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLogRecordBuilder150Incubator.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLogRecordBuilder150Incubator.java index eceeaa3dda13..a6c8decbcece 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLogRecordBuilder150Incubator.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.50/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/v1_50/incubator/logs/ApplicationLogRecordBuilder150Incubator.java @@ -5,6 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.incubator.logs; +import static application.io.opentelemetry.api.incubator.common.ExtendedAttributeType.EXTENDED_ATTRIBUTES; +import static java.util.logging.Level.FINE; + import application.io.opentelemetry.api.common.AttributeKey; import application.io.opentelemetry.api.common.Attributes; import application.io.opentelemetry.api.common.Value; @@ -18,10 +21,13 @@ import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.v1_50.logs.ApplicationLogRecordBuilder150; import java.time.Instant; import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; import javax.annotation.Nullable; public class ApplicationLogRecordBuilder150Incubator extends ApplicationLogRecordBuilder150 implements ExtendedLogRecordBuilder { + private static final Logger logger = + Logger.getLogger(ApplicationLogRecordBuilder150Incubator.class.getName()); private final io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder agentLogRecordBuilder; @@ -100,6 +106,7 @@ public ExtendedLogRecordBuilder setAllAttributes(Attributes applicationAttribute @Override public ExtendedLogRecordBuilder setAllAttributes(ExtendedAttributes attributes) { + agentLogRecordBuilder.setAllAttributes(convertExtendedAttributes(attributes)); return this; } @@ -109,7 +116,16 @@ public ExtendedLogRecordBuilder setAttribute(AttributeKey key, @Nullable } @Override + @SuppressWarnings("unchecked") public ExtendedLogRecordBuilder setAttribute(ExtendedAttributeKey key, T value) { + io.opentelemetry.api.incubator.common.ExtendedAttributeKey agentKey = + convertExtendedAttributeKey(key); + if (agentKey != null) { + if (key.getType() == EXTENDED_ATTRIBUTES) { + value = (T) convertExtendedAttributes((ExtendedAttributes) value); + } + agentLogRecordBuilder.setAttribute(agentKey, value); + } return this; } @@ -178,4 +194,59 @@ private static io.opentelemetry.api.logs.Severity convertSeverity(Severity appli throw new IllegalStateException("Unhandled severity: " + applicationSeverity.name()); } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private static io.opentelemetry.api.incubator.common.ExtendedAttributes convertExtendedAttributes( + ExtendedAttributes applicationAttributes) { + io.opentelemetry.api.incubator.common.ExtendedAttributesBuilder agentAttributes = + io.opentelemetry.api.incubator.common.ExtendedAttributes.builder(); + applicationAttributes.forEach( + (key, value) -> { + io.opentelemetry.api.incubator.common.ExtendedAttributeKey agentKey = + convertExtendedAttributeKey(key); + if (agentKey != null) { + if (key.getType() == EXTENDED_ATTRIBUTES) { + value = convertExtendedAttributes((ExtendedAttributes) value); + } + agentAttributes.put(agentKey, value); + } + }); + return agentAttributes.build(); + } + + @SuppressWarnings({"rawtypes"}) + private static io.opentelemetry.api.incubator.common.ExtendedAttributeKey + convertExtendedAttributeKey(ExtendedAttributeKey applicationKey) { + switch (applicationKey.getType()) { + case STRING: + return io.opentelemetry.api.incubator.common.ExtendedAttributeKey.stringKey( + applicationKey.getKey()); + case BOOLEAN: + return io.opentelemetry.api.incubator.common.ExtendedAttributeKey.booleanKey( + applicationKey.getKey()); + case LONG: + return io.opentelemetry.api.incubator.common.ExtendedAttributeKey.longKey( + applicationKey.getKey()); + case DOUBLE: + return io.opentelemetry.api.incubator.common.ExtendedAttributeKey.doubleKey( + applicationKey.getKey()); + case STRING_ARRAY: + return io.opentelemetry.api.incubator.common.ExtendedAttributeKey.stringArrayKey( + applicationKey.getKey()); + case BOOLEAN_ARRAY: + return io.opentelemetry.api.incubator.common.ExtendedAttributeKey.booleanArrayKey( + applicationKey.getKey()); + case LONG_ARRAY: + return io.opentelemetry.api.incubator.common.ExtendedAttributeKey.longArrayKey( + applicationKey.getKey()); + case DOUBLE_ARRAY: + return io.opentelemetry.api.incubator.common.ExtendedAttributeKey.doubleArrayKey( + applicationKey.getKey()); + case EXTENDED_ATTRIBUTES: + return io.opentelemetry.api.incubator.common.ExtendedAttributeKey.extendedAttributesKey( + applicationKey.getKey()); + } + logger.log(FINE, "unexpected attribute key type: {0}", applicationKey.getType()); + return null; + } } diff --git a/testing-common/build.gradle.kts b/testing-common/build.gradle.kts index 5618cbd4d33a..00a742f5f252 100644 --- a/testing-common/build.gradle.kts +++ b/testing-common/build.gradle.kts @@ -43,6 +43,7 @@ dependencies { api("org.junit.jupiter:junit-jupiter-params") api("io.opentelemetry:opentelemetry-api") + compileOnly("io.opentelemetry:opentelemetry-api-incubator") api("io.opentelemetry:opentelemetry-sdk") api("io.opentelemetry:opentelemetry-sdk-testing") api("io.opentelemetry.semconv:opentelemetry-semconv-incubating") diff --git a/testing-common/src/main/java/io/opentelemetry/javaagent/testing/common/AgentTestingExporterAccess.java b/testing-common/src/main/java/io/opentelemetry/javaagent/testing/common/AgentTestingExporterAccess.java index 2ebd4ef9a59b..aaeb5d890b0e 100644 --- a/testing-common/src/main/java/io/opentelemetry/javaagent/testing/common/AgentTestingExporterAccess.java +++ b/testing-common/src/main/java/io/opentelemetry/javaagent/testing/common/AgentTestingExporterAccess.java @@ -14,6 +14,8 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.common.Value; +import io.opentelemetry.api.incubator.common.ExtendedAttributes; +import io.opentelemetry.api.incubator.common.ExtendedAttributesBuilder; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; @@ -98,6 +100,8 @@ public final class AgentTestingExporterAccess { private static final boolean canUseValue = classAvailable("io.opentelemetry.api.common.Value"); private static final boolean hasExtendedLogRecordData = classAvailable("io.opentelemetry.sdk.logs.data.internal.ExtendedLogRecordData"); + private static final boolean hasExtendedAttributes = + classAvailable("io.opentelemetry.api.incubator.common.ExtendedAttributes"); static { try { @@ -460,9 +464,14 @@ private static LogRecordData createExtendedLogData( TraceState.getDefault())) .setSeverity(fromProto(logRecord.getSeverityNumber())) .setSeverityText(logRecord.getSeverityText()) - .setAttributes(fromProto(logRecord.getAttributesList())) .setEventName(logRecord.getEventName()) .setBodyValue(getBodyValue(logRecord.getBody())); + if (hasExtendedAttributes) { + builder.setExtendedAttributes(fromProtoExtended(logRecord.getAttributesList())); + } else { + builder.setAttributes(fromProto(logRecord.getAttributesList())); + } + return builder.build(); } @@ -609,6 +618,68 @@ private static AggregationTemporality getTemporality( } } + private static ExtendedAttributes fromProtoExtended(List attributes) { + ExtendedAttributesBuilder converted = ExtendedAttributes.builder(); + for (KeyValue attribute : attributes) { + String key = attribute.getKey(); + AnyValue value = attribute.getValue(); + switch (value.getValueCase()) { + case STRING_VALUE: + converted.put(key, value.getStringValue()); + break; + case BOOL_VALUE: + converted.put(key, value.getBoolValue()); + break; + case INT_VALUE: + converted.put(key, value.getIntValue()); + break; + case DOUBLE_VALUE: + converted.put(key, value.getDoubleValue()); + break; + case ARRAY_VALUE: + ArrayValue array = value.getArrayValue(); + if (array.getValuesCount() != 0) { + switch (array.getValues(0).getValueCase()) { + case STRING_VALUE: + converted.put( + stringArrayKey(key), + array.getValuesList().stream().map(AnyValue::getStringValue).collect(toList())); + break; + case BOOL_VALUE: + converted.put( + booleanArrayKey(key), + array.getValuesList().stream().map(AnyValue::getBoolValue).collect(toList())); + break; + case INT_VALUE: + converted.put( + longArrayKey(key), + array.getValuesList().stream().map(AnyValue::getIntValue).collect(toList())); + break; + case DOUBLE_VALUE: + converted.put( + doubleArrayKey(key), + array.getValuesList().stream().map(AnyValue::getDoubleValue).collect(toList())); + break; + case VALUE_NOT_SET: + break; + default: + throw new IllegalStateException( + "Unexpected attribute: " + array.getValues(0).getValueCase()); + } + } + break; + case KVLIST_VALUE: + converted.put(key, fromProtoExtended(value.getKvlistValue().getValuesList())); + break; + case VALUE_NOT_SET: + break; + default: + throw new IllegalStateException("Unexpected attribute: " + value.getValueCase()); + } + } + return converted.build(); + } + private static Attributes fromProto(List attributes) { AttributesBuilder converted = Attributes.builder(); for (KeyValue attribute : attributes) { From 5ab98f4b13a31ba3ff2266d5028612fd2ce9df2c Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 13 May 2025 14:17:04 +0300 Subject: [PATCH 6/7] fix declarative config test --- .../ContainerResourceComponentProvider.java | 2 +- .../HostIdResourceComponentProvider.java | 31 ------------------- .../HostResourceComponentProvider.java | 13 ++++++-- .../internal/OsResourceComponentProvider.java | 24 -------------- .../ProcessResourceComponentProvider.java | 3 +- ...ocessRuntimeResourceComponentProvider.java | 24 -------------- .../internal/ResourceComponentProvider.java | 7 +++-- .../internal/DeclarativeConfigTest.java | 10 +++--- 8 files changed, 24 insertions(+), 90 deletions(-) delete mode 100644 instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/HostIdResourceComponentProvider.java delete mode 100644 instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/OsResourceComponentProvider.java delete mode 100644 instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ProcessRuntimeResourceComponentProvider.java diff --git a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ContainerResourceComponentProvider.java b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ContainerResourceComponentProvider.java index 00b3ffb06686..426f3c2ec9b4 100644 --- a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ContainerResourceComponentProvider.java +++ b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ContainerResourceComponentProvider.java @@ -19,6 +19,6 @@ @AutoService(ComponentProvider.class) public class ContainerResourceComponentProvider extends ResourceComponentProvider { public ContainerResourceComponentProvider() { - super(ContainerResource::get); + super("container", ContainerResource::get); } } diff --git a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/HostIdResourceComponentProvider.java b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/HostIdResourceComponentProvider.java deleted file mode 100644 index 9432f52fac37..000000000000 --- a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/HostIdResourceComponentProvider.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.resources.internal; - -import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.resources.HostIdResource; -import io.opentelemetry.sdk.autoconfigure.spi.Ordered; -import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; - -/** - * Declarative config host id resource provider. - * - *

This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - */ -@SuppressWarnings("rawtypes") -@AutoService(ComponentProvider.class) -public class HostIdResourceComponentProvider extends ResourceComponentProvider implements Ordered { - public HostIdResourceComponentProvider() { - super(HostIdResource::get); - } - - @Override - public int order() { - // Run after cloud provider resource providers - return Integer.MAX_VALUE - 1; - } -} diff --git a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/HostResourceComponentProvider.java b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/HostResourceComponentProvider.java index 806ac10a7c52..8a9b9bc3c36f 100644 --- a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/HostResourceComponentProvider.java +++ b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/HostResourceComponentProvider.java @@ -6,7 +6,10 @@ package io.opentelemetry.instrumentation.resources.internal; import com.google.auto.service.AutoService; +import io.opentelemetry.instrumentation.resources.HostIdResource; import io.opentelemetry.instrumentation.resources.HostResource; +import io.opentelemetry.instrumentation.resources.OsResource; +import io.opentelemetry.sdk.autoconfigure.spi.Ordered; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; /** @@ -17,8 +20,14 @@ */ @SuppressWarnings("rawtypes") @AutoService(ComponentProvider.class) -public class HostResourceComponentProvider extends ResourceComponentProvider { +public class HostResourceComponentProvider extends ResourceComponentProvider implements Ordered { public HostResourceComponentProvider() { - super(HostResource::get); + super("host", () -> HostResource.get().merge(HostIdResource.get()).merge(OsResource.get())); + } + + @Override + public int order() { + // Run after cloud provider resource providers + return Integer.MAX_VALUE - 1; } } diff --git a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/OsResourceComponentProvider.java b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/OsResourceComponentProvider.java deleted file mode 100644 index de7b78d656a8..000000000000 --- a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/OsResourceComponentProvider.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.resources.internal; - -import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.resources.OsResource; -import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; - -/** - * Declarative config os resource provider. - * - *

This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - */ -@SuppressWarnings("rawtypes") -@AutoService(ComponentProvider.class) -public class OsResourceComponentProvider extends ResourceComponentProvider { - public OsResourceComponentProvider() { - super(OsResource::get); - } -} diff --git a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ProcessResourceComponentProvider.java b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ProcessResourceComponentProvider.java index 273b4397e5f3..cbdb53ad2c6f 100644 --- a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ProcessResourceComponentProvider.java +++ b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ProcessResourceComponentProvider.java @@ -7,6 +7,7 @@ import com.google.auto.service.AutoService; import io.opentelemetry.instrumentation.resources.ProcessResource; +import io.opentelemetry.instrumentation.resources.ProcessRuntimeResource; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; /** @@ -19,6 +20,6 @@ @AutoService(ComponentProvider.class) public class ProcessResourceComponentProvider extends ResourceComponentProvider { public ProcessResourceComponentProvider() { - super(ProcessResource::get); + super("process", () -> ProcessResource.get().merge(ProcessRuntimeResource.get())); } } diff --git a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ProcessRuntimeResourceComponentProvider.java b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ProcessRuntimeResourceComponentProvider.java deleted file mode 100644 index 8254ddeab359..000000000000 --- a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ProcessRuntimeResourceComponentProvider.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.resources.internal; - -import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.resources.ProcessRuntimeResource; -import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; - -/** - * Declarative config process runtime resource provider. - * - *

This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - */ -@SuppressWarnings("rawtypes") -@AutoService(ComponentProvider.class) -public class ProcessRuntimeResourceComponentProvider extends ResourceComponentProvider { - public ProcessRuntimeResourceComponentProvider() { - super(ProcessRuntimeResource::get); - } -} diff --git a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ResourceComponentProvider.java b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ResourceComponentProvider.java index e228d34a641a..04508560f883 100644 --- a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ResourceComponentProvider.java +++ b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/ResourceComponentProvider.java @@ -13,9 +13,11 @@ /** Abstract class to simply {@link Resource} {@link ComponentProvider} implementations. */ abstract class ResourceComponentProvider implements ComponentProvider { + private final String name; private final Supplier supplier; - ResourceComponentProvider(Supplier supplier) { + ResourceComponentProvider(String name, Supplier supplier) { + this.name = name; this.supplier = supplier; } @@ -26,8 +28,7 @@ public Class getType() { @Override public String getName() { - // getName() is unused for Resource ComponentProviders - return "unused"; + return name; } @Override diff --git a/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/internal/DeclarativeConfigTest.java b/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/internal/DeclarativeConfigTest.java index e6aec1972730..de5d0e65888a 100644 --- a/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/internal/DeclarativeConfigTest.java +++ b/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/internal/DeclarativeConfigTest.java @@ -17,21 +17,23 @@ import java.util.Set; import java.util.stream.Collectors; import org.assertj.core.api.InstanceOfAssertFactories; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -@Disabled // does not work after declarative config changes class DeclarativeConfigTest { @Test void endToEnd() { String yaml = - "file_format: 0.3\n" + "file_format: \"0.4\"\n" + + "tracer_provider:\n" + "resource:\n" + " attributes:\n" + " - name: service.name\n" + " value: my-service\n" - + "tracer_provider:\n"; + + " detection/development:\n" + + " detectors:\n" + + " - host:\n" + + " - process:\n"; boolean java8 = "1.8".equals(System.getProperty("java.specification.version")); OpenTelemetrySdk openTelemetrySdk = From cf222387ed45fc77b396b8c336e099b0c4d4a268 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 15 May 2025 19:14:38 +0300 Subject: [PATCH 7/7] remove ordered --- .../internal/HostResourceComponentProvider.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/HostResourceComponentProvider.java b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/HostResourceComponentProvider.java index 8a9b9bc3c36f..dd0b0f519cfd 100644 --- a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/HostResourceComponentProvider.java +++ b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/internal/HostResourceComponentProvider.java @@ -9,7 +9,6 @@ import io.opentelemetry.instrumentation.resources.HostIdResource; import io.opentelemetry.instrumentation.resources.HostResource; import io.opentelemetry.instrumentation.resources.OsResource; -import io.opentelemetry.sdk.autoconfigure.spi.Ordered; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; /** @@ -20,14 +19,8 @@ */ @SuppressWarnings("rawtypes") @AutoService(ComponentProvider.class) -public class HostResourceComponentProvider extends ResourceComponentProvider implements Ordered { +public class HostResourceComponentProvider extends ResourceComponentProvider { public HostResourceComponentProvider() { super("host", () -> HostResource.get().merge(HostIdResource.get()).merge(OsResource.get())); } - - @Override - public int order() { - // Run after cloud provider resource providers - return Integer.MAX_VALUE - 1; - } }