diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 3b6204be20c0..0a4dea95f86a 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -46,8 +46,8 @@ "groupName": "quarkus packages" }, { - "matchPackagePrefixes": ["com.gradle.enterprise"], - "groupName": "gradle enterprise packages" + "matchPackagePrefixes": ["com.gradle.develocity"], + "groupName": "gradle develocity packages" }, { "matchPackagePrefixes": ["org.eclipse.jetty:"], diff --git a/.github/workflows/codeql-daily.yml b/.github/workflows/codeql-daily.yml index 80c753de2267..b21557f55697 100644 --- a/.github/workflows/codeql-daily.yml +++ b/.github/workflows/codeql-daily.yml @@ -30,7 +30,7 @@ jobs: java-version-file: .java-version - name: Initialize CodeQL - uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 + uses: github/codeql-action/init@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 with: languages: java # using "latest" helps to keep up with the latest Kotlin support @@ -45,7 +45,7 @@ jobs: run: ./gradlew assemble -x javadoc --no-build-cache --no-daemon - name: Perform CodeQL analysis - uses: github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 + uses: github/codeql-action/analyze@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 workflow-notification: needs: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2b112aa68513..e4c97daf23a2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -249,6 +249,8 @@ jobs: run: .github/scripts/use-cla-approved-github-bot.sh - name: Wait for release to be available in maven central + env: + VERSION: ${{ needs.release.outputs.version }} run: | until curl --silent \ --show-error \ diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index bf6161762dfa..28ee18ecb38a 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -64,6 +64,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 + uses: github/codeql-action/upload-sarif@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 with: sarif_file: results.sarif diff --git a/CHANGELOG.md b/CHANGELOG.md index 92e019ebd390..8ab04afa2249 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,59 @@ ## Unreleased +## Version 2.10.0 (2024-11-13) + +### 🌟 New javaagent instrumentation + +- Ktor 3 instrumentation + ([#12562](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12562)) + +### 🌟 New library instrumentation + +- Ktor 3 instrumentation + ([#12562](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12562)) + +### Migration notes + +- Spring Boot Starter Scheduling instrumentation scope name changed from + `io.opentelemetry.spring-scheduling-3.1` to `io.opentelemetry.spring-boot-autoconfigure` + to reflect the module's name. +- Default flush timeout for aws lambda javaagent instrumentation changed from 1 second + to 10 seconds to match the flush timeout used in the aws lambda library instrumentation. + ([#12576](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12576)) + +### 📈 Enhancements + +- Delegate loading of java package to platform loader + ([#12505](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12505)) +- Set up virtual field transforms before otel sdk is initialized + ([#12444](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12444)) - Update azure-core-tracing-opentelemetry version and improve HTTP suppression to back off - when Azure SDK tracing was disabled. + when Azure SDK tracing is disabled. ([#12489](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12489)) +- Ktor2 http client uses low level instrumentation + ([#12530](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12530)) +- Add logback mdc instrumentation to spring boot starter + ([#12515](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12515)) +- Run class load listener only once + ([#12565](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12565)) +- Remove duplicate byte buddy classes to reduce agent jar file size + ([#12571](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12571)) +- Support additional JVM arg syntax in service name resource detector + ([#12544](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12544)) + +### 🛠️ Bug fixes + +- Fix derby directory connection string parser + ([#12479](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12479)) +- Improve whitespace handling in oracle jdbc url parser + ([#12512](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12512)) +- Fix SpanKey bridging for unbridgeable span + ([#12511](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12511)) +- Fix lettuce instrumentation and tests to pass against latest version + ([#12552](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12552)) +- Fix Kafka initialization occasionally failed due to concurrent injection of OpenTelemetryMetricsReporter + ([#12583](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12583)) ## Version 2.9.0 (2024-10-17) diff --git a/benchmark-overhead/src/test/java/io/opentelemetry/containers/K6Container.java b/benchmark-overhead/src/test/java/io/opentelemetry/containers/K6Container.java index 7f6994d1a5d7..419c5e9b91b7 100644 --- a/benchmark-overhead/src/test/java/io/opentelemetry/containers/K6Container.java +++ b/benchmark-overhead/src/test/java/io/opentelemetry/containers/K6Container.java @@ -35,7 +35,7 @@ public K6Container( public GenericContainer build() { String k6OutputFile = namingConventions.container.k6Results(agent); - return new GenericContainer<>(DockerImageName.parse("loadimpact/k6")) + return new GenericContainer<>(DockerImageName.parse("grafana/k6")) .withNetwork(network) .withNetworkAliases("k6") .withLogConsumer(new Slf4jLogConsumer(logger)) diff --git a/conventions/build.gradle.kts b/conventions/build.gradle.kts index 894632110425..88afc93817b6 100644 --- a/conventions/build.gradle.kts +++ b/conventions/build.gradle.kts @@ -59,7 +59,7 @@ dependencies { implementation("gradle.plugin.com.google.protobuf:protobuf-gradle-plugin:0.8.18") implementation("com.gradleup.shadow:shadow-gradle-plugin:8.3.5") implementation("org.apache.httpcomponents:httpclient:4.5.14") - implementation("com.gradle.develocity:com.gradle.develocity.gradle.plugin:3.18.1") + implementation("com.gradle.develocity:com.gradle.develocity.gradle.plugin:3.18.2") implementation("org.owasp:dependency-check-gradle:11.1.0") implementation("ru.vyarus:gradle-animalsniffer-plugin:1.7.1") implementation("org.spdx:spdx-gradle-plugin:0.8.0") @@ -69,7 +69,7 @@ dependencies { implementation("me.champeau.jmh:jmh-gradle-plugin:0.7.2") implementation("net.ltgt.gradle:gradle-errorprone-plugin:4.1.0") implementation("net.ltgt.gradle:gradle-nullaway-plugin:2.1.0") - implementation("me.champeau.gradle:japicmp-gradle-plugin:0.4.4") + implementation("me.champeau.gradle:japicmp-gradle-plugin:0.4.5") testImplementation(enforcedPlatform("org.junit:junit-bom:5.11.3")) testImplementation("org.junit.jupiter:junit-jupiter-api") diff --git a/conventions/src/main/kotlin/otel.java-conventions.gradle.kts b/conventions/src/main/kotlin/otel.java-conventions.gradle.kts index 3f20f0ed8216..fa08fe38cc7a 100644 --- a/conventions/src/main/kotlin/otel.java-conventions.gradle.kts +++ b/conventions/src/main/kotlin/otel.java-conventions.gradle.kts @@ -143,7 +143,7 @@ abstract class NettyAlignmentRule : ComponentMetadataRule { with(ctx.details) { if (id.group == "io.netty" && id.name != "netty") { if (id.version.startsWith("4.1.")) { - belongsTo("io.netty:netty-bom:4.1.114.Final", false) + belongsTo("io.netty:netty-bom:4.1.115.Final", false) } else if (id.version.startsWith("4.0.")) { belongsTo("io.netty:netty-bom:4.0.56.Final", false) } @@ -161,7 +161,7 @@ dependencies { compileOnly("com.google.errorprone:error_prone_annotations") codenarc("org.codenarc:CodeNarc:3.5.0") - codenarc(platform("org.codehaus.groovy:groovy-bom:3.0.22")) + codenarc(platform("org.codehaus.groovy:groovy-bom:3.0.23")) modules { // checkstyle uses the very old google-collections which causes Java 9 module conflict with @@ -434,7 +434,7 @@ codenarc { checkstyle { configFile = rootProject.file("buildscripts/checkstyle.xml") // this version should match the version of google_checks.xml used as basis for above configuration - toolVersion = "10.20.0" + toolVersion = "10.20.1" maxWarnings = 0 } diff --git a/dependencyManagement/build.gradle.kts b/dependencyManagement/build.gradle.kts index 56ecaa54ae01..8b478a3d7917 100644 --- a/dependencyManagement/build.gradle.kts +++ b/dependencyManagement/build.gradle.kts @@ -8,12 +8,12 @@ val dependencyVersions = hashMapOf() rootProject.extra["versions"] = dependencyVersions // this line is managed by .github/scripts/update-sdk-version.sh -val otelSdkVersion = "1.43.0" +val otelSdkVersion = "1.44.1" val otelContribVersion = "1.40.0-alpha" val otelSdkAlphaVersion = otelSdkVersion.replaceFirst("(-SNAPSHOT)?$".toRegex(), "-alpha$1") // Need both BOM and groovy jars -val groovyVersion = "4.0.23" +val groovyVersion = "4.0.24" // We don't force libraries we instrument to new versions since we compile and test against specific // old baseline versions but we do try to force those libraries' transitive dependencies to new diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt index 84c7ec708367..79f1f06b721f 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-instrumentation-annotations-2.10.0-SNAPSHOT.jar against opentelemetry-instrumentation-annotations-2.9.0.jar +Comparing source compatibility of opentelemetry-instrumentation-annotations-2.11.0-SNAPSHOT.jar against opentelemetry-instrumentation-annotations-2.10.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-api.txt b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-api.txt index a7162c2594c7..c09bab2b8f36 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-api.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-api.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-instrumentation-api-2.10.0-SNAPSHOT.jar against opentelemetry-instrumentation-api-2.9.0.jar +Comparing source compatibility of opentelemetry-instrumentation-api-2.11.0-SNAPSHOT.jar against opentelemetry-instrumentation-api-2.10.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-autoconfigure.txt b/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-autoconfigure.txt index cbd60e06475f..409d0e3e7b4f 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-autoconfigure.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-autoconfigure.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-spring-boot-autoconfigure-2.10.0-SNAPSHOT.jar against opentelemetry-spring-boot-autoconfigure-2.9.0.jar +Comparing source compatibility of opentelemetry-spring-boot-autoconfigure-2.11.0-SNAPSHOT.jar against opentelemetry-spring-boot-autoconfigure-2.10.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-starter.txt b/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-starter.txt index 14eda4096401..3a320c59c805 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-starter.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-starter.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-spring-boot-starter-2.10.0-SNAPSHOT.jar against opentelemetry-spring-boot-starter-2.9.0.jar +Comparing source compatibility of opentelemetry-spring-boot-starter-2.11.0-SNAPSHOT.jar against opentelemetry-spring-boot-starter-2.10.0.jar No changes. \ No newline at end of file diff --git a/docs/contributing/debugging.md b/docs/contributing/debugging.md index 4885c26412f9..ba9cbedce2b5 100644 --- a/docs/contributing/debugging.md +++ b/docs/contributing/debugging.md @@ -64,6 +64,10 @@ builds by adding the following to `~/.gradle/gradle.properties` before building. disableShadowRelocate=true ``` +WARNING: disabling shadow renaming will make some of the tests fail. In some cases it can also make +tests pass when they really should be failing. Use with caution and be prepared for unexpected +behavior. + ## Missing GraalVM hints Enable the GraalVM tracing agent: diff --git a/docs/supported-libraries.md b/docs/supported-libraries.md index 36d5c334f1d6..74bea2ded278 100644 --- a/docs/supported-libraries.md +++ b/docs/supported-libraries.md @@ -92,7 +92,7 @@ These are the supported libraries and frameworks: | [Jodd Http](https://http.jodd.org/) | 4.2+ | N/A | [HTTP Client Spans], [HTTP Client Metrics] | | [JSP](https://javaee.github.io/javaee-spec/javadocs/javax/servlet/jsp/package-summary.html) | 2.3+ | N/A | Controller Spans [3] | | [Kotlin Coroutines](https://kotlinlang.org/docs/coroutines-overview.html) | 1.0+ | N/A | Context propagation | -| [Ktor](https://github.com/ktorio/ktor) | 1.0+ | [opentelemetry-ktor-1.0](../instrumentation/ktor/ktor-1.0/library),
[opentelemetry-ktor-2.0](../instrumentation/ktor/ktor-2.0/library) | [HTTP Client Spans], [HTTP Client Metrics], [HTTP Server Spans], [HTTP Server Metrics] | +| [Ktor](https://github.com/ktorio/ktor) | 1.0+ | [opentelemetry-ktor-1.0](../instrumentation/ktor/ktor-1.0/library),
[opentelemetry-ktor-2.0](../instrumentation/ktor/ktor-2.0/library),
[opentelemetry-ktor-3.0](../instrumentation/ktor/ktor-3.0/library) | [HTTP Client Spans], [HTTP Client Metrics], [HTTP Server Spans], [HTTP Server Metrics] | | [Kubernetes Client](https://github.com/kubernetes-client/java) | 7.0+ | N/A | [HTTP Client Spans] | | [Lettuce](https://github.com/lettuce-io/lettuce-core) | 4.0+ | [opentelemetry-lettuce-5.1](../instrumentation/lettuce/lettuce-5.1/library) | [Database Client Spans] | | [Log4j 1](https://logging.apache.org/log4j/1.2/) | 1.2+ | N/A | none | diff --git a/examples/distro/build.gradle b/examples/distro/build.gradle index 272edd1ad024..a379c0a9fcac 100644 --- a/examples/distro/build.gradle +++ b/examples/distro/build.gradle @@ -14,7 +14,7 @@ buildscript { dependencies { classpath "com.diffplug.spotless:spotless-plugin-gradle:6.25.0" classpath "com.gradleup.shadow:shadow-gradle-plugin:8.3.5" - classpath "io.opentelemetry.instrumentation:gradle-plugins:2.10.0-alpha-SNAPSHOT" + classpath "io.opentelemetry.instrumentation:gradle-plugins:2.11.0-alpha-SNAPSHOT" } } @@ -27,11 +27,11 @@ subprojects { ext { versions = [ // this line is managed by .github/scripts/update-sdk-version.sh - opentelemetrySdk : "1.43.0", + opentelemetrySdk : "1.44.1", // these lines are managed by .github/scripts/update-version.sh - opentelemetryJavaagent : "2.10.0-SNAPSHOT", - opentelemetryJavaagentAlpha: "2.10.0-alpha-SNAPSHOT", + opentelemetryJavaagent : "2.11.0-SNAPSHOT", + opentelemetryJavaagentAlpha: "2.11.0-alpha-SNAPSHOT", autoservice : "1.1.1", junit : "5.11.3" diff --git a/examples/extension/build.gradle b/examples/extension/build.gradle index d0fd2791bb7e..eca76678b076 100644 --- a/examples/extension/build.gradle +++ b/examples/extension/build.gradle @@ -13,8 +13,8 @@ plugins { id "com.gradleup.shadow" version "8.3.5" id "com.diffplug.spotless" version "6.25.0" - id "io.opentelemetry.instrumentation.muzzle-generation" version "2.10.0-alpha-SNAPSHOT" - id "io.opentelemetry.instrumentation.muzzle-check" version "2.10.0-alpha-SNAPSHOT" + id "io.opentelemetry.instrumentation.muzzle-generation" version "2.11.0-alpha-SNAPSHOT" + id "io.opentelemetry.instrumentation.muzzle-check" version "2.11.0-alpha-SNAPSHOT" } group 'io.opentelemetry.example' @@ -23,11 +23,11 @@ version '1.0' ext { versions = [ // this line is managed by .github/scripts/update-sdk-version.sh - opentelemetrySdk : "1.43.0", + opentelemetrySdk : "1.44.1", // these lines are managed by .github/scripts/update-version.sh - opentelemetryJavaagent : "2.10.0-SNAPSHOT", - opentelemetryJavaagentAlpha: "2.10.0-alpha-SNAPSHOT", + opentelemetryJavaagent : "2.11.0-SNAPSHOT", + opentelemetryJavaagentAlpha: "2.11.0-alpha-SNAPSHOT", junit : "5.11.3" ] diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/network/internal/InternalNetworkAttributesExtractor.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/network/internal/InternalNetworkAttributesExtractor.java index 7d0cb9eea012..3752c0252713 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/network/internal/InternalNetworkAttributesExtractor.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/network/internal/InternalNetworkAttributesExtractor.java @@ -33,18 +33,23 @@ public InternalNetworkAttributesExtractor( } public void onEnd(AttributesBuilder attributes, REQUEST request, @Nullable RESPONSE response) { - String protocolName = lowercase(getter.getNetworkProtocolName(request, response)); - String protocolVersion = lowercase(getter.getNetworkProtocolVersion(request, response)); - if (captureProtocolAttributes) { - String transport = lowercase(getter.getNetworkTransport(request, response)); - internalSet(attributes, NetworkAttributes.NETWORK_TRANSPORT, transport); + internalSet( + attributes, + NetworkAttributes.NETWORK_TRANSPORT, + lowercase(getter.getNetworkTransport(request, response))); internalSet( attributes, NetworkAttributes.NETWORK_TYPE, lowercase(getter.getNetworkType(request, response))); - internalSet(attributes, NetworkAttributes.NETWORK_PROTOCOL_NAME, protocolName); - internalSet(attributes, NetworkAttributes.NETWORK_PROTOCOL_VERSION, protocolVersion); + internalSet( + attributes, + NetworkAttributes.NETWORK_PROTOCOL_NAME, + lowercase(getter.getNetworkProtocolName(request, response))); + internalSet( + attributes, + NetworkAttributes.NETWORK_PROTOCOL_VERSION, + lowercase(getter.getNetworkProtocolVersion(request, response))); } if (captureLocalSocketAttributes) { diff --git a/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTest.java b/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTest.java index b33be477f625..c1051d03faff 100644 --- a/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTest.java +++ b/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTest.java @@ -8,6 +8,14 @@ import static io.opentelemetry.instrumentation.testing.GlobalTraceUtil.runWithSpan; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; @@ -16,8 +24,6 @@ import io.opentelemetry.instrumentation.test.utils.PortUtils; import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import java.lang.reflect.Field; import java.net.InetAddress; @@ -129,29 +135,26 @@ void testApacheDubboBase() throws ReflectiveOperationException { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - RpcIncubatingAttributes.RPC_SYSTEM, + RPC_SYSTEM, RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "org.apache.dubbo.rpc.service.GenericService"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "$invoke"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - satisfies( - ServerAttributes.SERVER_PORT, k -> k.isInstanceOf(Long.class)), + equalTo(RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), + equalTo(RPC_METHOD, "$invoke"), + equalTo(SERVER_ADDRESS, "localhost"), + satisfies(SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, + NETWORK_PEER_ADDRESS, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(String.class))), satisfies( - NetworkAttributes.NETWORK_PEER_PORT, + NETWORK_PEER_PORT, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(Long.class))), satisfies( - NetworkAttributes.NETWORK_TYPE, + NETWORK_TYPE, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), @@ -164,20 +167,15 @@ void testApacheDubboBase() throws ReflectiveOperationException { .hasParent(trace.getSpan(1)) .hasAttributesSatisfying( equalTo( - RpcIncubatingAttributes.RPC_SYSTEM, + RPC_SYSTEM, RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( - RpcIncubatingAttributes.RPC_SERVICE, + RPC_SERVICE, "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "hello"), - satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, - k -> k.isInstanceOf(String.class)), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - k -> k.isInstanceOf(Long.class)), - satisfies( - NetworkAttributes.NETWORK_TYPE, AbstractAssert::isNull)))); + equalTo(RPC_METHOD, "hello"), + satisfies(NETWORK_PEER_ADDRESS, k -> k.isInstanceOf(String.class)), + satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class)), + satisfies(NETWORK_TYPE, AbstractAssert::isNull)))); } @Test @@ -229,29 +227,26 @@ void testApacheDubboTest() .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - RpcIncubatingAttributes.RPC_SYSTEM, + RPC_SYSTEM, RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "org.apache.dubbo.rpc.service.GenericService"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "$invokeAsync"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - satisfies( - ServerAttributes.SERVER_PORT, k -> k.isInstanceOf(Long.class)), + equalTo(RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), + equalTo(RPC_METHOD, "$invokeAsync"), + equalTo(SERVER_ADDRESS, "localhost"), + satisfies(SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, + NETWORK_PEER_ADDRESS, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(String.class))), satisfies( - NetworkAttributes.NETWORK_PEER_PORT, + NETWORK_PEER_PORT, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(Long.class))), satisfies( - NetworkAttributes.NETWORK_TYPE, + NETWORK_TYPE, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), @@ -264,20 +259,16 @@ void testApacheDubboTest() .hasParent(trace.getSpan(1)) .hasAttributesSatisfying( equalTo( - RpcIncubatingAttributes.RPC_SYSTEM, + RPC_SYSTEM, RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( - RpcIncubatingAttributes.RPC_SERVICE, + RPC_SERVICE, "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "hello"), - satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, - k -> k.isInstanceOf(String.class)), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - k -> k.isInstanceOf(Long.class)), + equalTo(RPC_METHOD, "hello"), + satisfies(NETWORK_PEER_ADDRESS, k -> k.isInstanceOf(String.class)), + satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( - NetworkAttributes.NETWORK_TYPE, + NETWORK_TYPE, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), diff --git a/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTraceChainTest.java b/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTraceChainTest.java index 8eaa9368f719..f1d7a28dd75d 100644 --- a/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTraceChainTest.java +++ b/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTraceChainTest.java @@ -8,6 +8,14 @@ import static io.opentelemetry.instrumentation.testing.GlobalTraceUtil.runWithSpan; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; @@ -18,8 +26,6 @@ import io.opentelemetry.instrumentation.test.utils.PortUtils; import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import java.lang.reflect.Field; import java.net.InetAddress; @@ -172,29 +178,26 @@ void testDubboChain() throws ReflectiveOperationException { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - RpcIncubatingAttributes.RPC_SYSTEM, + RPC_SYSTEM, RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "org.apache.dubbo.rpc.service.GenericService"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "$invoke"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - satisfies( - ServerAttributes.SERVER_PORT, k -> k.isInstanceOf(Long.class)), + equalTo(RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), + equalTo(RPC_METHOD, "$invoke"), + equalTo(SERVER_ADDRESS, "localhost"), + satisfies(SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, + NETWORK_PEER_ADDRESS, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(String.class))), satisfies( - NetworkAttributes.NETWORK_PEER_PORT, + NETWORK_PEER_PORT, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(Long.class))), satisfies( - NetworkAttributes.NETWORK_TYPE, + NETWORK_TYPE, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), @@ -207,20 +210,16 @@ void testDubboChain() throws ReflectiveOperationException { .hasParent(trace.getSpan(1)) .hasAttributesSatisfying( equalTo( - RpcIncubatingAttributes.RPC_SYSTEM, + RPC_SYSTEM, RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( - RpcIncubatingAttributes.RPC_SERVICE, + RPC_SERVICE, "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "hello"), - satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, - k -> k.isInstanceOf(String.class)), + equalTo(RPC_METHOD, "hello"), + satisfies(NETWORK_PEER_ADDRESS, k -> k.isInstanceOf(String.class)), + satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - k -> k.isInstanceOf(Long.class)), - satisfies( - NetworkAttributes.NETWORK_TYPE, + NETWORK_TYPE, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), @@ -232,29 +231,26 @@ void testDubboChain() throws ReflectiveOperationException { .hasParent(trace.getSpan(2)) .hasAttributesSatisfyingExactly( equalTo( - RpcIncubatingAttributes.RPC_SYSTEM, + RPC_SYSTEM, RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "org.apache.dubbo.rpc.service.GenericService"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "$invoke"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - satisfies( - ServerAttributes.SERVER_PORT, k -> k.isInstanceOf(Long.class)), + equalTo(RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), + equalTo(RPC_METHOD, "$invoke"), + equalTo(SERVER_ADDRESS, "localhost"), + satisfies(SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, + NETWORK_PEER_ADDRESS, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(String.class))), satisfies( - NetworkAttributes.NETWORK_PEER_PORT, + NETWORK_PEER_PORT, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(Long.class))), satisfies( - NetworkAttributes.NETWORK_TYPE, + NETWORK_TYPE, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), @@ -267,20 +263,16 @@ void testDubboChain() throws ReflectiveOperationException { .hasParent(trace.getSpan(3)) .hasAttributesSatisfying( equalTo( - RpcIncubatingAttributes.RPC_SYSTEM, + RPC_SYSTEM, RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( - RpcIncubatingAttributes.RPC_SERVICE, + RPC_SERVICE, "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "hello"), + equalTo(RPC_METHOD, "hello"), + satisfies(NETWORK_PEER_ADDRESS, k -> k.isInstanceOf(String.class)), + satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, - k -> k.isInstanceOf(String.class)), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - k -> k.isInstanceOf(Long.class)), - satisfies( - NetworkAttributes.NETWORK_TYPE, + NETWORK_TYPE, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), @@ -353,29 +345,26 @@ void testDubboChainInJvm() throws ReflectiveOperationException { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - RpcIncubatingAttributes.RPC_SYSTEM, + RPC_SYSTEM, RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "org.apache.dubbo.rpc.service.GenericService"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "$invoke"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), + equalTo(RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), + equalTo(RPC_METHOD, "$invoke"), + equalTo(SERVER_ADDRESS, "localhost"), + satisfies(SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( - ServerAttributes.SERVER_PORT, k -> k.isInstanceOf(Long.class)), - satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, + NETWORK_PEER_ADDRESS, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(String.class))), satisfies( - NetworkAttributes.NETWORK_PEER_PORT, + NETWORK_PEER_PORT, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(Long.class))), satisfies( - NetworkAttributes.NETWORK_TYPE, + NETWORK_TYPE, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), @@ -388,20 +377,16 @@ void testDubboChainInJvm() throws ReflectiveOperationException { .hasParent(trace.getSpan(1)) .hasAttributesSatisfying( equalTo( - RpcIncubatingAttributes.RPC_SYSTEM, + RPC_SYSTEM, RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( - RpcIncubatingAttributes.RPC_SERVICE, + RPC_SERVICE, "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "hello"), - satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, - k -> k.isInstanceOf(String.class)), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - k -> k.isInstanceOf(Long.class)), + equalTo(RPC_METHOD, "hello"), + satisfies(NETWORK_PEER_ADDRESS, k -> k.isInstanceOf(String.class)), + satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( - NetworkAttributes.NETWORK_TYPE, + NETWORK_TYPE, k -> k.satisfiesAnyOf( val -> assertThat(val).isNull(), diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/AbstractApacheHttpClientTest.java b/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/AbstractApacheHttpClientTest.java index cf804e182196..f4f8210f39ba 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/AbstractApacheHttpClientTest.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/AbstractApacheHttpClientTest.java @@ -5,11 +5,12 @@ package io.opentelemetry.javaagent.instrumentation.apachehttpclient.v5_0; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; + import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.NetworkAttributes; import java.net.URI; import java.time.Duration; import java.util.HashSet; @@ -40,7 +41,7 @@ protected Set> getHttpAttributes(URI uri) { || "https://192.0.2.1/".equals(uri.toString()) || uri.toString().contains("/read-timeout") || uri.toString().contains("/circular-redirect")) { - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); } return attributes; } diff --git a/instrumentation/armeria/armeria-1.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaHttp2Test.java b/instrumentation/armeria/armeria-1.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaHttp2Test.java index 4351adc47c4c..0c82f9730e70 100644 --- a/instrumentation/armeria/armeria-1.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaHttp2Test.java +++ b/instrumentation/armeria/armeria-1.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaHttp2Test.java @@ -7,6 +7,19 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ClientAttributes.CLIENT_ADDRESS; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.UrlAttributes.URL_PATH; +import static io.opentelemetry.semconv.UrlAttributes.URL_SCHEME; +import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL; import static org.assertj.core.api.Assertions.assertThat; import com.linecorp.armeria.client.WebClient; @@ -16,12 +29,6 @@ import com.linecorp.armeria.testing.junit5.server.ServerExtension; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; -import io.opentelemetry.semconv.ClientAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.UserAgentAttributes; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -65,72 +72,60 @@ void testHello() throws Exception { .hasKind(SpanKind.CLIENT) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(UrlAttributes.URL_FULL, server2.httpUri() + "/"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "2"), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, server2.httpPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class))), + equalTo(URL_FULL, server2.httpUri() + "/"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(NETWORK_PROTOCOL_VERSION, "2"), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, server2.httpPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class))), span -> span.hasName("GET /") .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(UrlAttributes.URL_SCHEME, "http"), - equalTo(UrlAttributes.URL_PATH, "/"), - equalTo(HttpAttributes.HTTP_ROUTE, "/"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "2"), - equalTo(ClientAttributes.CLIENT_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, server2.httpPort()), - satisfies( - UserAgentAttributes.USER_AGENT_ORIGINAL, - val -> val.isInstanceOf(String.class)), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class))), + equalTo(URL_SCHEME, "http"), + equalTo(URL_PATH, "/"), + equalTo(HTTP_ROUTE, "/"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(NETWORK_PROTOCOL_VERSION, "2"), + equalTo(CLIENT_ADDRESS, "127.0.0.1"), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, server2.httpPort()), + satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class))), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(UrlAttributes.URL_FULL, server1.httpUri() + "/"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "2"), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, server1.httpPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class))), + equalTo(URL_FULL, server1.httpUri() + "/"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(NETWORK_PROTOCOL_VERSION, "2"), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, server1.httpPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class))), span -> span.hasName("GET /") .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(2)) .hasAttributesSatisfyingExactly( - equalTo(UrlAttributes.URL_SCHEME, "http"), - equalTo(UrlAttributes.URL_PATH, "/"), - equalTo(HttpAttributes.HTTP_ROUTE, "/"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "2"), - equalTo(ClientAttributes.CLIENT_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, server1.httpPort()), - satisfies( - UserAgentAttributes.USER_AGENT_ORIGINAL, - val -> val.isInstanceOf(String.class)), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class))))); + equalTo(URL_SCHEME, "http"), + equalTo(URL_PATH, "/"), + equalTo(HTTP_ROUTE, "/"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(NETWORK_PROTOCOL_VERSION, "2"), + equalTo(CLIENT_ADDRESS, "127.0.0.1"), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, server1.httpPort()), + satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class))))); } } diff --git a/instrumentation/armeria/armeria-grpc-1.14/javaagent/build.gradle.kts b/instrumentation/armeria/armeria-grpc-1.14/javaagent/build.gradle.kts index 65a2309b0f69..aaf3db288728 100644 --- a/instrumentation/armeria/armeria-grpc-1.14/javaagent/build.gradle.kts +++ b/instrumentation/armeria/armeria-grpc-1.14/javaagent/build.gradle.kts @@ -1,5 +1,8 @@ +import com.google.protobuf.gradle.* + plugins { id("otel.javaagent-instrumentation") + id("com.google.protobuf") } muzzle { @@ -18,6 +21,35 @@ dependencies { testInstrumentation(project(":instrumentation:netty:netty-4.1:javaagent")) testInstrumentation(project(":instrumentation:grpc-1.6:javaagent")) - testImplementation(project(":instrumentation:grpc-1.6:testing")) testLibrary("com.linecorp.armeria:armeria-junit5:1.14.0") } + +val latestDepTest = findProperty("testLatestDeps") as Boolean +protobuf { + protoc { + val protocVersion = if (latestDepTest) "4.28.2" else "3.19.2" + artifact = "com.google.protobuf:protoc:$protocVersion" + } + plugins { + id("grpc") { + val grpcVersion = if (latestDepTest) "1.43.2" else "1.68.1" + artifact = "io.grpc:protoc-gen-grpc-java:$grpcVersion" + } + } + generateProtoTasks { + all().configureEach { + plugins { + id("grpc") + } + } + } +} + +afterEvaluate { + // Classpath when compiling protos, we add dependency management directly + // since it doesn't follow Gradle conventions of naming / properties. + dependencies { + add("compileProtoPath", platform(project(":dependencyManagement"))) + add("testCompileProtoPath", platform(project(":dependencyManagement"))) + } +} diff --git a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java index a3dafa9893dc..275981b80849 100644 --- a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java +++ b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java @@ -6,6 +6,12 @@ package io.opentelemetry.javaagent.instrumentation.armeria.grpc.v1_14; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import com.linecorp.armeria.client.grpc.GrpcClients; @@ -18,9 +24,7 @@ import io.grpc.stub.StreamObserver; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; -import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.incubating.MessageIncubatingAttributes; -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -75,14 +79,12 @@ void grpcInstrumentation() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, (long) server.httpPort())) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, (long) server.httpPort())) .hasEventsSatisfyingExactly( event -> event @@ -102,14 +104,12 @@ void grpcInstrumentation() { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, server.httpPort())) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, server.httpPort())) .hasEventsSatisfyingExactly( event -> event diff --git a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/proto/helloworld.proto b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/proto/helloworld.proto new file mode 100644 index 000000000000..e5a12aadd367 --- /dev/null +++ b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/proto/helloworld.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; + +package example; + +service Greeter { + rpc SayHello (Request) returns (Response) { + } + + rpc SayMultipleHello (Request) returns (stream Response) { + } + + rpc Conversation (stream Response) returns (stream Response) { + } +} + +message Request { + string name = 1; +} + +message Response { + string message = 1; +} diff --git a/instrumentation/async-http-client/async-http-client-1.9/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/AsyncHttpClientTest.java b/instrumentation/async-http-client/async-http-client-1.9/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/AsyncHttpClientTest.java index b273548b9f2c..f85f3e154acc 100644 --- a/instrumentation/async-http-client/async-http-client-1.9/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/AsyncHttpClientTest.java +++ b/instrumentation/async-http-client/async-http-client-1.9/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/AsyncHttpClientTest.java @@ -5,6 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.asynchttpclient.v1_9; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; + import com.ning.http.client.AsyncCompletionHandler; import com.ning.http.client.AsyncHttpClient; import com.ning.http.client.AsyncHttpClientConfig; @@ -18,7 +20,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.NetworkAttributes; import java.net.URI; import java.util.HashSet; import java.util.Map; @@ -107,7 +108,7 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { endpoint -> { Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); return attributes; }); } diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/README.md b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/README.md new file mode 100644 index 000000000000..94f6359eaf28 --- /dev/null +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/README.md @@ -0,0 +1,5 @@ +# Settings for the AWS Lambda Instrumentation + +| System property | Type | Default | Description | +|-------------------------------------------------|---------|---------|--------------------------------| +| `otel.instrumentation.aws-lambda.flush-timeout` | Integer | 10000 | Flush timeout in milliseconds. | diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaInstrumentationHelper.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaInstrumentationHelper.java index 48a828463707..bc37e29f6bc8 100644 --- a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaInstrumentationHelper.java +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaInstrumentationHelper.java @@ -8,15 +8,28 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionInstrumenter; import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionInstrumenterFactory; +import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrapperConfiguration; +import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import java.time.Duration; public final class AwsLambdaInstrumentationHelper { private static final AwsLambdaFunctionInstrumenter FUNCTION_INSTRUMENTER = AwsLambdaFunctionInstrumenterFactory.createInstrumenter(GlobalOpenTelemetry.get()); + private static final Duration FLUSH_TIMEOUT = + Duration.ofMillis( + AgentInstrumentationConfig.get() + .getLong( + "otel.instrumentation.aws-lambda.flush-timeout", + WrapperConfiguration.OTEL_LAMBDA_FLUSH_TIMEOUT_DEFAULT.toMillis())); public static AwsLambdaFunctionInstrumenter functionInstrumenter() { return FUNCTION_INSTRUMENTER; } + public static Duration flushTimeout() { + return FLUSH_TIMEOUT; + } + private AwsLambdaInstrumentationHelper() {} } diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaRequestHandlerInstrumentation.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaRequestHandlerInstrumentation.java index dfc70b368fc4..93071e04d25e 100644 --- a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaRequestHandlerInstrumentation.java +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaRequestHandlerInstrumentation.java @@ -7,6 +7,7 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; +import static io.opentelemetry.javaagent.instrumentation.awslambdacore.v1_0.AwsLambdaInstrumentationHelper.flushTimeout; import static io.opentelemetry.javaagent.instrumentation.awslambdacore.v1_0.AwsLambdaInstrumentationHelper.functionInstrumenter; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; @@ -90,7 +91,7 @@ public static void stopSpan( functionInstrumenter().end(functionContext, input, null, throwable); } - OpenTelemetrySdkAccess.forceFlush(1, TimeUnit.SECONDS); + OpenTelemetrySdkAccess.forceFlush(flushTimeout().toNanos(), TimeUnit.NANOSECONDS); } } } diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/README.md b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/README.md index 932bb41978ea..0af6179dd320 100644 --- a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/README.md +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/README.md @@ -7,7 +7,7 @@ This package contains libraries to help instrument AWS lambda functions in your To use the instrumentation, configure `OTEL_INSTRUMENTATION_AWS_LAMBDA_HANDLER` env property to your lambda handler method in following format `package.ClassName::methodName` and use one of wrappers as your lambda `Handler`. -In order to configure a span flush timeout (default is set to 1 second), please configure `OTEL_INSTRUMENTATION_AWS_LAMBDA_FLUSH_TIMEOUT` env property. The value is in seconds. +In order to configure a span flush timeout (default is set to 10 seconds), please configure `OTEL_INSTRUMENTATION_AWS_LAMBDA_FLUSH_TIMEOUT` env property. The value is in milliseconds. Available wrappers: diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/README.md b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/README.md new file mode 100644 index 000000000000..94f6359eaf28 --- /dev/null +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/README.md @@ -0,0 +1,5 @@ +# Settings for the AWS Lambda Instrumentation + +| System property | Type | Default | Description | +|-------------------------------------------------|---------|---------|--------------------------------| +| `otel.instrumentation.aws-lambda.flush-timeout` | Integer | 10000 | Flush timeout in milliseconds. | diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaInstrumentationHelper.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaInstrumentationHelper.java index d55898e75053..bf10ab374ed6 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaInstrumentationHelper.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaInstrumentationHelper.java @@ -8,30 +8,39 @@ import com.amazonaws.services.lambda.runtime.events.SQSEvent; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionInstrumenter; +import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrapperConfiguration; import io.opentelemetry.instrumentation.awslambdaevents.v2_2.internal.AwsLambdaEventsInstrumenterFactory; import io.opentelemetry.instrumentation.awslambdaevents.v2_2.internal.AwsLambdaSqsInstrumenterFactory; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import java.time.Duration; public final class AwsLambdaInstrumentationHelper { - private static final io.opentelemetry.instrumentation.awslambdacore.v1_0.internal - .AwsLambdaFunctionInstrumenter - FUNCTION_INSTRUMENTER = - AwsLambdaEventsInstrumenterFactory.createInstrumenter( - GlobalOpenTelemetry.get(), AgentCommonConfig.get().getKnownHttpRequestMethods()); - - public static io.opentelemetry.instrumentation.awslambdacore.v1_0.internal - .AwsLambdaFunctionInstrumenter - functionInstrumenter() { - return FUNCTION_INSTRUMENTER; - } - + private static final AwsLambdaFunctionInstrumenter FUNCTION_INSTRUMENTER = + AwsLambdaEventsInstrumenterFactory.createInstrumenter( + GlobalOpenTelemetry.get(), AgentCommonConfig.get().getKnownHttpRequestMethods()); private static final Instrumenter MESSAGE_TRACER = AwsLambdaSqsInstrumenterFactory.forEvent(GlobalOpenTelemetry.get()); + private static final Duration FLUSH_TIMEOUT = + Duration.ofMillis( + AgentInstrumentationConfig.get() + .getLong( + "otel.instrumentation.aws-lambda.flush-timeout", + WrapperConfiguration.OTEL_LAMBDA_FLUSH_TIMEOUT_DEFAULT.toMillis())); + + public static AwsLambdaFunctionInstrumenter functionInstrumenter() { + return FUNCTION_INSTRUMENTER; + } public static Instrumenter messageInstrumenter() { return MESSAGE_TRACER; } + public static Duration flushTimeout() { + return FLUSH_TIMEOUT; + } + private AwsLambdaInstrumentationHelper() {} } diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaRequestHandlerInstrumentation.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaRequestHandlerInstrumentation.java index b8bb2663bfb1..e05925080782 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaRequestHandlerInstrumentation.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaRequestHandlerInstrumentation.java @@ -7,6 +7,7 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; +import static io.opentelemetry.javaagent.instrumentation.awslambdaevents.v2_2.AwsLambdaInstrumentationHelper.flushTimeout; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -114,7 +115,7 @@ public static void stopSpan( .end(functionContext, input, result, throwable); } - OpenTelemetrySdkAccess.forceFlush(1, TimeUnit.SECONDS); + OpenTelemetrySdkAccess.forceFlush(flushTimeout().toNanos(), TimeUnit.NANOSECONDS); } } } diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaApiGatewayHandlerTest.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaApiGatewayHandlerTest.java index 27cecb000412..e97ea6d19edb 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaApiGatewayHandlerTest.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaApiGatewayHandlerTest.java @@ -6,6 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.awslambdaevents.v2_2; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; @@ -16,9 +20,6 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.UserAgentAttributes; import io.opentelemetry.semconv.incubating.FaasIncubatingAttributes; import java.util.HashMap; import java.util.Map; @@ -84,10 +85,10 @@ void tracedWithHttpPropagation() { .hasAttributesSatisfyingExactly( equalTo(FaasIncubatingAttributes.FAAS_INVOCATION_ID, "1-22-2024"), equalTo(FaasIncubatingAttributes.FAAS_TRIGGER, "http"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "PUT"), - equalTo(UserAgentAttributes.USER_AGENT_ORIGINAL, "Clever Client"), - equalTo(UrlAttributes.URL_FULL, "http://localhost:2024/hello/world"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 201L)))); + equalTo(HTTP_REQUEST_METHOD, "PUT"), + equalTo(USER_AGENT_ORIGINAL, "Clever Client"), + equalTo(URL_FULL, "http://localhost:2024/hello/world"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 201L)))); } public static class TestRequestHandlerApiGateway diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/README.md b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/README.md index 10beb9fe7299..0f33c6df923a 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/README.md +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/README.md @@ -7,7 +7,7 @@ This package contains libraries to help instrument AWS lambda functions in your To use the instrumentation, configure `OTEL_INSTRUMENTATION_AWS_LAMBDA_HANDLER` env property to your lambda handler method in following format `package.ClassName::methodName` and use one of wrappers as your lambda `Handler`. -In order to configure a span flush timeout (default is set to 1 second), please configure `OTEL_INSTRUMENTATION_AWS_LAMBDA_FLUSH_TIMEOUT` env property. The value is in seconds. +In order to configure a span flush timeout (default is set to 10 seconds), please configure `OTEL_INSTRUMENTATION_AWS_LAMBDA_FLUSH_TIMEOUT` env property. The value is in milliseconds. Available wrappers: diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaApiGatewayWrapperTest.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaApiGatewayWrapperTest.java index 0e70a0d6db46..5e36aba991e3 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaApiGatewayWrapperTest.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaApiGatewayWrapperTest.java @@ -6,6 +6,10 @@ package io.opentelemetry.instrumentation.awslambdaevents.v2_2; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; @@ -17,9 +21,6 @@ import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrappedLambda; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.UserAgentAttributes; import io.opentelemetry.semconv.incubating.CloudIncubatingAttributes; import io.opentelemetry.semconv.incubating.FaasIncubatingAttributes; import java.util.HashMap; @@ -105,11 +106,10 @@ void tracedWithHttpPropagation() { equalTo(CloudIncubatingAttributes.CLOUD_ACCOUNT_ID, "123456789"), equalTo(FaasIncubatingAttributes.FAAS_INVOCATION_ID, "1-22-333"), equalTo(FaasIncubatingAttributes.FAAS_TRIGGER, "http"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UserAgentAttributes.USER_AGENT_ORIGINAL, "Test Client"), - equalTo( - UrlAttributes.URL_FULL, "http://localhost:123/hello/world?a=b&c=d"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L)))); + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(USER_AGENT_ORIGINAL, "Test Client"), + equalTo(URL_FULL, "http://localhost:123/hello/world?a=b&c=d"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L)))); } @Test diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsEventWrapperTest.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsEventWrapperTest.java index 24b6439c24c9..27c208714e7e 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsEventWrapperTest.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsEventWrapperTest.java @@ -7,6 +7,8 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.mockito.Mockito.when; import com.amazonaws.services.lambda.runtime.Context; @@ -86,11 +88,10 @@ void eventTraced() { .hasKind(SpanKind.CONSUMER) .hasAttributesSatisfyingExactly( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process")))); + equalTo(MESSAGING_OPERATION, "process")))); } public static final class TestRequestHandler implements RequestHandler { diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsMessageHandlerTest.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsMessageHandlerTest.java index 364d10f10b11..8cf52012601e 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsMessageHandlerTest.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsMessageHandlerTest.java @@ -7,6 +7,10 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.mockito.Mockito.when; import com.amazonaws.services.lambda.runtime.Context; @@ -88,10 +92,10 @@ void processSpans() { .hasParentSpanId(trace.getSpan(0).getSpanId()) .hasAttributesSatisfyingExactly( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process")) + equalTo(MESSAGING_OPERATION, "process")) .hasLinks( LinkData.create( SpanContext.createFromRemoteParent( @@ -111,13 +115,12 @@ void processSpans() { .hasParentSpanId(trace.getSpan(1).getSpanId()) .hasAttributesSatisfyingExactly( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, "message1"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "queue1")) + equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_MESSAGE_ID, "message1"), + equalTo(MESSAGING_DESTINATION_NAME, "queue1")) .hasLinks( LinkData.create( SpanContext.createFromRemoteParent( @@ -131,13 +134,12 @@ void processSpans() { .hasParentSpanId(trace.getSpan(1).getSpanId()) .hasAttributesSatisfyingExactly( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, "message2"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "queue1")) + equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_MESSAGE_ID, "message2"), + equalTo(MESSAGING_DESTINATION_NAME, "queue1")) .hasLinks( LinkData.create( SpanContext.createFromRemoteParent( diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AbstractAwsLambdaSqsEventHandlerTest.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AbstractAwsLambdaSqsEventHandlerTest.java index 070c8f0f3019..4ee227887368 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AbstractAwsLambdaSqsEventHandlerTest.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AbstractAwsLambdaSqsEventHandlerTest.java @@ -7,6 +7,8 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.mockito.Mockito.when; import com.amazonaws.services.lambda.runtime.Context; @@ -82,11 +84,10 @@ void sameSource() { .hasParentSpanId(trace.getSpan(0).getSpanId()) .hasAttributesSatisfyingExactly( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process")) + equalTo(MESSAGING_OPERATION, "process")) .hasLinksSatisfying( links -> assertThat(links) @@ -132,11 +133,10 @@ void differentSource() { .hasParentSpanId(trace.getSpan(0).getSpanId()) .hasAttributesSatisfyingExactly( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process")) + equalTo(MESSAGING_OPERATION, "process")) .hasLinksSatisfying( links -> assertThat(links) diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/Aws1ClientTest.groovy b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/Aws1ClientTest.groovy deleted file mode 100644 index 8aabe4ffdff3..000000000000 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/Aws1ClientTest.groovy +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11 - -import com.amazonaws.AmazonWebServiceClient -import com.amazonaws.ClientConfiguration -import com.amazonaws.Request -import com.amazonaws.auth.BasicAWSCredentials -import com.amazonaws.auth.NoOpSigner -import com.amazonaws.auth.SignerFactory -import com.amazonaws.handlers.RequestHandler2 -import com.amazonaws.regions.Regions -import com.amazonaws.services.s3.AmazonS3Client -import com.amazonaws.services.s3.AmazonS3ClientBuilder -import io.opentelemetry.api.trace.Span -import io.opentelemetry.api.trace.SpanKind -import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractAws1ClientTest -import io.opentelemetry.instrumentation.test.AgentTestTrait -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes -import io.opentelemetry.semconv.ServerAttributes -import io.opentelemetry.semconv.ErrorAttributes -import io.opentelemetry.semconv.HttpAttributes -import io.opentelemetry.semconv.UrlAttributes - -import static io.opentelemetry.api.trace.StatusCode.ERROR - -class Aws1ClientTest extends AbstractAws1ClientTest implements AgentTestTrait { - @Override - def configureClient(def client) { - return client - } - - // Verify agent instruments old and new construction patterns. - - def "request handler is hooked up with builder"() { - setup: - def builder = AmazonS3ClientBuilder.standard() - .withRegion(Regions.US_EAST_1) - if (addHandler) { - builder.withRequestHandlers(new RequestHandler2() {}) - } - AmazonWebServiceClient client = builder.build() - - expect: - client.requestHandler2s != null - client.requestHandler2s.size() == size - client.requestHandler2s.get(position).getClass().getSimpleName() == "TracingRequestHandler" - - where: - addHandler | size | position - true | 2 | 1 - false | 1 | 0 - } - - def "request handler is hooked up with constructor"() { - setup: - String accessKey = "asdf" - String secretKey = "qwerty" - def credentials = new BasicAWSCredentials(accessKey, secretKey) - def client = new AmazonS3Client(credentials) - if (addHandler) { - client.addRequestHandler(new RequestHandler2() {}) - } - - expect: - client.requestHandler2s != null - client.requestHandler2s.size() == size - client.requestHandler2s.get(0).getClass().getSimpleName() == "TracingRequestHandler" - - where: - addHandler | size - true | 2 - false | 1 - } - - // Test cases that require workarounds using bytecode instrumentation - - def "naughty request handler doesn't break the trace"() { - setup: - def client = new AmazonS3Client(CREDENTIALS_PROVIDER_CHAIN) - client.addRequestHandler(new RequestHandler2() { - void beforeRequest(Request request) { - throw new IllegalStateException("bad handler") - } - }) - - when: - client.getObject("someBucket", "someKey") - - then: - !Span.current().getSpanContext().isValid() - thrown IllegalStateException - - assertTraces(1) { - trace(0, 1) { - span(0) { - name "S3.HeadBucket" - kind SpanKind.CLIENT - status ERROR - errorEvent IllegalStateException, "bad handler" - hasNoParent() - attributes { - "$UrlAttributes.URL_FULL" "https://s3.amazonaws.com" - "$HttpAttributes.HTTP_REQUEST_METHOD" "HEAD" - "$ServerAttributes.SERVER_ADDRESS" "s3.amazonaws.com" - "$RpcIncubatingAttributes.RPC_SYSTEM" "aws-api" - "$RpcIncubatingAttributes.RPC_SERVICE" "Amazon S3" - "$RpcIncubatingAttributes.RPC_METHOD" "HeadBucket" - "aws.endpoint" "https://s3.amazonaws.com" - "aws.agent" "java-aws-sdk" - "aws.bucket.name" "someBucket" - "$ErrorAttributes.ERROR_TYPE" IllegalStateException.name - } - } - } - } - } - - def "calling generatePresignedUrl does not leak context"() { - setup: - SignerFactory.registerSigner("noop", NoOpSigner) - def client = AmazonS3ClientBuilder.standard() - .withRegion(Regions.US_EAST_1) - .withClientConfiguration(new ClientConfiguration().withSignerOverride("noop")) - .build() - - when: - client.generatePresignedUrl("someBucket", "someKey", new Date()) - - then: - // expecting no active span after call to generatePresignedUrl - !Span.current().getSpanContext().isValid() - } -} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/DynamoDbClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/DynamoDbClientTest.java new file mode 100644 index 000000000000..c4ebb6a07c79 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/DynamoDbClientTest.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractDynamoDbClientTest; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class DynamoDbClientTest extends AbstractDynamoDbClientTest { + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonDynamoDBClientBuilder configureClient(AmazonDynamoDBClientBuilder clientBuilder) { + return clientBuilder; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/Ec2ClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/Ec2ClientTest.java new file mode 100644 index 000000000000..a2366f14596b --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/Ec2ClientTest.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.ec2.AmazonEC2ClientBuilder; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractEc2ClientTest; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class Ec2ClientTest extends AbstractEc2ClientTest { + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonEC2ClientBuilder configureClient(AmazonEC2ClientBuilder clientBuilder) { + return clientBuilder; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/KinesisClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/KinesisClientTest.java new file mode 100644 index 000000000000..070515665472 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/KinesisClientTest.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractKinesisClientTest; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class KinesisClientTest extends AbstractKinesisClientTest { + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonKinesisClientBuilder configureClient(AmazonKinesisClientBuilder clientBuilder) { + return clientBuilder; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RdsClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RdsClientTest.java new file mode 100644 index 000000000000..87849fe7af10 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RdsClientTest.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.rds.AmazonRDSClientBuilder; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractRdsClientTest; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class RdsClientTest extends AbstractRdsClientTest { + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonRDSClientBuilder configureClient(AmazonRDSClientBuilder client) { + return client; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/S3ClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/S3ClientTest.java new file mode 100644 index 000000000000..fa8bd71d66be --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/S3ClientTest.java @@ -0,0 +1,153 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.api.trace.SpanKind.CLIENT; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.catchThrowable; + +import com.amazonaws.ClientConfiguration; +import com.amazonaws.Request; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.auth.NoOpSigner; +import com.amazonaws.auth.SignerFactory; +import com.amazonaws.handlers.RequestHandler2; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractS3ClientTest; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.sdk.trace.data.StatusData; +import java.util.Date; +import java.util.List; +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +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 S3ClientTest extends AbstractS3ClientTest { + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonS3ClientBuilder configureClient(AmazonS3ClientBuilder client) { + return client; + } + + // Verify agent instruments old and new construction patterns. + @ParameterizedTest + @MethodSource("provideS3Arguments") + void testRequestHandlerIsHookedUpWithBuilder(boolean addHandler, int size, int position) + throws Exception { + AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1); + + if (addHandler) { + builder.withRequestHandlers(new RequestHandler2() {}); + } + AmazonS3 client = builder.build(); + + List requestHandler2s = extractRequestHandlers(client); + assertThat(requestHandler2s).isNotNull(); + assertThat(requestHandler2s.size()).isEqualTo(size); + assertThat(requestHandler2s.get(position).getClass().getSimpleName()) + .isEqualTo("TracingRequestHandler"); + } + + private static Stream provideS3Arguments() { + return Stream.of(Arguments.of(true, 2, 1), Arguments.of(false, 1, 0)); + } + + @ParameterizedTest + @MethodSource("provideS3Arguments") + @SuppressWarnings("deprecation") // AmazonS3Client constructor is deprecated + void testRequestHandlerIsHookedUpWithConstructor(boolean addHandler, int size) throws Exception { + BasicAWSCredentials credentials = new BasicAWSCredentials("asdf", "qwerty"); + AmazonS3Client client = new AmazonS3Client(credentials); + if (addHandler) { + client.addRequestHandler(new RequestHandler2() {}); + } + + List requestHandler2s = extractRequestHandlers(client); + + assertThat(requestHandler2s).isNotNull(); + assertThat(requestHandler2s.size()).isEqualTo(size); + assertThat(requestHandler2s.get(0).getClass().getSimpleName()) + .isEqualTo("TracingRequestHandler"); + } + + @Test + @SuppressWarnings("deprecation") // AmazonS3Client constructor is deprecated + void testNaughtyRequestHandlerDoesntBreakTheTrace() { + AmazonS3Client client = new AmazonS3Client(credentialsProvider); + client.addRequestHandler( + new RequestHandler2() { + @Override + public void beforeRequest(Request request) { + throw new IllegalStateException("bad handler"); + } + }); + + Throwable caught = catchThrowable(() -> client.getObject("someBucket", "someKey")); + + assertThat(caught).isInstanceOf(IllegalStateException.class); + assertThat(Span.current().getSpanContext().isValid()).isFalse(); + + testing() + .waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("S3.HeadBucket") + .hasKind(CLIENT) + .hasStatus(StatusData.error()) + .hasException(caught) + .hasNoParent() + .hasAttributesSatisfyingExactly( + equalTo(URL_FULL, "https://s3.amazonaws.com"), + equalTo(HTTP_REQUEST_METHOD, "HEAD"), + equalTo(SERVER_ADDRESS, "s3.amazonaws.com"), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "Amazon S3"), + equalTo(RPC_METHOD, "HeadBucket"), + equalTo(stringKey("aws.endpoint"), "https://s3.amazonaws.com"), + equalTo(stringKey("aws.agent"), "java-aws-sdk"), + equalTo(stringKey("aws.bucket.name"), "someBucket"), + equalTo(ERROR_TYPE, IllegalStateException.class.getName())))); + } + + @Test + void testCallingGeneratePresignedUrlDoesNotLeakContext() { + SignerFactory.registerSigner("noop", NoOpSigner.class); + AmazonS3 client = + AmazonS3ClientBuilder.standard() + .withRegion(Regions.US_EAST_1) + .withClientConfiguration(new ClientConfiguration().withSignerOverride("noop")) + .build(); + + client.generatePresignedUrl("someBucket", "someKey", new Date()); + + assertThat(Span.current().getSpanContext().isValid()).isFalse(); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/SnsClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/SnsClientTest.java new file mode 100644 index 000000000000..22fa16628403 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/SnsClientTest.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.sns.AmazonSNSClientBuilder; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractSnsClientTest; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class SnsClientTest extends AbstractSnsClientTest { + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonSNSClientBuilder configureClient(AmazonSNSClientBuilder clientBuilder) { + return clientBuilder; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/instrumentor/Aws1ClientTest.groovy b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/instrumentor/Aws1ClientTest.groovy deleted file mode 100644 index 24a138e80993..000000000000 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/instrumentor/Aws1ClientTest.groovy +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.awssdk.v1_11.instrumentor - -import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractAws1ClientTest -import io.opentelemetry.instrumentation.test.LibraryTestTrait - -class Aws1ClientTest extends AbstractAws1ClientTest implements LibraryTestTrait { - @Override - def configureClient(def client) { - return client - } -} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/DynamoDbClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/DynamoDbClientTest.java new file mode 100644 index 000000000000..9455ef45c01e --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/DynamoDbClientTest.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractDynamoDbClientTest; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class DynamoDbClientTest extends AbstractDynamoDbClientTest { + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonDynamoDBClientBuilder configureClient(AmazonDynamoDBClientBuilder client) { + return client; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/Ec2ClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/Ec2ClientTest.java new file mode 100644 index 000000000000..6c4b6cacaab5 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/Ec2ClientTest.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.ec2.AmazonEC2ClientBuilder; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractEc2ClientTest; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class Ec2ClientTest extends AbstractEc2ClientTest { + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonEC2ClientBuilder configureClient(AmazonEC2ClientBuilder clientBuilder) { + return clientBuilder; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/KinesisClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/KinesisClientTest.java new file mode 100644 index 000000000000..696ae7997787 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/KinesisClientTest.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractKinesisClientTest; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class KinesisClientTest extends AbstractKinesisClientTest { + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonKinesisClientBuilder configureClient(AmazonKinesisClientBuilder clientBuilder) { + return clientBuilder; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RdsClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RdsClientTest.java new file mode 100644 index 000000000000..07dbab293b00 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RdsClientTest.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.rds.AmazonRDSClientBuilder; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractRdsClientTest; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class RdsClientTest extends AbstractRdsClientTest { + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonRDSClientBuilder configureClient(AmazonRDSClientBuilder client) { + return client; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/S3ClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/S3ClientTest.java new file mode 100644 index 000000000000..d16b91df6725 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/S3ClientTest.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractS3ClientTest; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class S3ClientTest extends AbstractS3ClientTest { + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonS3ClientBuilder configureClient(AmazonS3ClientBuilder client) { + return client; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/SnsClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/SnsClientTest.java new file mode 100644 index 000000000000..54227249a9ec --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/SnsClientTest.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.sns.AmazonSNSClientBuilder; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractSnsClientTest; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class SnsClientTest extends AbstractSnsClientTest { + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonSNSClientBuilder configureClient(AmazonSNSClientBuilder clientBuilder) { + return clientBuilder; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/Aws1ClientTest.groovy b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/Aws1ClientTest.groovy deleted file mode 100644 index 3fa3506617f6..000000000000 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/Aws1ClientTest.groovy +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.awssdk.v1_11 - -import io.opentelemetry.instrumentation.test.LibraryTestTrait - -class Aws1ClientTest extends AbstractAws1ClientTest implements LibraryTestTrait { - @Override - def configureClient(def client) { - client.withRequestHandlers( - AwsSdkTelemetry.builder(getOpenTelemetry()) - .setCaptureExperimentalSpanAttributes(true) - .build() - .newRequestHandler()) - } -} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/DynamoDbClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/DynamoDbClientTest.java new file mode 100644 index 000000000000..697f0e98c6eb --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/DynamoDbClientTest.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class DynamoDbClientTest extends AbstractDynamoDbClientTest { + @RegisterExtension + private static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonDynamoDBClientBuilder configureClient(AmazonDynamoDBClientBuilder clientBuilder) { + return clientBuilder.withRequestHandlers( + AwsSdkTelemetry.builder(testing().getOpenTelemetry()) + .setCaptureExperimentalSpanAttributes(true) + .build() + .newRequestHandler()); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/Ec2ClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/Ec2ClientTest.java new file mode 100644 index 000000000000..bccd1a4d2eb6 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/Ec2ClientTest.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.ec2.AmazonEC2ClientBuilder; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class Ec2ClientTest extends AbstractEc2ClientTest { + @RegisterExtension + private static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonEC2ClientBuilder configureClient(AmazonEC2ClientBuilder clientBuilder) { + return clientBuilder.withRequestHandlers( + AwsSdkTelemetry.builder(testing().getOpenTelemetry()) + .setCaptureExperimentalSpanAttributes(true) + .build() + .newRequestHandler()); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/KinesisClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/KinesisClientTest.java new file mode 100644 index 000000000000..5837d70d2cb3 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/KinesisClientTest.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class KinesisClientTest extends AbstractKinesisClientTest { + @RegisterExtension + private static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonKinesisClientBuilder configureClient(AmazonKinesisClientBuilder clientBuilder) { + return clientBuilder.withRequestHandlers( + AwsSdkTelemetry.builder(testing().getOpenTelemetry()) + .setCaptureExperimentalSpanAttributes(true) + .build() + .newRequestHandler()); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/RdsClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/RdsClientTest.java new file mode 100644 index 000000000000..d4b86cdf1e93 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/RdsClientTest.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.rds.AmazonRDSClientBuilder; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class RdsClientTest extends AbstractRdsClientTest { + @RegisterExtension + private static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonRDSClientBuilder configureClient(AmazonRDSClientBuilder clientBuilder) { + return clientBuilder.withRequestHandlers( + AwsSdkTelemetry.builder(testing().getOpenTelemetry()) + .setCaptureExperimentalSpanAttributes(true) + .build() + .newRequestHandler()); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/S3ClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/S3ClientTest.java new file mode 100644 index 000000000000..f14c5d04584b --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/S3ClientTest.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class S3ClientTest extends AbstractS3ClientTest { + @RegisterExtension + private static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonS3ClientBuilder configureClient(AmazonS3ClientBuilder clientBuilder) { + return clientBuilder.withRequestHandlers( + AwsSdkTelemetry.builder(testing().getOpenTelemetry()) + .setCaptureExperimentalSpanAttributes(true) + .build() + .newRequestHandler()); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsClientTest.java new file mode 100644 index 000000000000..fa6b765e8a59 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsClientTest.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.sns.AmazonSNSClientBuilder; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class SnsClientTest extends AbstractSnsClientTest { + @RegisterExtension + private static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AmazonSNSClientBuilder configureClient(AmazonSNSClientBuilder clientBuilder) { + return clientBuilder.withRequestHandlers( + AwsSdkTelemetry.builder(testing().getOpenTelemetry()) + .setCaptureExperimentalSpanAttributes(true) + .build() + .newRequestHandler()); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-1.11/testing/build.gradle.kts index b15ba0bd52a3..545f5dffce2c 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/testing/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/build.gradle.kts @@ -20,7 +20,5 @@ dependencies { implementation("com.google.guava:guava") - implementation("org.apache.groovy:groovy") implementation("io.opentelemetry:opentelemetry-api") - implementation("org.spockframework:spock-core") } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractAws1ClientTest.groovy b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractAws1ClientTest.groovy deleted file mode 100644 index c4c5bbb9f47a..000000000000 --- a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractAws1ClientTest.groovy +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.awssdk.v1_11 - -import com.amazonaws.AmazonClientException -import com.amazonaws.ClientConfiguration -import com.amazonaws.SDKGlobalConfiguration -import com.amazonaws.SdkClientException -import com.amazonaws.auth.AWSCredentialsProviderChain -import com.amazonaws.auth.AWSStaticCredentialsProvider -import com.amazonaws.auth.AnonymousAWSCredentials -import com.amazonaws.auth.EnvironmentVariableCredentialsProvider -import com.amazonaws.auth.InstanceProfileCredentialsProvider -import com.amazonaws.auth.SystemPropertiesCredentialsProvider -import com.amazonaws.auth.profile.ProfileCredentialsProvider -import com.amazonaws.client.builder.AwsClientBuilder -import com.amazonaws.retry.PredefinedRetryPolicies -import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder -import com.amazonaws.services.dynamodbv2.model.CreateTableRequest -import com.amazonaws.services.ec2.AmazonEC2ClientBuilder -import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder -import com.amazonaws.services.kinesis.model.DeleteStreamRequest -import com.amazonaws.services.rds.AmazonRDSClientBuilder -import com.amazonaws.services.rds.model.DeleteOptionGroupRequest -import com.amazonaws.services.s3.AmazonS3Client -import com.amazonaws.services.s3.AmazonS3ClientBuilder -import com.amazonaws.services.sns.AmazonSNSClientBuilder -import com.amazonaws.services.sns.model.PublishRequest -import io.opentelemetry.api.trace.Span -import io.opentelemetry.instrumentation.test.InstrumentationSpecification -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes -import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes -import io.opentelemetry.semconv.ServerAttributes -import io.opentelemetry.semconv.ErrorAttributes -import io.opentelemetry.semconv.HttpAttributes -import io.opentelemetry.semconv.NetworkAttributes -import io.opentelemetry.semconv.UrlAttributes -import io.opentelemetry.testing.internal.armeria.common.HttpResponse -import io.opentelemetry.testing.internal.armeria.common.HttpStatus -import io.opentelemetry.testing.internal.armeria.common.MediaType -import io.opentelemetry.testing.internal.armeria.testing.junit5.server.mock.MockWebServerExtension -import spock.lang.Shared -import spock.lang.Unroll - -import java.time.Duration - -import static io.opentelemetry.api.trace.SpanKind.CLIENT -import static io.opentelemetry.api.trace.SpanKind.PRODUCER -import static io.opentelemetry.api.trace.StatusCode.ERROR -import static io.opentelemetry.instrumentation.test.utils.PortUtils.UNUSABLE_PORT - -abstract class AbstractAws1ClientTest extends InstrumentationSpecification { - - abstract T configureClient(T client) - - static final CREDENTIALS_PROVIDER_CHAIN = new AWSCredentialsProviderChain( - new EnvironmentVariableCredentialsProvider(), - new SystemPropertiesCredentialsProvider(), - new ProfileCredentialsProvider(), - new InstanceProfileCredentialsProvider()) - - @Shared - def credentialsProvider = new AWSStaticCredentialsProvider(new AnonymousAWSCredentials()) - - @Shared - def server = new MockWebServerExtension() - - @Shared - def endpoint - - def setupSpec() { - System.setProperty(SDKGlobalConfiguration.ACCESS_KEY_SYSTEM_PROPERTY, "my-access-key") - System.setProperty(SDKGlobalConfiguration.SECRET_KEY_SYSTEM_PROPERTY, "my-secret-key") - server.start() - endpoint = new AwsClientBuilder.EndpointConfiguration("${server.httpUri()}", "us-west-2") - } - - def cleanupSpec() { - System.clearProperty(SDKGlobalConfiguration.ACCESS_KEY_SYSTEM_PROPERTY) - System.clearProperty(SDKGlobalConfiguration.SECRET_KEY_SYSTEM_PROPERTY) - server.stop() - } - - def setup() { - server.beforeTestExecution(null) - } - - @Unroll - def "send #operation request with mocked response"() { - setup: - server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, body)) - - when: - def client = configureClient(clientBuilder).withEndpointConfiguration(endpoint).withCredentials(credentialsProvider).build() - def response = call.call(client) - - then: - response != null - - client.requestHandler2s != null - client.requestHandler2s.find { it.getClass().getSimpleName() == "TracingRequestHandler" } != null - - def hasRequestId = service in ["SNS", "RDS", "EC2"] - - assertTraces(1) { - trace(0, 1) { - span(0) { - name "$service.$operation" - kind operation == "SendMessage" ? PRODUCER : CLIENT - hasNoParent() - attributes { - "$UrlAttributes.URL_FULL" "${server.httpUri()}" - "$HttpAttributes.HTTP_REQUEST_METHOD" "$method" - "$HttpAttributes.HTTP_RESPONSE_STATUS_CODE" 200 - "$NetworkAttributes.NETWORK_PROTOCOL_VERSION" "1.1" - "$ServerAttributes.SERVER_PORT" server.httpPort() - "$ServerAttributes.SERVER_ADDRESS" "127.0.0.1" - "$RpcIncubatingAttributes.RPC_SYSTEM" "aws-api" - "$RpcIncubatingAttributes.RPC_SERVICE" { it.contains(service) } - "$RpcIncubatingAttributes.RPC_METHOD" "${operation}" - "aws.endpoint" "${server.httpUri()}" - "aws.agent" "java-aws-sdk" - "$AwsIncubatingAttributes.AWS_REQUEST_ID" hasRequestId ? String : null - for (def addedTag : additionalAttributes) { - "$addedTag.key" "$addedTag.value" - } - } - } - } - } - - def request = server.takeRequest() - request.request().headers().get("X-Amzn-Trace-Id") != null - request.request().headers().get("traceparent") == null - - where: - service | operation | method | path | clientBuilder | call | additionalAttributes | body - "S3" | "CreateBucket" | "PUT" | "/testbucket/" | AmazonS3ClientBuilder.standard().withPathStyleAccessEnabled(true) | { c -> c.createBucket("testbucket") } | ["aws.bucket.name": "testbucket"] | "" - "S3" | "GetObject" | "GET" | "/someBucket/someKey" | AmazonS3ClientBuilder.standard().withPathStyleAccessEnabled(true) | { c -> c.getObject("someBucket", "someKey") } | ["aws.bucket.name": "someBucket"] | "" - "DynamoDBv2" | "CreateTable" | "POST" | "/" | AmazonDynamoDBClientBuilder.standard() | { c -> c.createTable(new CreateTableRequest("sometable", null)) } | ["aws.table.name": "sometable"] | "" - "Kinesis" | "DeleteStream" | "POST" | "/" | AmazonKinesisClientBuilder.standard() | { c -> c.deleteStream(new DeleteStreamRequest().withStreamName("somestream")) } | ["aws.stream.name": "somestream"] | "" - // Some users may implicitly subclass the request object to mimic a fluent style - "Kinesis" | "DeleteStream" | "POST" | "/" | AmazonKinesisClientBuilder.standard() | { c -> - c.deleteStream(new DeleteStreamRequest() { - { - withStreamName("somestream") - } - }) - } | ["aws.stream.name": "somestream"] | "" - "EC2" | "AllocateAddress" | "POST" | "/" | AmazonEC2ClientBuilder.standard() | { c -> c.allocateAddress() } | [:] | """ - - 59dbff89-35bd-4eac-99ed-be587EXAMPLE - 192.0.2.1 - standard - - """ - "RDS" | "DeleteOptionGroup" | "POST" | "/" | AmazonRDSClientBuilder.standard() | { c -> c.deleteOptionGroup(new DeleteOptionGroupRequest()) } | [:] | """ - - - 0ac9cda2-bbf4-11d3-f92b-31fa5e8dbc99 - - - """ - "SNS" | "Publish" | "POST" | "d74b8436-ae13-5ab4-a9ff-ce54dfea72a0" | AmazonSNSClientBuilder.standard() | { c -> c.publish(new PublishRequest().withMessage("somemessage").withTopicArn("somearn")) } | ["$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME": "somearn"] | """ - - - 567910cd-659e-55d4-8ccb-5aaf14679dc0 - - - d74b8436-ae13-5ab4-a9ff-ce54dfea72a0 - - - """ - "SNS" | "Publish" | "POST" | "d74b8436-ae13-5ab4-a9ff-ce54dfea72a0" | AmazonSNSClientBuilder.standard() | { c -> c.publish(new PublishRequest().withMessage("somemessage").withTargetArn("somearn")) } | ["$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME": "somearn"] | """ - - - 567910cd-659e-55d4-8ccb-5aaf14679dc0 - - - d74b8436-ae13-5ab4-a9ff-ce54dfea72a0 - - - """ - } - - def "send #operation request to closed port"() { - setup: - server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, body)) - - when: - def client = configureClient(clientBuilder) - .withCredentials(CREDENTIALS_PROVIDER_CHAIN) - .withClientConfiguration(new ClientConfiguration().withRetryPolicy(PredefinedRetryPolicies.getDefaultRetryPolicyWithCustomMaxRetries(0))) - .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://127.0.0.1:${UNUSABLE_PORT}", "us-east-1")) - .build() - call.call(client) - - then: - thrown SdkClientException - - assertTraces(1) { - trace(0, 1) { - span(0) { - name "$service.$operation" - kind CLIENT - status ERROR - errorEvent SdkClientException, ~/Unable to execute HTTP request/ - hasNoParent() - attributes { - "$UrlAttributes.URL_FULL" "http://127.0.0.1:${UNUSABLE_PORT}" - "$HttpAttributes.HTTP_REQUEST_METHOD" "$method" - "$ServerAttributes.SERVER_ADDRESS" "127.0.0.1" - "$ServerAttributes.SERVER_PORT" 61 - "$RpcIncubatingAttributes.RPC_SYSTEM" "aws-api" - "$RpcIncubatingAttributes.RPC_SERVICE" { it.contains(service) } - "$RpcIncubatingAttributes.RPC_METHOD" "${operation}" - "aws.endpoint" "http://127.0.0.1:${UNUSABLE_PORT}" - "aws.agent" "java-aws-sdk" - for (def addedTag : additionalAttributes) { - "$addedTag.key" "$addedTag.value" - } - "$ErrorAttributes.ERROR_TYPE" SdkClientException.name - } - } - } - } - - where: - service | operation | method | url | call | additionalAttributes | body | clientBuilder - "S3" | "GetObject" | "GET" | "someBucket/someKey" | { c -> c.getObject("someBucket", "someKey") } | ["aws.bucket.name": "someBucket"] | "" | AmazonS3ClientBuilder.standard() - } - - // TODO(anuraaga): Add events for retries. - def "timeout and retry errors not captured"() { - setup: - // One retry so two requests. - server.enqueue(HttpResponse.delayed(HttpResponse.of(HttpStatus.OK), Duration.ofMillis(5000))) - server.enqueue(HttpResponse.delayed(HttpResponse.of(HttpStatus.OK), Duration.ofMillis(5000))) - AmazonS3Client client = configureClient(AmazonS3ClientBuilder.standard()) - .withClientConfiguration(new ClientConfiguration() - .withRequestTimeout(50 /* ms */) - .withRetryPolicy(PredefinedRetryPolicies.getDefaultRetryPolicyWithCustomMaxRetries(1))) - .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("${server.httpUri()}", "us-east-1")) - .build() - - when: - client.getObject("someBucket", "someKey") - - then: - !Span.current().getSpanContext().isValid() - thrown AmazonClientException - - assertTraces(1) { - trace(0, 1) { - span(0) { - name "S3.GetObject" - kind CLIENT - status ERROR - try { - errorEvent AmazonClientException, ~/Unable to execute HTTP request/ - } catch (AssertionError e) { - errorEvent SdkClientException, "Unable to execute HTTP request: Request did not complete before the request timeout configuration." - } - hasNoParent() - attributes { - "$UrlAttributes.URL_FULL" "${server.httpUri()}" - "$HttpAttributes.HTTP_REQUEST_METHOD" "GET" - "$ServerAttributes.SERVER_PORT" server.httpPort() - "$ServerAttributes.SERVER_ADDRESS" "127.0.0.1" - "$RpcIncubatingAttributes.RPC_SYSTEM" "aws-api" - "$RpcIncubatingAttributes.RPC_SERVICE" "Amazon S3" - "$RpcIncubatingAttributes.RPC_METHOD" "GetObject" - "aws.endpoint" "${server.httpUri()}" - "aws.agent" "java-aws-sdk" - "aws.bucket.name" "someBucket" - "$ErrorAttributes.ERROR_TYPE" {it == SdkClientException.name || it == AmazonClientException.name } - } - } - } - } - } -} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractBaseAwsClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractBaseAwsClientTest.java new file mode 100644 index 000000000000..c76bffa37562 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractBaseAwsClientTest.java @@ -0,0 +1,132 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.api.trace.SpanKind.CLIENT; +import static io.opentelemetry.api.trace.SpanKind.PRODUCER; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; +import static java.util.Arrays.asList; +import static org.assertj.core.api.Assertions.assertThat; + +import com.amazonaws.AmazonWebServiceClient; +import com.amazonaws.SDKGlobalConfiguration; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.AnonymousAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.handlers.RequestHandler2; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import io.opentelemetry.testing.internal.armeria.testing.junit5.server.mock.MockWebServerExtension; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; + +public abstract class AbstractBaseAwsClientTest { + protected abstract InstrumentationExtension testing(); + + protected abstract boolean hasRequestId(); + + protected static MockWebServerExtension server = new MockWebServerExtension(); + protected static AwsClientBuilder.EndpointConfiguration endpoint; + protected static final AWSStaticCredentialsProvider credentialsProvider = + new AWSStaticCredentialsProvider(new AnonymousAWSCredentials()); + + @BeforeAll + static void setUp() { + System.setProperty(SDKGlobalConfiguration.ACCESS_KEY_SYSTEM_PROPERTY, "my-access-key"); + System.setProperty(SDKGlobalConfiguration.SECRET_KEY_SYSTEM_PROPERTY, "my-secret-key"); + server.start(); + endpoint = new AwsClientBuilder.EndpointConfiguration(server.httpUri().toString(), "us-west-2"); + } + + @BeforeEach + void reset() { + server.beforeTestExecution(null); + } + + @AfterAll + static void cleanUp() { + System.clearProperty(SDKGlobalConfiguration.ACCESS_KEY_SYSTEM_PROPERTY); + System.clearProperty(SDKGlobalConfiguration.SECRET_KEY_SYSTEM_PROPERTY); + server.stop(); + } + + public void assertRequestWithMockedResponse( + Object response, + Object client, + String service, + String operation, + String method, + Map additionalAttributes) + throws Exception { + + assertThat(response).isNotNull(); + + List requestHandler2s = extractRequestHandlers(client); + assertThat(requestHandler2s).isNotNull(); + assertThat( + requestHandler2s.stream() + .filter(h -> "TracingRequestHandler".equals(h.getClass().getSimpleName()))) + .isNotNull(); + + testing() + .waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> { + List attributes = + new ArrayList<>( + asList( + equalTo(URL_FULL, server.httpUri().toString()), + equalTo(HTTP_REQUEST_METHOD, method), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_PORT, server.httpPort()), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(RPC_SYSTEM, "aws-api"), + satisfies(RPC_SERVICE, v -> v.contains(service)), + equalTo(RPC_METHOD, operation), + equalTo(stringKey("aws.endpoint"), endpoint.getServiceEndpoint()), + equalTo(stringKey("aws.agent"), "java-aws-sdk"))); + + if (hasRequestId()) { + attributes.add( + satisfies( + stringKey("aws.request_id"), v -> v.isInstanceOf(String.class))); + } + + additionalAttributes.forEach( + (k, v) -> attributes.add(equalTo(stringKey(k), v))); + + span.hasName(service + "." + operation) + .hasKind(operation.equals("SendMessage") ? PRODUCER : CLIENT) + .hasNoParent() + .hasAttributesSatisfyingExactly(attributes); + })); + } + + @SuppressWarnings("unchecked") + protected List extractRequestHandlers(Object client) throws Exception { + Field requestHandler2sField = AmazonWebServiceClient.class.getDeclaredField("requestHandler2s"); + requestHandler2sField.setAccessible(true); + return (List) requestHandler2sField.get(client); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractDynamoDbClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractDynamoDbClientTest.java new file mode 100644 index 000000000000..ba62420ae920 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractDynamoDbClientTest.java @@ -0,0 +1,46 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; +import com.amazonaws.services.dynamodbv2.model.CreateTableRequest; +import com.google.common.collect.ImmutableMap; +import io.opentelemetry.testing.internal.armeria.common.HttpResponse; +import io.opentelemetry.testing.internal.armeria.common.HttpStatus; +import io.opentelemetry.testing.internal.armeria.common.MediaType; +import org.junit.jupiter.api.Test; + +public abstract class AbstractDynamoDbClientTest extends AbstractBaseAwsClientTest { + + public abstract AmazonDynamoDBClientBuilder configureClient(AmazonDynamoDBClientBuilder client); + + @Override + protected boolean hasRequestId() { + return false; + } + + @Test + public void sendRequestWithMockedResponse() throws Exception { + AmazonDynamoDBClientBuilder clientBuilder = AmazonDynamoDBClientBuilder.standard(); + AmazonDynamoDB client = + configureClient(clientBuilder) + .withEndpointConfiguration(endpoint) + .withCredentials(credentialsProvider) + .build(); + + server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, "")); + + Object response = client.createTable(new CreateTableRequest("sometable", null)); + assertRequestWithMockedResponse( + response, + client, + "DynamoDBv2", + "CreateTable", + "POST", + ImmutableMap.of("aws.table.name", "sometable")); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractEc2ClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractEc2ClientTest.java new file mode 100644 index 000000000000..7ba705fa20ec --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractEc2ClientTest.java @@ -0,0 +1,46 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.ec2.AmazonEC2; +import com.amazonaws.services.ec2.AmazonEC2ClientBuilder; +import io.opentelemetry.testing.internal.armeria.common.HttpResponse; +import io.opentelemetry.testing.internal.armeria.common.HttpStatus; +import io.opentelemetry.testing.internal.armeria.common.MediaType; +import java.util.Collections; +import org.junit.jupiter.api.Test; + +public abstract class AbstractEc2ClientTest extends AbstractBaseAwsClientTest { + + public abstract AmazonEC2ClientBuilder configureClient(AmazonEC2ClientBuilder client); + + @Override + protected boolean hasRequestId() { + return true; + } + + @Test + public void sendRequestWithMockedResponse() throws Exception { + AmazonEC2ClientBuilder clientBuilder = AmazonEC2ClientBuilder.standard(); + AmazonEC2 client = + configureClient(clientBuilder) + .withEndpointConfiguration(endpoint) + .withCredentials(credentialsProvider) + .build(); + + String body = + "" + + " 59dbff89-35bd-4eac-99ed-be587EXAMPLE" + + " 192.0.2.1" + + " standard" + + ""; + server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, body)); + + Object response = client.allocateAddress(); + assertRequestWithMockedResponse( + response, client, "EC2", "AllocateAddress", "POST", Collections.emptyMap()); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractKinesisClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractKinesisClientTest.java new file mode 100644 index 000000000000..372780343fc1 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractKinesisClientTest.java @@ -0,0 +1,69 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.kinesis.AmazonKinesis; +import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder; +import com.amazonaws.services.kinesis.model.DeleteStreamRequest; +import com.google.common.collect.ImmutableMap; +import io.opentelemetry.testing.internal.armeria.common.HttpResponse; +import io.opentelemetry.testing.internal.armeria.common.HttpStatus; +import io.opentelemetry.testing.internal.armeria.common.MediaType; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public abstract class AbstractKinesisClientTest extends AbstractBaseAwsClientTest { + + public abstract AmazonKinesisClientBuilder configureClient(AmazonKinesisClientBuilder client); + + @Override + protected boolean hasRequestId() { + return false; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testSendRequestWithMockedResponse( + String operation, Function call) throws Exception { + AmazonKinesisClientBuilder clientBuilder = AmazonKinesisClientBuilder.standard(); + + AmazonKinesis client = + configureClient(clientBuilder) + .withEndpointConfiguration(endpoint) + .withCredentials(credentialsProvider) + .build(); + + server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, "")); + + Map additionalAttributes = ImmutableMap.of("aws.stream.name", "somestream"); + Object response = call.apply(client); + assertRequestWithMockedResponse( + response, client, "Kinesis", operation, "POST", additionalAttributes); + } + + private static Stream provideArguments() { + return Stream.of( + Arguments.of( + "DeleteStream", + (Function) + c -> c.deleteStream(new DeleteStreamRequest().withStreamName("somestream"))), + // Some users may implicitly subclass the request object to mimic a fluent style + Arguments.of( + "CustomDeleteStream", + (Function) + c -> c.deleteStream(new CustomDeleteStreamRequest("somestream")))); + } + + public static class CustomDeleteStreamRequest extends DeleteStreamRequest { + public CustomDeleteStreamRequest(String streamName) { + withStreamName(streamName); + } + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractRdsClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractRdsClientTest.java new file mode 100644 index 000000000000..040812e57024 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractRdsClientTest.java @@ -0,0 +1,47 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.rds.AmazonRDS; +import com.amazonaws.services.rds.AmazonRDSClientBuilder; +import com.amazonaws.services.rds.model.DeleteOptionGroupRequest; +import io.opentelemetry.testing.internal.armeria.common.HttpResponse; +import io.opentelemetry.testing.internal.armeria.common.HttpStatus; +import io.opentelemetry.testing.internal.armeria.common.MediaType; +import java.util.Collections; +import org.junit.jupiter.api.Test; + +public abstract class AbstractRdsClientTest extends AbstractBaseAwsClientTest { + + public abstract AmazonRDSClientBuilder configureClient(AmazonRDSClientBuilder client); + + @Override + protected boolean hasRequestId() { + return true; + } + + @Test + public void sendRequestWithMockedResponse() throws Exception { + AmazonRDSClientBuilder clientBuilder = AmazonRDSClientBuilder.standard(); + AmazonRDS client = + configureClient(clientBuilder) + .withEndpointConfiguration(endpoint) + .withCredentials(credentialsProvider) + .build(); + + String body = + "" + + " " + + " 0ac9cda2-bbf4-11d3-f92b-31fa5e8dbc99" + + " " + + ""; + server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, body)); + + Object response = client.deleteOptionGroup(new DeleteOptionGroupRequest()); + assertRequestWithMockedResponse( + response, client, "RDS", "DeleteOptionGroup", "POST", Collections.emptyMap()); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractS3ClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractS3ClientTest.java new file mode 100644 index 000000000000..37333d093464 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractS3ClientTest.java @@ -0,0 +1,182 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.api.trace.SpanKind.CLIENT; +import static io.opentelemetry.instrumentation.test.utils.PortUtils.UNUSABLE_PORT; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.catchThrowable; + +import com.amazonaws.AmazonClientException; +import com.amazonaws.ClientConfiguration; +import com.amazonaws.SdkClientException; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.retry.PredefinedRetryPolicies; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import com.google.common.collect.ImmutableMap; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.sdk.trace.data.StatusData; +import io.opentelemetry.testing.internal.armeria.common.HttpResponse; +import io.opentelemetry.testing.internal.armeria.common.HttpStatus; +import io.opentelemetry.testing.internal.armeria.common.MediaType; +import java.time.Duration; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public abstract class AbstractS3ClientTest extends AbstractBaseAwsClientTest { + + public abstract AmazonS3ClientBuilder configureClient(AmazonS3ClientBuilder client); + + private final AmazonS3ClientBuilder clientBuilder = + AmazonS3ClientBuilder.standard().withPathStyleAccessEnabled(true); + + @Override + protected boolean hasRequestId() { + return false; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testSendRequestWithMockedResponse( + String operation, + String method, + Function call, + Map additionalAttributes) + throws Exception { + + AmazonS3 client = + configureClient(clientBuilder) + .withEndpointConfiguration(endpoint) + .withCredentials(credentialsProvider) + .build(); + + server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, "")); + + Object response = call.apply(client); + assertRequestWithMockedResponse( + response, client, "S3", operation, method, additionalAttributes); + } + + private static Stream provideArguments() { + return Stream.of( + Arguments.of( + "CreateBucket", + "PUT", + (Function) c -> c.createBucket("testbucket"), + ImmutableMap.of("aws.bucket.name", "testbucket")), + Arguments.of( + "GetObject", + "GET", + (Function) c -> c.getObject("someBucket", "someKey"), + ImmutableMap.of("aws.bucket.name", "someBucket"))); + } + + @Test + public void testSendRequestToClosedPort() { + server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, "")); + + AmazonS3 client = + configureClient(clientBuilder) + .withCredentials(credentialsProvider) + .withClientConfiguration( + new ClientConfiguration() + .withRetryPolicy( + PredefinedRetryPolicies.getDefaultRetryPolicyWithCustomMaxRetries(0))) + .withEndpointConfiguration( + new AwsClientBuilder.EndpointConfiguration( + "http://127.0.0.1:" + UNUSABLE_PORT, "us-east-1")) + .build(); + + Throwable caught = catchThrowable(() -> client.getObject("someBucket", "someKey")); + assertThat(caught).isInstanceOf(SdkClientException.class); + + testing() + .waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("S3.GetObject") + .hasKind(CLIENT) + .hasStatus(StatusData.error()) + .hasException(caught) + .hasNoParent() + .hasAttributesSatisfyingExactly( + equalTo(URL_FULL, "http://127.0.0.1:" + UNUSABLE_PORT), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, 61), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "Amazon S3"), + equalTo(RPC_METHOD, "GetObject"), + equalTo( + stringKey("aws.endpoint"), "http://127.0.0.1:" + UNUSABLE_PORT), + equalTo(stringKey("aws.agent"), "java-aws-sdk"), + equalTo(stringKey("aws.bucket.name"), "someBucket"), + equalTo(ERROR_TYPE, SdkClientException.class.getName())))); + } + + @Test + void testTimeoutAndRetryErrorsNotCaptured() { + server.enqueue(HttpResponse.delayed(HttpResponse.of(HttpStatus.OK), Duration.ofSeconds(5))); + server.enqueue(HttpResponse.delayed(HttpResponse.of(HttpStatus.OK), Duration.ofSeconds(5))); + AmazonS3 client = + configureClient(AmazonS3ClientBuilder.standard()) + .withClientConfiguration( + new ClientConfiguration() + .withRequestTimeout(50 /* ms */) + .withRetryPolicy( + PredefinedRetryPolicies.getDefaultRetryPolicyWithCustomMaxRetries(1))) + .withEndpointConfiguration( + new AwsClientBuilder.EndpointConfiguration( + server.httpUri().toString(), "us-east-1")) + .build(); + + Throwable caught = catchThrowable(() -> client.getObject("someBucket", "someKey")); + assertThat(caught).isInstanceOf(AmazonClientException.class); + assertThat(Span.current().getSpanContext().isValid()).isFalse(); + + testing() + .waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("S3.GetObject") + .hasKind(CLIENT) + .hasStatus(StatusData.error()) + .hasNoParent() + .hasException( + new SdkClientException( + "Unable to execute HTTP request: Request did not complete before the request timeout configuration.")) + .hasAttributesSatisfyingExactly( + equalTo(URL_FULL, server.httpUri().toString()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_PORT, server.httpPort()), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "Amazon S3"), + equalTo(RPC_METHOD, "GetObject"), + equalTo(stringKey("aws.endpoint"), server.httpUri().toString()), + equalTo(stringKey("aws.agent"), "java-aws-sdk"), + equalTo(stringKey("aws.bucket.name"), "someBucket"), + equalTo(ERROR_TYPE, SdkClientException.class.getName())))); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSnsClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSnsClientTest.java new file mode 100644 index 000000000000..4a728f645c55 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSnsClientTest.java @@ -0,0 +1,76 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; + +import com.amazonaws.services.sns.AmazonSNS; +import com.amazonaws.services.sns.AmazonSNSClientBuilder; +import com.amazonaws.services.sns.model.PublishRequest; +import com.google.common.collect.ImmutableMap; +import io.opentelemetry.testing.internal.armeria.common.HttpResponse; +import io.opentelemetry.testing.internal.armeria.common.HttpStatus; +import io.opentelemetry.testing.internal.armeria.common.MediaType; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public abstract class AbstractSnsClientTest extends AbstractBaseAwsClientTest { + + public abstract AmazonSNSClientBuilder configureClient(AmazonSNSClientBuilder client); + + @Override + protected boolean hasRequestId() { + return true; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testSendRequestWithMockedResponse(Function call) throws Exception { + AmazonSNSClientBuilder clientBuilder = AmazonSNSClientBuilder.standard(); + AmazonSNS client = + configureClient(clientBuilder) + .withEndpointConfiguration(endpoint) + .withCredentials(credentialsProvider) + .build(); + + String body = + "" + + " " + + " 567910cd-659e-55d4-8ccb-5aaf14679dc0" + + " " + + " " + + " d74b8436-ae13-5ab4-a9ff-ce54dfea72a0" + + " " + + ""; + + server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, body)); + + Map additionalAttributes = + ImmutableMap.of(MESSAGING_DESTINATION_NAME.toString(), "somearn"); + + Object response = call.apply(client); + assertRequestWithMockedResponse( + response, client, "SNS", "Publish", "POST", additionalAttributes); + } + + private static Stream provideArguments() { + return Stream.of( + Arguments.of( + (Function) + c -> + c.publish( + new PublishRequest().withMessage("somemessage").withTopicArn("somearn"))), + Arguments.of( + (Function) + c -> + c.publish( + new PublishRequest().withMessage("somemessage").withTargetArn("somearn")))); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsSuppressReceiveSpansTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsSuppressReceiveSpansTest.java index fae95611e7f5..74ab20759001 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsSuppressReceiveSpansTest.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsSuppressReceiveSpansTest.java @@ -8,6 +8,19 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import com.amazonaws.auth.AWSStaticCredentialsProvider; @@ -24,13 +37,8 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.test.utils.PortUtils; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import org.elasticmq.rest.sqs.SQSRestServer; import org.elasticmq.rest.sqs.SQSRestServerBuilder; import org.junit.jupiter.api.AfterEach; @@ -102,15 +110,15 @@ void testSimpleSqsProducerConsumerServices() { satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "CreateQueue"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"))), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "CreateQueue"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"))), trace -> trace.hasSpansSatisfyingExactly( span -> @@ -126,27 +134,23 @@ void testSimpleSqsProducerConsumerServices() { satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SendMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "SendMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1")), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1")), span -> span.hasName("testSdkSqs process") .hasKind(SpanKind.CONSUMER) @@ -160,27 +164,23 @@ void testSimpleSqsProducerConsumerServices() { satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1")), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1")), span -> span.hasName("process child") .hasParent(trace.getSpan(1)) @@ -222,15 +222,15 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "CreateQueue"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"))), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "CreateQueue"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"))), trace -> trace.hasSpansSatisfyingExactly( span -> @@ -246,27 +246,23 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SendMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "SendMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1")), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1")), span -> span.hasName("testSdkSqs process") .hasKind(SpanKind.CONSUMER) @@ -280,27 +276,23 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1")), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1")), span -> span.hasName("process child") .hasParent(trace.getSpan(1)) @@ -325,15 +317,15 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1")))); + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1")))); } @Test diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java index 94ca66f12df1..92a9e88384bd 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java @@ -9,6 +9,20 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import com.amazonaws.auth.AWSStaticCredentialsProvider; @@ -30,13 +44,8 @@ import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -135,15 +144,15 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "CreateQueue"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"))), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "CreateQueue"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"))), trace -> trace.hasSpansSatisfyingExactly( span -> { @@ -158,27 +167,23 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SendMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "SendMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"))); + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"))); if (testCaptureHeaders) { attributes.add( @@ -206,27 +211,22 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, - 1), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"))); + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"))); if (testCaptureHeaders) { attributes.add( @@ -252,27 +252,23 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"))); + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"))); if (testCaptureHeaders) { attributes.add( @@ -326,15 +322,15 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "CreateQueue"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"))), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "CreateQueue"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"))), trace -> trace.hasSpansSatisfyingExactly( span -> @@ -350,27 +346,23 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SendMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "SendMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"))), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"))), trace -> { AtomicReference receiveSpan = new AtomicReference<>(); AtomicReference processSpan = new AtomicReference<>(); @@ -398,16 +390,15 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo( - UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1")), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1")), span -> span.hasName("testSdkSqs receive") .hasKind(SpanKind.CONSUMER) @@ -424,30 +415,25 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), - equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes .MessagingSystemIncubatingValues.AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, - "receive"), + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "receive"), equalTo( MessagingIncubatingAttributes .MESSAGING_BATCH_MESSAGE_COUNT, 1), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1")), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1")), span -> span.hasName("testSdkSqs process") .hasKind(SpanKind.CONSUMER) @@ -464,29 +450,24 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { satisfies( AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo( - UrlAttributes.URL_FULL, "http://localhost:" + sqsPort), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "AmazonSQS"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(URL_FULL, "http://localhost:" + sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes .MessagingSystemIncubatingValues.AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, - "process"), + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1")), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1")), span -> span.hasName("process child") .hasParent(processSpan.get()) diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts index 9f83480f5511..7d3fa5d03c7e 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts @@ -164,4 +164,16 @@ tasks { include("software/amazon/awssdk/global/handlers/execution.interceptors") } } + + val testStableSemconv by registering(Test::class) { + filter { + excludeTestsMatching("Aws2SqsSuppressReceiveSpansTest") + } + systemProperty("otel.instrumentation.messaging.experimental.receive-telemetry.enabled", "true") + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts index 7f621f4977d2..d493f83a862b 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts @@ -25,10 +25,18 @@ dependencies { } tasks { - test { + withType().configureEach { systemProperty("otel.instrumentation.aws-sdk.experimental-span-attributes", true) systemProperty("otel.instrumentation.aws-sdk.experimental-record-individual-http-error", true) systemProperty("otel.instrumentation.messaging.experimental.capture-headers", "test-message-header") systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts index e4be5bdfe30a..3b7381a8ba00 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts @@ -66,10 +66,18 @@ testing { } tasks { - withType { + withType().configureEach { // NB: If you'd like to change these, there is some cleanup work to be done, as most tests ignore this and // set the value directly (the "library" does not normally query it, only library-autoconfigure) systemProperty("otel.instrumentation.aws-sdk.experimental-span-attributes", true) systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/TracingExecutionInterceptor.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/TracingExecutionInterceptor.java index 43a2c68d9936..94243d0b11bb 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/TracingExecutionInterceptor.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/TracingExecutionInterceptor.java @@ -16,6 +16,7 @@ import io.opentelemetry.contrib.awsxray.propagator.AwsXrayPropagator; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.instrumentation.api.internal.Timer; import io.opentelemetry.semconv.HttpAttributes; import java.io.BufferedReader; @@ -50,6 +51,8 @@ public final class TracingExecutionInterceptor implements ExecutionInterceptor { // copied from DbIncubatingAttributes private static final AttributeKey DB_OPERATION = AttributeKey.stringKey("db.operation"); + private static final AttributeKey DB_OPERATION_NAME = + AttributeKey.stringKey("db.operation.name"); private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); // copied from DbIncubatingAttributes.DbSystemIncubatingValues private static final String DB_SYSTEM_DYNAMODB = "dynamodb"; @@ -331,7 +334,12 @@ private void populateRequestAttributes( span.setAttribute(DB_SYSTEM, DB_SYSTEM_DYNAMODB); String operation = attributes.getAttribute(SdkExecutionAttribute.OPERATION_NAME); if (operation != null) { - span.setAttribute(DB_OPERATION, operation); + if (SemconvStability.emitStableDatabaseSemconv()) { + span.setAttribute(DB_OPERATION_NAME, operation); + } + if (SemconvStability.emitOldDatabaseSemconv()) { + span.setAttribute(DB_OPERATION, operation); + } } } } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.groovy b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.groovy index c79c0eac333f..9aaacb3abed3 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.groovy @@ -7,15 +7,16 @@ package io.opentelemetry.instrumentation.awssdk.v2_2 import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil import io.opentelemetry.instrumentation.test.InstrumentationSpecification -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes -import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes -import io.opentelemetry.semconv.ServerAttributes import io.opentelemetry.semconv.HttpAttributes +import io.opentelemetry.semconv.ServerAttributes import io.opentelemetry.semconv.UrlAttributes +import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes +import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes import io.opentelemetry.testing.internal.armeria.common.HttpResponse import io.opentelemetry.testing.internal.armeria.common.HttpStatus import io.opentelemetry.testing.internal.armeria.common.MediaType +import io.opentelemetry.testing.internal.armeria.testing.junit5.server.mock.MockWebServerExtension import software.amazon.awssdk.auth.credentials.AwsBasicCredentials import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider import software.amazon.awssdk.core.client.builder.SdkClientBuilder @@ -24,7 +25,6 @@ import software.amazon.awssdk.regions.Region import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient import software.amazon.awssdk.services.dynamodb.DynamoDbClient import software.amazon.awssdk.services.dynamodb.model.* -import io.opentelemetry.testing.internal.armeria.testing.junit5.server.mock.MockWebServerExtension import spock.lang.Shared import spock.lang.Unroll @@ -32,7 +32,7 @@ import java.util.concurrent.Future import static com.google.common.collect.ImmutableMap.of import static io.opentelemetry.api.trace.SpanKind.CLIENT - +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable @Unroll abstract class AbstractAws2ClientCoreTest extends InstrumentationSpecification { @@ -150,7 +150,7 @@ abstract class AbstractAws2ClientCoreTest extends InstrumentationSpecification { "$AwsIncubatingAttributes.AWS_REQUEST_ID" "$requestId" "aws.table.name" "sometable" "$DbIncubatingAttributes.DB_SYSTEM" "dynamodb" - "$DbIncubatingAttributes.DB_OPERATION" "CreateTable" + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "CreateTable" "aws.dynamodb.global_secondary_indexes" "[{\"IndexName\":\"globalIndex\",\"KeySchema\":[{\"AttributeName\":\"attribute\"}],\"ProvisionedThroughput\":{\"ReadCapacityUnits\":10,\"WriteCapacityUnits\":12}},{\"IndexName\":\"globalIndexSecondary\",\"KeySchema\":[{\"AttributeName\":\"attributeSecondary\"}],\"ProvisionedThroughput\":{\"ReadCapacityUnits\":7,\"WriteCapacityUnits\":8}}]" "aws.dynamodb.provisioned_throughput.read_capacity_units" "1" "aws.dynamodb.provisioned_throughput.write_capacity_units" "1" @@ -183,7 +183,7 @@ abstract class AbstractAws2ClientCoreTest extends InstrumentationSpecification { "$AwsIncubatingAttributes.AWS_REQUEST_ID" "$requestId" "aws.table.name" "sometable" "$DbIncubatingAttributes.DB_SYSTEM" "dynamodb" - "$DbIncubatingAttributes.DB_OPERATION" "Query" + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "Query" "aws.dynamodb.limit" "10" "aws.dynamodb.select" "ALL_ATTRIBUTES" } @@ -215,7 +215,7 @@ abstract class AbstractAws2ClientCoreTest extends InstrumentationSpecification { "$AwsIncubatingAttributes.AWS_REQUEST_ID" "$requestId" "aws.table.name" "sometable" "$DbIncubatingAttributes.DB_SYSTEM" "dynamodb" - "$DbIncubatingAttributes.DB_OPERATION" "${operation}" + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "${operation}" } } } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java index 43c3db0ed42f..1a872e415250 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java @@ -6,17 +6,23 @@ package io.opentelemetry.instrumentation.awssdk.v2_2; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import io.opentelemetry.testing.internal.armeria.common.HttpResponse; import io.opentelemetry.testing.internal.armeria.common.HttpStatus; import io.opentelemetry.testing.internal.armeria.common.MediaType; @@ -166,27 +172,27 @@ public void testSendDynamoDbRequestWithRetries() { span.hasKind(SpanKind.CLIENT); span.hasNoParent(); span.hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, server.httpPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, method), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, server.httpPort()), + equalTo(HTTP_REQUEST_METHOD, method), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), equalTo( stringKey("url.full"), "http://127.0.0.1:" + server.httpPort() + "/"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, service), - equalTo(RpcIncubatingAttributes.RPC_METHOD, operation), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, service), + equalTo(RPC_METHOD, operation), equalTo(stringKey("aws.agent"), "java-aws-sdk"), equalTo(AwsIncubatingAttributes.AWS_REQUEST_ID, requestId), equalTo(stringKey("aws.table.name"), "sometable"), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "dynamodb"), - equalTo(DbIncubatingAttributes.DB_OPERATION, operation)); + equalTo(DB_SYSTEM, "dynamodb"), + equalTo(maybeStable(DB_OPERATION), operation)); if (isRecordIndividualHttpErrorEnabled()) { span.hasEventsSatisfyingExactly( event -> event .hasName("HTTP request failure") .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 500), + equalTo(HTTP_RESPONSE_STATUS_CODE, 500), equalTo( stringKey("aws.http.error_message"), "DynamoDB could not process your request")), @@ -194,7 +200,7 @@ public void testSendDynamoDbRequestWithRetries() { event .hasName("HTTP request failure") .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 503), + equalTo(HTTP_RESPONSE_STATUS_CODE, 503), equalTo( stringKey("aws.http.error_message"), "DynamoDB is currently unavailable"))); diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java index be0effde3e4a..e8085e14eccf 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java @@ -9,6 +9,19 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.Attributes; @@ -18,12 +31,8 @@ import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import io.opentelemetry.testing.internal.armeria.internal.shaded.guava.collect.ImmutableList; import java.net.URI; import java.net.URISyntaxException; @@ -176,16 +185,15 @@ void assertSqsTraces(Boolean withParent, Boolean captureHeaders) { .isEqualTo( "00000000-0000-0000-0000-000000000000"), v -> assertThat(v).isEqualTo("UNKNOWN"))), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "Sqs"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "CreateQueue"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "Sqs"), + equalTo(RPC_METHOD, "CreateQueue"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), satisfies( - UrlAttributes.URL_FULL, - v -> v.startsWith("http://localhost:" + sqsPort)), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort))), + URL_FULL, v -> v.startsWith("http://localhost:" + sqsPort)), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort))), trace -> trace.hasSpansSatisfyingExactly( span -> { @@ -206,28 +214,23 @@ void assertSqsTraces(Boolean withParent, Boolean captureHeaders) { .isEqualTo( "00000000-0000-0000-0000-000000000000"), v -> assertThat(v).isEqualTo("UNKNOWN"))), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "Sqs"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SendMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "Sqs"), + equalTo(RPC_METHOD, "SendMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), satisfies( - UrlAttributes.URL_FULL, - v -> v.startsWith("http://localhost:" + sqsPort)), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + URL_FULL, v -> v.startsWith("http://localhost:" + sqsPort)), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - v -> v.isInstanceOf(String.class)))); + MESSAGING_MESSAGE_ID, v -> v.isInstanceOf(String.class)))); if (captureHeaders) { attributes.add( @@ -271,16 +274,15 @@ void assertSqsTraces(Boolean withParent, Boolean captureHeaders) { .isEqualTo( "00000000-0000-0000-0000-000000000000"), v -> assertThat(v).isEqualTo("UNKNOWN"))), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "Sqs"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "Sqs"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), satisfies( - UrlAttributes.URL_FULL, - v -> v.startsWith("http://localhost:" + sqsPort)), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort)))); + URL_FULL, v -> v.startsWith("http://localhost:" + sqsPort)), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort)))); } spanAsserts.addAll( @@ -290,29 +292,22 @@ void assertSqsTraces(Boolean withParent, Boolean captureHeaders) { new ArrayList<>( Arrays.asList( equalTo(stringKey("aws.agent"), "java-aws-sdk"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "Sqs"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "Sqs"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), satisfies( - UrlAttributes.URL_FULL, - v -> v.startsWith("http://localhost:" + sqsPort)), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + URL_FULL, v -> v.startsWith("http://localhost:" + sqsPort)), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes .MessagingSystemIncubatingValues.AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, - "receive"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, - 1))); + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1))); if (captureHeaders) { attributes.add( @@ -337,29 +332,23 @@ void assertSqsTraces(Boolean withParent, Boolean captureHeaders) { new ArrayList<>( Arrays.asList( equalTo(stringKey("aws.agent"), "java-aws-sdk"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "Sqs"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "Sqs"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), satisfies( - UrlAttributes.URL_FULL, - v -> v.startsWith("http://localhost:" + sqsPort)), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + URL_FULL, v -> v.startsWith("http://localhost:" + sqsPort)), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes .MessagingSystemIncubatingValues.AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, - "process"), + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - v -> v.isInstanceOf(String.class)))); + MESSAGING_MESSAGE_ID, v -> v.isInstanceOf(String.class)))); if (captureHeaders) { attributes.add( @@ -518,25 +507,20 @@ void testBatchSqsProducerConsumerServicesSync() throws URISyntaxException { .isEqualTo( "00000000-0000-0000-0000-000000000000"), v -> assertThat(v.trim()).isEqualTo("UNKNOWN"))), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "Sqs"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SendMessageBatch"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - satisfies( - UrlAttributes.URL_FULL, - v -> v.startsWith("http://localhost:" + sqsPort)), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "Sqs"), + equalTo(RPC_METHOD, "SendMessageBatch"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + satisfies(URL_FULL, v -> v.startsWith("http://localhost:" + sqsPort)), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"))); + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "publish"))); }, trace -> { List> spanAsserts = new ArrayList<>(); @@ -548,26 +532,21 @@ void testBatchSqsProducerConsumerServicesSync() throws URISyntaxException { .hasTotalRecordedLinks(0) .hasAttributesSatisfyingExactly( equalTo(stringKey("aws.agent"), "java-aws-sdk"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "Sqs"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - satisfies( - UrlAttributes.URL_FULL, - v -> v.startsWith("http://localhost:" + sqsPort)), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "Sqs"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + satisfies(URL_FULL, v -> v.startsWith("http://localhost:" + sqsPort)), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 3))); + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 3))); // one of the 3 process spans is expected to not have a span link for (int i = 0; i <= 2; i++) { @@ -596,29 +575,24 @@ void testBatchSqsProducerConsumerServicesSync() throws URISyntaxException { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo(stringKey("aws.agent"), "java-aws-sdk"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "Sqs"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_SERVICE, "Sqs"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), satisfies( - UrlAttributes.URL_FULL, + URL_FULL, v -> v.startsWith("http://localhost:" + sqsPort)), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, sqsPort), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, sqsPort), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes .MessagingSystemIncubatingValues.AWS_SQS), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSdkSqs"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, - "process"), + equalTo(MESSAGING_DESTINATION_NAME, "testSdkSqs"), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - v -> v.isInstanceOf(String.class))); + MESSAGING_MESSAGE_ID, v -> v.isInstanceOf(String.class))); }, span -> span.hasName("process child") diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java index f27cc23d7246..726c685d071e 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.azurecore.v1_36; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; import static org.assertj.core.api.Assertions.assertThat; import com.azure.core.annotation.ExpectedResponses; @@ -30,7 +31,6 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.HttpAttributes; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -103,7 +103,7 @@ void testPipelineAndSuppression() { span.hasKind(SpanKind.CLIENT) .hasName(Boolean.getBoolean("testLatestDeps") ? "GET" : "HTTP GET") .hasStatus(StatusData.unset()) - .hasAttribute(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L))); + .hasAttribute(HTTP_RESPONSE_STATUS_CODE, 200L))); } @Test diff --git a/instrumentation/camel-2.20/javaagent/build.gradle.kts b/instrumentation/camel-2.20/javaagent/build.gradle.kts index 8123ea331c46..eaa9bb52dfae 100644 --- a/instrumentation/camel-2.20/javaagent/build.gradle.kts +++ b/instrumentation/camel-2.20/javaagent/build.gradle.kts @@ -79,6 +79,14 @@ tasks { jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } configurations.testRuntimeClasspath { diff --git a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java index 2bd258112151..1c260c2c8e59 100644 --- a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java +++ b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java @@ -25,6 +25,7 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementSanitizer; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.instrumentation.apachecamel.CamelDirection; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; @@ -126,11 +127,21 @@ public void pre( attributes.put(DbIncubatingAttributes.DB_SYSTEM, system); String statement = getStatement(exchange, endpoint); if (statement != null) { - attributes.put(DbIncubatingAttributes.DB_STATEMENT, statement); + if (SemconvStability.emitStableDatabaseSemconv()) { + attributes.put(DbIncubatingAttributes.DB_QUERY_TEXT, statement); + } + if (SemconvStability.emitOldDatabaseSemconv()) { + attributes.put(DbIncubatingAttributes.DB_STATEMENT, statement); + } } String dbName = getDbName(endpoint); if (dbName != null) { - attributes.put(DbIncubatingAttributes.DB_NAME, dbName); + if (SemconvStability.emitStableDatabaseSemconv()) { + attributes.put(DbIncubatingAttributes.DB_NAMESPACE, dbName); + } + if (SemconvStability.emitOldDatabaseSemconv()) { + attributes.put(DbIncubatingAttributes.DB_NAME, dbName); + } } } } diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/RestCamelTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/RestCamelTest.java index feed0b0f1a99..1a0ef6fc31d5 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/RestCamelTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/RestCamelTest.java @@ -8,18 +8,25 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ClientAttributes.CLIENT_ADDRESS; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.UrlAttributes.URL_PATH; +import static io.opentelemetry.semconv.UrlAttributes.URL_SCHEME; +import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL; import com.google.common.collect.ImmutableMap; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerUsingTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; -import io.opentelemetry.semconv.ClientAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.UserAgentAttributes; import org.apache.camel.CamelContext; import org.apache.camel.ProducerTemplate; import org.junit.jupiter.api.AfterAll; @@ -95,37 +102,33 @@ void restComponentServerAndClientCallWithJettyBackend() { equalTo( stringKey("camel.uri"), "rest://get:api/%7Bmodule%7D/unit/%7BunitId%7D"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L)), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L)), span -> span.hasName("GET /api/{module}/unit/{unitId}") .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(UrlAttributes.URL_SCHEME, "http"), - equalTo(UrlAttributes.URL_PATH, "/api/firstModule/unit/unitOne"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_ROUTE, "/api/{module}/unit/{unitId}"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, Long.valueOf(port)), - equalTo(ClientAttributes.CLIENT_ADDRESS, "127.0.0.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - UserAgentAttributes.USER_AGENT_ORIGINAL, - val -> val.isInstanceOf(String.class)), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class))), + equalTo(URL_SCHEME, "http"), + equalTo(URL_PATH, "/api/firstModule/unit/unitOne"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_ROUTE, "/api/{module}/unit/{unitId}"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, Long.valueOf(port)), + equalTo(CLIENT_ADDRESS, "127.0.0.1"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class))), span -> span.hasName("GET /api/{module}/unit/{unitId}") .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(2)) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_REQUEST_METHOD, "GET"), equalTo( - UrlAttributes.URL_FULL, + URL_FULL, "http://localhost:" + port + "/api/firstModule/unit/unitOne"), satisfies( stringKey("camel.uri"), val -> val.isInstanceOf(String.class))), diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/SingleServiceCamelTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/SingleServiceCamelTest.java index 4bcbfc8c1631..abd90e0503d2 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/SingleServiceCamelTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/SingleServiceCamelTest.java @@ -7,14 +7,14 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import com.google.common.collect.ImmutableMap; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerUsingTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.UrlAttributes; import java.net.URI; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -69,8 +69,8 @@ public void singleCamelServiceSpan() { span.hasName("POST /camelService") .hasKind(SpanKind.SERVER) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(UrlAttributes.URL_FULL, requestUrl.toString()), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(URL_FULL, requestUrl.toString()), equalTo( stringKey("camel.uri"), requestUrl.toString().replace("localhost", "0.0.0.0"))))); diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/TwoServicesWithDirectClientCamelTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/TwoServicesWithDirectClientCamelTest.java index e1ecebc6a11c..49ece74b10ad 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/TwoServicesWithDirectClientCamelTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/TwoServicesWithDirectClientCamelTest.java @@ -8,6 +8,19 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ClientAttributes.CLIENT_ADDRESS; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.UrlAttributes.URL_PATH; +import static io.opentelemetry.semconv.UrlAttributes.URL_SCHEME; +import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL; import com.google.common.collect.ImmutableMap; import io.opentelemetry.api.trace.SpanKind; @@ -15,12 +28,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerUsingTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; -import io.opentelemetry.semconv.ClientAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.UserAgentAttributes; import org.apache.camel.CamelContext; import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; @@ -111,11 +118,9 @@ void twoCamelServiceSpans() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo( - UrlAttributes.URL_FULL, - "http://localhost:" + portOne + "/serviceOne"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(URL_FULL, "http://localhost:" + portOne + "/serviceOne"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L), equalTo( stringKey("camel.uri"), "http://localhost:" + portOne + "/serviceOne")), @@ -124,11 +129,9 @@ void twoCamelServiceSpans() throws Exception { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo( - UrlAttributes.URL_FULL, - "http://localhost:" + portOne + "/serviceOne"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(URL_FULL, "http://localhost:" + portOne + "/serviceOne"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L), equalTo( stringKey("camel.uri"), "http://0.0.0.0:" + portOne + "/serviceOne")), @@ -137,11 +140,9 @@ void twoCamelServiceSpans() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(2)) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo( - UrlAttributes.URL_FULL, - "http://127.0.0.1:" + portTwo + "/serviceTwo"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(URL_FULL, "http://127.0.0.1:" + portTwo + "/serviceTwo"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L), equalTo( stringKey("camel.uri"), "http://127.0.0.1:" + portTwo + "/serviceTwo")), @@ -150,31 +151,25 @@ void twoCamelServiceSpans() throws Exception { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(3)) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L), - equalTo(UrlAttributes.URL_SCHEME, "http"), - equalTo(UrlAttributes.URL_PATH, "/serviceTwo"), - equalTo( - UserAgentAttributes.USER_AGENT_ORIGINAL, - "Jakarta Commons-HttpClient/3.1"), - equalTo(HttpAttributes.HTTP_ROUTE, "/serviceTwo"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, portTwo), - equalTo(ClientAttributes.CLIENT_ADDRESS, "127.0.0.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class))), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L), + equalTo(URL_SCHEME, "http"), + equalTo(URL_PATH, "/serviceTwo"), + equalTo(USER_AGENT_ORIGINAL, "Jakarta Commons-HttpClient/3.1"), + equalTo(HTTP_ROUTE, "/serviceTwo"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, portTwo), + equalTo(CLIENT_ADDRESS, "127.0.0.1"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class))), span -> span.hasName("POST /serviceTwo") .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(4)) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo( - UrlAttributes.URL_FULL, - "http://127.0.0.1:" + portTwo + "/serviceTwo"), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(URL_FULL, "http://127.0.0.1:" + portTwo + "/serviceTwo"), equalTo( stringKey("camel.uri"), "jetty:http://0.0.0.0:" + portTwo + "/serviceTwo?arg=value")))); diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/CassandraTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/CassandraTest.java index 3e061418ae11..0328d65ff083 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/CassandraTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/CassandraTest.java @@ -6,7 +6,11 @@ package io.opentelemetry.javaagent.instrumentation.apachecamel.decorators; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import com.datastax.oss.driver.api.core.CqlSession; import com.google.common.collect.ImmutableMap; @@ -14,7 +18,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerUsingTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import org.apache.camel.CamelContext; import org.apache.camel.ProducerTemplate; import org.junit.jupiter.api.AfterAll; @@ -117,10 +120,10 @@ void testCassandra() { equalTo( stringKey("camel.uri"), "cql://" + host + ":" + cassandraPort + "/test"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), + equalTo(maybeStable(DB_NAME), "test"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "select * from test.users where id=? ALLOW FILTERING"), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra")))); + equalTo(DB_SYSTEM, "cassandra")))); } } diff --git a/instrumentation/cassandra/cassandra-3.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-3.0/javaagent/build.gradle.kts index 924e4db0f3a3..08a921999dda 100644 --- a/instrumentation/cassandra/cassandra-3.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-3.0/javaagent/build.gradle.kts @@ -44,14 +44,14 @@ dependencies { configurations.testRuntimeClasspath.get().resolutionStrategy.force("com.google.guava:guava:19.0") tasks { - val testStableSemconv by registering(Test::class) { - jvmArgs("-Dotel.semconv-stability.opt-in=database") - } - withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + check { dependsOn(testStableSemconv) } diff --git a/instrumentation/cassandra/cassandra-3.0/javaagent/src/test/java/CassandraClientTest.java b/instrumentation/cassandra/cassandra-3.0/javaagent/src/test/java/CassandraClientTest.java index 2db183ba837d..3373c0e76277 100644 --- a/instrumentation/cassandra/cassandra-3.0/javaagent/src/test/java/CassandraClientTest.java +++ b/instrumentation/cassandra/cassandra-3.0/javaagent/src/test/java/CassandraClientTest.java @@ -3,7 +3,18 @@ * SPDX-License-Identifier: Apache-2.0 */ +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.junit.jupiter.api.Named.named; import com.datastax.driver.core.Cluster; @@ -12,10 +23,6 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; @@ -95,16 +102,13 @@ void syncTest(Parameter parameter) { .hasKind(SpanKind.CLIENT) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, cassandraHost), - equalTo(ServerAttributes.SERVER_PORT, cassandraPort), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "USE " + parameter.keyspace))), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, cassandraHost), + equalTo(SERVER_PORT, cassandraPort), + equalTo(NETWORK_PEER_ADDRESS, cassandraIp), + equalTo(NETWORK_PEER_PORT, cassandraPort), + equalTo(DB_SYSTEM, "cassandra"), + equalTo(maybeStable(DB_STATEMENT), "USE " + parameter.keyspace))), trace -> trace.hasSpansSatisfyingExactly( span -> @@ -112,28 +116,16 @@ void syncTest(Parameter parameter) { .hasKind(SpanKind.CLIENT) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, cassandraHost), - equalTo(ServerAttributes.SERVER_PORT, cassandraPort), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_NAME), - parameter.keyspace), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - parameter.expectedStatement), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - parameter.operation), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_CASSANDRA_TABLE), - parameter.table)))); + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, cassandraHost), + equalTo(SERVER_PORT, cassandraPort), + equalTo(NETWORK_PEER_ADDRESS, cassandraIp), + equalTo(NETWORK_PEER_PORT, cassandraPort), + equalTo(DB_SYSTEM, "cassandra"), + equalTo(maybeStable(DB_NAME), parameter.keyspace), + equalTo(maybeStable(DB_STATEMENT), parameter.expectedStatement), + equalTo(maybeStable(DB_OPERATION), parameter.operation), + equalTo(maybeStable(DB_CASSANDRA_TABLE), parameter.table)))); } else { testing.waitAndAssertTraces( trace -> @@ -143,24 +135,15 @@ void syncTest(Parameter parameter) { .hasKind(SpanKind.CLIENT) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, cassandraHost), - equalTo(ServerAttributes.SERVER_PORT, cassandraPort), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - parameter.expectedStatement), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - parameter.operation), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_CASSANDRA_TABLE), - parameter.table)))); + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, cassandraHost), + equalTo(SERVER_PORT, cassandraPort), + equalTo(NETWORK_PEER_ADDRESS, cassandraIp), + equalTo(NETWORK_PEER_PORT, cassandraPort), + equalTo(DB_SYSTEM, "cassandra"), + equalTo(maybeStable(DB_STATEMENT), parameter.expectedStatement), + equalTo(maybeStable(DB_OPERATION), parameter.operation), + equalTo(maybeStable(DB_CASSANDRA_TABLE), parameter.table)))); } session.close(); @@ -191,16 +174,13 @@ void asyncTest(Parameter parameter) { .hasKind(SpanKind.CLIENT) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, cassandraHost), - equalTo(ServerAttributes.SERVER_PORT, cassandraPort), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "USE " + parameter.keyspace))), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, cassandraHost), + equalTo(SERVER_PORT, cassandraPort), + equalTo(NETWORK_PEER_ADDRESS, cassandraIp), + equalTo(NETWORK_PEER_PORT, cassandraPort), + equalTo(DB_SYSTEM, "cassandra"), + equalTo(maybeStable(DB_STATEMENT), "USE " + parameter.keyspace))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), @@ -209,28 +189,16 @@ void asyncTest(Parameter parameter) { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, cassandraHost), - equalTo(ServerAttributes.SERVER_PORT, cassandraPort), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_NAME), - parameter.keyspace), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - parameter.expectedStatement), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - parameter.operation), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_CASSANDRA_TABLE), - parameter.table)), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, cassandraHost), + equalTo(SERVER_PORT, cassandraPort), + equalTo(NETWORK_PEER_ADDRESS, cassandraIp), + equalTo(NETWORK_PEER_PORT, cassandraPort), + equalTo(DB_SYSTEM, "cassandra"), + equalTo(maybeStable(DB_NAME), parameter.keyspace), + equalTo(maybeStable(DB_STATEMENT), parameter.expectedStatement), + equalTo(maybeStable(DB_OPERATION), parameter.operation), + equalTo(maybeStable(DB_CASSANDRA_TABLE), parameter.table)), span -> span.hasName("callbackListener") .hasKind(SpanKind.INTERNAL) @@ -245,24 +213,15 @@ void asyncTest(Parameter parameter) { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, cassandraHost), - equalTo(ServerAttributes.SERVER_PORT, cassandraPort), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - parameter.expectedStatement), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - parameter.operation), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_CASSANDRA_TABLE), - parameter.table)), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, cassandraHost), + equalTo(SERVER_PORT, cassandraPort), + equalTo(NETWORK_PEER_ADDRESS, cassandraIp), + equalTo(NETWORK_PEER_PORT, cassandraPort), + equalTo(DB_SYSTEM, "cassandra"), + equalTo(maybeStable(DB_STATEMENT), parameter.expectedStatement), + equalTo(maybeStable(DB_OPERATION), parameter.operation), + equalTo(maybeStable(DB_CASSANDRA_TABLE), parameter.table)), span -> span.hasName("callbackListener") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java b/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java index e8c06ee952c8..b49fb7da01ab 100644 --- a/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java +++ b/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java @@ -5,8 +5,11 @@ package io.opentelemetry.cassandra.v4.common; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; @@ -16,6 +19,10 @@ import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_IDEMPOTENCE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_PAGE_SIZE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Named.named; @@ -27,9 +34,6 @@ import com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; @@ -106,21 +110,12 @@ void syncTest(Parameter parameter) { v -> assertThat(v).isEqualTo("ipv6"))), equalTo(SERVER_ADDRESS, cassandraHost), equalTo(SERVER_PORT, cassandraPort), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), + equalTo(NETWORK_PEER_ADDRESS, cassandraIp), + equalTo(NETWORK_PEER_PORT, cassandraPort), equalTo(DB_SYSTEM, "cassandra"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_NAME), - parameter.keyspace), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - parameter.expectedStatement), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - parameter.operation), + equalTo(maybeStable(DB_NAME), parameter.keyspace), + equalTo(maybeStable(DB_STATEMENT), parameter.expectedStatement), + equalTo(maybeStable(DB_OPERATION), parameter.operation), equalTo(DB_CASSANDRA_CONSISTENCY_LEVEL, "LOCAL_ONE"), equalTo(DB_CASSANDRA_COORDINATOR_DC, "datacenter1"), satisfies( @@ -131,10 +126,7 @@ void syncTest(Parameter parameter) { val -> val.isInstanceOf(Boolean.class)), equalTo(DB_CASSANDRA_PAGE_SIZE, 5000), equalTo(DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, 0), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_CASSANDRA_TABLE), - parameter.table)))); + equalTo(maybeStable(DB_CASSANDRA_TABLE), parameter.table)))); session.close(); } @@ -172,21 +164,12 @@ void asyncTest(Parameter parameter) throws Exception { v -> assertThat(v).isEqualTo("ipv6"))), equalTo(SERVER_ADDRESS, cassandraHost), equalTo(SERVER_PORT, cassandraPort), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), + equalTo(NETWORK_PEER_ADDRESS, cassandraIp), + equalTo(NETWORK_PEER_PORT, cassandraPort), equalTo(DB_SYSTEM, "cassandra"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_NAME), - parameter.keyspace), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - parameter.expectedStatement), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - parameter.operation), + equalTo(maybeStable(DB_NAME), parameter.keyspace), + equalTo(maybeStable(DB_STATEMENT), parameter.expectedStatement), + equalTo(maybeStable(DB_OPERATION), parameter.operation), equalTo(DB_CASSANDRA_CONSISTENCY_LEVEL, "LOCAL_ONE"), equalTo(DB_CASSANDRA_COORDINATOR_DC, "datacenter1"), satisfies( @@ -197,10 +180,7 @@ void asyncTest(Parameter parameter) throws Exception { val -> val.isInstanceOf(Boolean.class)), equalTo(DB_CASSANDRA_PAGE_SIZE, 5000), equalTo(DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, 0), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_CASSANDRA_TABLE), - parameter.table)), + equalTo(maybeStable(DB_CASSANDRA_TABLE), parameter.table)), span -> span.hasName("child") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts index 28eb7cf3f557..bf3b4b5862a3 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts @@ -24,7 +24,7 @@ dependencies { } tasks { - test { + withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts index 270af63f0fa6..375711858747 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts @@ -27,7 +27,15 @@ dependencies { } tasks { - test { + withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts index 963467200f5d..19f0d3172cd5 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts @@ -12,6 +12,10 @@ dependencies { } tasks { + withType().configureEach { + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + } + val testStableSemconv by registering(Test::class) { jvmArgs("-Dotel.semconv-stability.opt-in=database") } diff --git a/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java b/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java index 648ecb86a927..a5319f49df4e 100644 --- a/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java +++ b/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java @@ -5,8 +5,11 @@ package io.opentelemetry.testing.cassandra.v4_4; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; @@ -16,6 +19,10 @@ import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_IDEMPOTENCE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_PAGE_SIZE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Named.named; @@ -23,9 +30,6 @@ import com.datastax.oss.driver.api.core.CqlSession; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.cassandra.v4.common.AbstractCassandraTest; -import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.stream.Stream; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -66,21 +70,12 @@ void reactiveTest(Parameter parameter) { v -> assertThat(v).isEqualTo("ipv6"))), equalTo(SERVER_ADDRESS, cassandraHost), equalTo(SERVER_PORT, cassandraPort), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), + equalTo(NETWORK_PEER_ADDRESS, cassandraIp), + equalTo(NETWORK_PEER_PORT, cassandraPort), equalTo(DB_SYSTEM, "cassandra"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_NAME), - parameter.keyspace), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - parameter.expectedStatement), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - parameter.operation), + equalTo(maybeStable(DB_NAME), parameter.keyspace), + equalTo(maybeStable(DB_STATEMENT), parameter.expectedStatement), + equalTo(maybeStable(DB_OPERATION), parameter.operation), equalTo(DB_CASSANDRA_CONSISTENCY_LEVEL, "LOCAL_ONE"), equalTo(DB_CASSANDRA_COORDINATOR_DC, "datacenter1"), satisfies( @@ -91,10 +86,7 @@ void reactiveTest(Parameter parameter) { val -> val.isInstanceOf(Boolean.class)), equalTo(DB_CASSANDRA_PAGE_SIZE, 5000), equalTo(DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, 0), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_CASSANDRA_TABLE), - parameter.table)), + equalTo(maybeStable(DB_CASSANDRA_TABLE), parameter.table)), span -> span.hasName("child") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/clickhouse-client-0.5/javaagent/build.gradle.kts b/instrumentation/clickhouse-client-0.5/javaagent/build.gradle.kts index 2322b3b8b3a8..b8f7f9811459 100644 --- a/instrumentation/clickhouse-client-0.5/javaagent/build.gradle.kts +++ b/instrumentation/clickhouse-client-0.5/javaagent/build.gradle.kts @@ -25,4 +25,12 @@ tasks { test { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java b/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java index 63fb20f413d3..25f80ddf0f15 100644 --- a/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java +++ b/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java @@ -5,7 +5,14 @@ package io.opentelemetry.javaagent.instrumentation.clickhouse; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; @@ -25,7 +32,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -335,13 +341,11 @@ void testParameterizedQueryInput() throws ClickHouseException { @SuppressWarnings("deprecation") // using deprecated semconv private static List attributeAssertions(String statement, String operation) { return asList( - equalTo( - DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemIncubatingValues.CLICKHOUSE), - equalTo(DbIncubatingAttributes.DB_NAME, dbName), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_STATEMENT, statement), - equalTo(DbIncubatingAttributes.DB_OPERATION, operation)); + equalTo(DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.CLICKHOUSE), + equalTo(maybeStable(DB_NAME), dbName), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(maybeStable(DB_STATEMENT), statement), + equalTo(maybeStable(DB_OPERATION), operation)); } } diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-2.0/javaagent/build.gradle.kts index 13f696c31334..be9254a911c2 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/build.gradle.kts +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/build.gradle.kts @@ -32,10 +32,6 @@ dependencies { } tasks { - val testStableSemconv by registering(Test::class) { - jvmArgs("-Dotel.semconv-stability.opt-in=database") - } - withType().configureEach { // required on jdk17 jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") @@ -43,6 +39,10 @@ tasks { jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") } + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + check { dependsOn(testStableSemconv) } diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts index 1c68002dfe1e..aa93476f592b 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts @@ -35,10 +35,6 @@ dependencies { } tasks { - val testStableSemconv by registering(Test::class) { - jvmArgs("-Dotel.semconv-stability.opt-in=database") - } - withType().configureEach { // TODO run tests both with and without experimental span attributes jvmArgs("-Dotel.instrumentation.couchbase.experimental-span-attributes=true") @@ -48,6 +44,10 @@ tasks { jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") } + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + check { dependsOn(testStableSemconv) } diff --git a/instrumentation/couchbase/couchbase-3.1.6/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-3.1.6/javaagent/build.gradle.kts index d9fdc1b26a54..c0128fac5e38 100644 --- a/instrumentation/couchbase/couchbase-3.1.6/javaagent/build.gradle.kts +++ b/instrumentation/couchbase/couchbase-3.1.6/javaagent/build.gradle.kts @@ -39,7 +39,15 @@ dependencies { } tasks { - test { + withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/couchbase/couchbase-3.1/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-3.1/javaagent/build.gradle.kts index 0d6c7ddc5394..8efea0a3a21f 100644 --- a/instrumentation/couchbase/couchbase-3.1/javaagent/build.gradle.kts +++ b/instrumentation/couchbase/couchbase-3.1/javaagent/build.gradle.kts @@ -40,7 +40,15 @@ dependencies { } tasks { - test { + withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/couchbase/couchbase-3.2/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-3.2/javaagent/build.gradle.kts index fc28c5e0fec4..333fdbdcfced 100644 --- a/instrumentation/couchbase/couchbase-3.2/javaagent/build.gradle.kts +++ b/instrumentation/couchbase/couchbase-3.2/javaagent/build.gradle.kts @@ -37,8 +37,16 @@ dependencies { } tasks { - test { + withType().configureEach { systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseAsyncClientTest.java b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseAsyncClientTest.java index 9ee67015fa4c..0c6116f2bace 100644 --- a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseAsyncClientTest.java +++ b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseAsyncClientTest.java @@ -5,7 +5,10 @@ package io.opentelemetry.instrumentation.couchbase; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Named.named; @@ -21,7 +24,6 @@ import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -89,12 +91,9 @@ void hasBucket(BucketSettings bucketSettings) .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "Cluster.openBucket")), + equalTo(maybeStable(DB_OPERATION), "Cluster.openBucket")), span -> assertCouchbaseSpan(span, "ClusterManager.hasBucket") .hasParent(trace.getSpan(0)))); @@ -133,12 +132,9 @@ void upsert(BucketSettings bucketSettings) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "Cluster.openBucket")), + equalTo(maybeStable(DB_OPERATION), "Cluster.openBucket")), span -> assertCouchbaseSpan(span, "Bucket.upsert", bucketSettings.name()) .hasParent(trace.getSpan(1)))); @@ -184,12 +180,9 @@ void upsertAndGet(BucketSettings bucketSettings) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "Cluster.openBucket")), + equalTo(maybeStable(DB_OPERATION), "Cluster.openBucket")), span -> assertCouchbaseSpan(span, "Bucket.upsert", bucketSettings.name()) .hasParent(trace.getSpan(1)), @@ -232,12 +225,9 @@ void query() throws ExecutionException, InterruptedException, TimeoutException { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "Cluster.openBucket")), + equalTo(maybeStable(DB_OPERATION), "Cluster.openBucket")), span -> assertCouchbaseSpan( span, diff --git a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseClientTest.java b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseClientTest.java index b142e2b592d3..2c1db076ce39 100644 --- a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseClientTest.java +++ b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseClientTest.java @@ -5,7 +5,10 @@ package io.opentelemetry.instrumentation.couchbase; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Named.named; @@ -22,7 +25,6 @@ import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Collections; import java.util.concurrent.atomic.AtomicReference; @@ -108,12 +110,9 @@ void upsertAndGet(BucketSettings bucketSettings) { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "Cluster.openBucket"))), + equalTo(maybeStable(DB_OPERATION), "Cluster.openBucket"))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("someTrace").hasKind(SpanKind.INTERNAL).hasNoParent(), @@ -147,12 +146,9 @@ void query() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "Cluster.openBucket"))), + equalTo(maybeStable(DB_OPERATION), "Cluster.openBucket"))), trace -> trace.hasSpansSatisfyingExactly( span -> diff --git a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java index 1331c3e65b61..719f8d037d91 100644 --- a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java +++ b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java @@ -5,8 +5,13 @@ package io.opentelemetry.instrumentation.couchbase; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import com.couchbase.client.java.bucket.BucketType; import com.couchbase.client.java.cluster.BucketSettings; @@ -19,7 +24,6 @@ import com.couchbase.mock.httpio.HttpServer; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.test.utils.PortUtils; -import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; @@ -121,26 +125,15 @@ protected SpanDataAssert assertCouchbaseSpan( span.hasName(spanName).hasKind(SpanKind.CLIENT); List assertions = new ArrayList<>(); - assertions.add( - equalTo( - DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE)); + assertions.add(equalTo(DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE)); if (operation != null) { - assertions.add( - equalTo( - SemconvStabilityUtil.getAttributeKey(DbIncubatingAttributes.DB_OPERATION), - operation)); + assertions.add(equalTo(maybeStable(DB_OPERATION), operation)); } if (bucketName != null) { - assertions.add( - equalTo( - SemconvStabilityUtil.getAttributeKey(DbIncubatingAttributes.DB_NAME), bucketName)); + assertions.add(equalTo(maybeStable(DB_NAME), bucketName)); } if (statement != null) { - assertions.add( - satisfies( - SemconvStabilityUtil.getAttributeKey(DbIncubatingAttributes.DB_STATEMENT), - s -> s.startsWith(statement))); + assertions.add(satisfies(maybeStable(DB_STATEMENT), s -> s.startsWith(statement))); } assertions.addAll(couchbaseAttributes()); diff --git a/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/build.gradle.kts b/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/build.gradle.kts index 676975efd718..aa65867a4f1c 100644 --- a/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/build.gradle.kts +++ b/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/build.gradle.kts @@ -74,14 +74,17 @@ testing { } tasks { - test { + withType().configureEach { + jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + check { dependsOn(testing.suites) + dependsOn(testStableSemconv) } } - -tasks.withType().configureEach { - jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") -} diff --git a/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchClientTest.java b/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchClientTest.java index 1c1520c5bfef..d60200b6cd62 100644 --- a/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchClientTest.java +++ b/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchClientTest.java @@ -6,7 +6,16 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.apiclient; import static io.opentelemetry.instrumentation.testing.GlobalTraceUtil.runWithSpan; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import co.elastic.clients.elasticsearch.ElasticsearchAsyncClient; import co.elastic.clients.elasticsearch.ElasticsearchClient; @@ -18,11 +27,6 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.io.IOException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -90,23 +94,23 @@ public void elasticsearchStatus() throws IOException { .hasKind(SpanKind.CLIENT) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "elasticsearch"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "info"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort())), + equalTo(DB_SYSTEM, "elasticsearch"), + equalTo(maybeStable(DB_OPERATION), "info"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_FULL, httpHost.toURI() + "/"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort())), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L)))); + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(URL_FULL, httpHost.toURI() + "/"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L)))); } @Test @@ -126,13 +130,13 @@ public void elasticsearchIndex() throws IOException { .hasKind(SpanKind.CLIENT) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "elasticsearch"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "index"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "PUT"), + equalTo(DB_SYSTEM, "elasticsearch"), + equalTo(maybeStable(DB_OPERATION), "index"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "PUT"), equalTo( - UrlAttributes.URL_FULL, + URL_FULL, httpHost.toURI() + "/test-index/_doc/test-id?timeout=10s"), equalTo( AttributeKey.stringKey("db.elasticsearch.path_parts.index"), @@ -145,14 +149,14 @@ public void elasticsearchIndex() throws IOException { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "PUT"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "PUT"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), equalTo( - UrlAttributes.URL_FULL, + URL_FULL, httpHost.toURI() + "/test-index/_doc/test-id?timeout=10s"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 201L)))); + equalTo(HTTP_RESPONSE_STATUS_CODE, 201L)))); } @Test @@ -187,23 +191,23 @@ public void elasticsearchStatusAsync() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "elasticsearch"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "info"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/")), + equalTo(DB_SYSTEM, "elasticsearch"), + equalTo(maybeStable(DB_OPERATION), "info"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_FULL, httpHost.toURI() + "/")), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L)), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(URL_FULL, httpHost.toURI() + "/"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L)), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/ElasticsearchRest5Test.java b/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/ElasticsearchRest5Test.java index 15b3a23ec8c7..06412321d748 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/ElasticsearchRest5Test.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/ElasticsearchRest5Test.java @@ -6,16 +6,18 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.rest.v5_0; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import com.fasterxml.jackson.databind.ObjectMapper; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.io.IOException; import java.util.Map; import java.util.concurrent.CountDownLatch; @@ -96,23 +98,23 @@ void elasticsearchStatus() throws IOException { .hasKind(SpanKind.CLIENT) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "elasticsearch"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health")); + equalTo(DB_SYSTEM, "elasticsearch"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")); }, span -> { span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200)); + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200)); }); }); } @@ -172,23 +174,23 @@ public void onFailure(Exception e) { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "elasticsearch"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health")); + equalTo(DB_SYSTEM, "elasticsearch"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")); }, span -> { span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200)); + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200)); }, span -> { span.hasName("callback").hasKind(SpanKind.INTERNAL).hasParent(trace.getSpan(0)); diff --git a/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/ElasticsearchRest6Test.java b/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/ElasticsearchRest6Test.java index ff3ccc15d302..2eea2d43bc34 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/ElasticsearchRest6Test.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/ElasticsearchRest6Test.java @@ -6,16 +6,18 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.rest.v6_4; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import com.fasterxml.jackson.databind.ObjectMapper; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.io.IOException; import java.util.Map; import java.util.concurrent.CountDownLatch; @@ -87,23 +89,23 @@ public void elasticsearchStatus() throws IOException { .hasKind(SpanKind.CLIENT) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "elasticsearch"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health")); + equalTo(DB_SYSTEM, "elasticsearch"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")); }, span -> { span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L)); + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L)); }); }); } @@ -162,23 +164,23 @@ public void onFailure(Exception e) { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "elasticsearch"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health")); + equalTo(DB_SYSTEM, "elasticsearch"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")); }, span -> { span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200)); + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200)); }, span -> { span.hasName("callback").hasKind(SpanKind.INTERNAL).hasParent(trace.getSpan(0)); diff --git a/instrumentation/elasticsearch/elasticsearch-rest-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java b/instrumentation/elasticsearch/elasticsearch-rest-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java index 517a7a821f48..51f0a3ff6382 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java @@ -7,15 +7,17 @@ import static io.opentelemetry.instrumentation.testing.GlobalTraceUtil.runWithSpan; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -85,22 +87,22 @@ public void elasticsearchStatus() throws Exception { .hasKind(SpanKind.CLIENT) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "elasticsearch"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health")), + equalTo(DB_SYSTEM, "elasticsearch"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L)))); + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L)))); } @Test @@ -155,22 +157,22 @@ public void onFailure(Exception e) { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "elasticsearch"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health")), + equalTo(DB_SYSTEM, "elasticsearch"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L)), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L)), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/test/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java b/instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/test/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java index 09e74606b735..cdac9d2be11b 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/test/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/test/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java @@ -7,14 +7,15 @@ import static io.opentelemetry.instrumentation.testing.GlobalTraceUtil.runWithSpan; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -85,12 +86,11 @@ public void elasticsearchStatus() throws Exception { .hasKind(SpanKind.CLIENT) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "elasticsearch"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo( - UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health")))); + equalTo(DB_SYSTEM, "elasticsearch"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")))); } @Test @@ -145,11 +145,11 @@ public void onFailure(Exception e) { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "elasticsearch"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health")), + equalTo(DB_SYSTEM, "elasticsearch"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.0/javaagent/build.gradle.kts b/instrumentation/elasticsearch/elasticsearch-transport-5.0/javaagent/build.gradle.kts index b9b1bf2e1505..175bd3bd6ab9 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.0/javaagent/build.gradle.kts +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.0/javaagent/build.gradle.kts @@ -49,10 +49,20 @@ dependencies { latestDepTestLibrary("org.elasticsearch.client:transport:5.0.0") } -tasks.withType().configureEach { - // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.elasticsearch.experimental-span-attributes=true") - // required on jdk17 - jvmArgs("--add-opens=java.base/java.nio=ALL-UNNAMED") - jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") +tasks { + withType().configureEach { + // TODO run tests both with and without experimental span attributes + jvmArgs("-Dotel.instrumentation.elasticsearch.experimental-span-attributes=true") + // required on jdk17 + jvmArgs("--add-opens=java.base/java.nio=ALL-UNNAMED") + jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") + } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/build.gradle.kts b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/build.gradle.kts index eb8ff28ad473..508429dd1b42 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/build.gradle.kts +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/build.gradle.kts @@ -65,13 +65,23 @@ dependencies { latestDepTestLibrary("org.springframework.data:spring-data-elasticsearch:3.0.+") } -tasks.withType().configureEach { - systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) +tasks { + withType().configureEach { + systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) - // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.elasticsearch.experimental-span-attributes=true") + // TODO run tests both with and without experimental span attributes + jvmArgs("-Dotel.instrumentation.elasticsearch.experimental-span-attributes=true") - // required on jdk17 - jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") - jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") + // required on jdk17 + jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") + jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") + } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringRepositoryTest.java b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringRepositoryTest.java index e04bd93b3071..38c26d7fcfde 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringRepositoryTest.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringRepositoryTest.java @@ -7,8 +7,11 @@ import static io.opentelemetry.api.common.AttributeKey.longKey; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; @@ -87,9 +90,9 @@ void emptyRepository() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SearchAction"), + equalTo(maybeStable(DB_OPERATION), "SearchAction"), equalTo(stringKey("elasticsearch.action"), "SearchAction"), equalTo(stringKey("elasticsearch.request"), "SearchRequest"), equalTo(stringKey("elasticsearch.request.indices"), "test-index"), @@ -121,9 +124,9 @@ void crud() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "IndexAction"), + equalTo(maybeStable(DB_OPERATION), "IndexAction"), equalTo(stringKey("elasticsearch.action"), "IndexAction"), equalTo(stringKey("elasticsearch.request"), "IndexRequest"), equalTo(stringKey("elasticsearch.request.indices"), "test-index"), @@ -139,9 +142,9 @@ void crud() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RefreshAction"), + equalTo(maybeStable(DB_OPERATION), "RefreshAction"), equalTo(stringKey("elasticsearch.action"), "RefreshAction"), equalTo(stringKey("elasticsearch.request"), "RefreshRequest"), equalTo(stringKey("elasticsearch.request.indices"), "test-index"), @@ -170,9 +173,9 @@ void crud() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), + equalTo(maybeStable(DB_OPERATION), "GetAction"), equalTo(stringKey("elasticsearch.action"), "GetAction"), equalTo(stringKey("elasticsearch.request"), "GetRequest"), equalTo(stringKey("elasticsearch.request.indices"), "test-index"), @@ -204,9 +207,9 @@ void crud() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "IndexAction"), + equalTo(maybeStable(DB_OPERATION), "IndexAction"), equalTo(stringKey("elasticsearch.action"), "IndexAction"), equalTo(stringKey("elasticsearch.request"), "IndexRequest"), equalTo(stringKey("elasticsearch.request.indices"), "test-index"), @@ -222,9 +225,9 @@ void crud() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RefreshAction"), + equalTo(maybeStable(DB_OPERATION), "RefreshAction"), equalTo(stringKey("elasticsearch.action"), "RefreshAction"), equalTo(stringKey("elasticsearch.request"), "RefreshRequest"), equalTo(stringKey("elasticsearch.request.indices"), "test-index"), @@ -248,9 +251,9 @@ void crud() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), + equalTo(maybeStable(DB_OPERATION), "GetAction"), equalTo(stringKey("elasticsearch.action"), "GetAction"), equalTo(stringKey("elasticsearch.request"), "GetRequest"), equalTo(stringKey("elasticsearch.request.indices"), "test-index"), @@ -280,9 +283,9 @@ void crud() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DeleteAction"), + equalTo(maybeStable(DB_OPERATION), "DeleteAction"), equalTo(stringKey("elasticsearch.action"), "DeleteAction"), equalTo(stringKey("elasticsearch.request"), "DeleteRequest"), equalTo(stringKey("elasticsearch.request.indices"), "test-index"), @@ -297,9 +300,9 @@ void crud() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RefreshAction"), + equalTo(maybeStable(DB_OPERATION), "RefreshAction"), equalTo(stringKey("elasticsearch.action"), "RefreshAction"), equalTo(stringKey("elasticsearch.request"), "RefreshRequest"), equalTo(stringKey("elasticsearch.request.indices"), "test-index"), @@ -323,9 +326,9 @@ void crud() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SearchAction"), + equalTo(maybeStable(DB_OPERATION), "SearchAction"), equalTo(stringKey("elasticsearch.action"), "SearchAction"), equalTo(stringKey("elasticsearch.request"), "SearchRequest"), equalTo(stringKey("elasticsearch.request.indices"), "test-index"), diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringTemplateTest.java b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringTemplateTest.java index 8127aacc342f..d48df4a86fe8 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringTemplateTest.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringTemplateTest.java @@ -7,7 +7,10 @@ import static io.opentelemetry.api.common.AttributeKey.longKey; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.awaitility.Awaitility.await; @@ -171,9 +174,9 @@ void elasticsearchError() { .hasException(expectedException) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RefreshAction"), + equalTo(maybeStable(DB_OPERATION), "RefreshAction"), equalTo(stringKey("elasticsearch.action"), "RefreshAction"), equalTo(stringKey("elasticsearch.request"), "RefreshRequest"), equalTo(stringKey("elasticsearch.request.indices"), indexName)))); @@ -226,9 +229,9 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "CreateIndexAction"), + equalTo(maybeStable(DB_OPERATION), "CreateIndexAction"), equalTo(stringKey("elasticsearch.action"), "CreateIndexAction"), equalTo(stringKey("elasticsearch.request"), "CreateIndexRequest"), equalTo(stringKey("elasticsearch.request.indices"), indexName))), @@ -240,9 +243,9 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "ClusterHealthAction"), + equalTo(maybeStable(DB_OPERATION), "ClusterHealthAction"), equalTo(stringKey("elasticsearch.action"), "ClusterHealthAction"), equalTo(stringKey("elasticsearch.request"), "ClusterHealthRequest"))), trace -> @@ -253,9 +256,9 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SearchAction"), + equalTo(maybeStable(DB_OPERATION), "SearchAction"), equalTo(stringKey("elasticsearch.action"), "SearchAction"), equalTo(stringKey("elasticsearch.request"), "SearchRequest"), equalTo(stringKey("elasticsearch.request.indices"), indexName), @@ -268,9 +271,9 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "IndexAction"), + equalTo(maybeStable(DB_OPERATION), "IndexAction"), equalTo(stringKey("elasticsearch.action"), "IndexAction"), equalTo(stringKey("elasticsearch.request"), "IndexRequest"), equalTo(stringKey("elasticsearch.request.indices"), indexName), @@ -288,9 +291,9 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RefreshAction"), + equalTo(maybeStable(DB_OPERATION), "RefreshAction"), equalTo(stringKey("elasticsearch.action"), "RefreshAction"), equalTo(stringKey("elasticsearch.request"), "RefreshRequest"), equalTo(stringKey("elasticsearch.request.indices"), indexName), @@ -305,9 +308,9 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SearchAction"), + equalTo(maybeStable(DB_OPERATION), "SearchAction"), equalTo(stringKey("elasticsearch.action"), "SearchAction"), equalTo(stringKey("elasticsearch.request"), "SearchRequest"), equalTo(stringKey("elasticsearch.request.indices"), indexName), @@ -389,9 +392,9 @@ void resultsExtractor() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SearchAction"), + equalTo(maybeStable(DB_OPERATION), "SearchAction"), equalTo(stringKey("elasticsearch.action"), "SearchAction"), equalTo(stringKey("elasticsearch.request"), "SearchRequest"), equalTo(stringKey("elasticsearch.request.indices"), indexName)))); diff --git a/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/build.gradle.kts b/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/build.gradle.kts index 78c060901269..b9787c55cbc9 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/build.gradle.kts +++ b/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/build.gradle.kts @@ -101,7 +101,12 @@ tasks { jvmArgs("-Dotel.instrumentation.elasticsearch.experimental-span-attributes=true") } + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + check { dependsOn(testing.suites) + dependsOn(testStableSemconv) } } diff --git a/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchNodeClientTest.java b/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchNodeClientTest.java index 05d534f96a48..d82012022835 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchNodeClientTest.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchNodeClientTest.java @@ -7,7 +7,10 @@ import static io.opentelemetry.api.common.AttributeKey.longKey; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Named.named; @@ -68,9 +71,9 @@ void elasticsearchStatus(ThrowingSupplier suppli .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "ClusterHealthAction"), + equalTo(maybeStable(DB_OPERATION), "ClusterHealthAction"), equalTo(ELASTICSEARCH_ACTION, "ClusterHealthAction"), equalTo(ELASTICSEARCH_REQUEST, "ClusterHealthRequest")), span -> @@ -117,9 +120,9 @@ void elasticsearchError(Runnable action) { .hasException(expectedException) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), + equalTo(maybeStable(DB_OPERATION), "GetAction"), equalTo(ELASTICSEARCH_ACTION, "GetAction"), equalTo(ELASTICSEARCH_REQUEST, "GetRequest"), equalTo(ELASTICSEARCH_REQUEST_INDICES, "invalid-index")), @@ -179,9 +182,9 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "CreateIndexAction"), + equalTo(maybeStable(DB_OPERATION), "CreateIndexAction"), equalTo(ELASTICSEARCH_ACTION, "CreateIndexAction"), equalTo(ELASTICSEARCH_REQUEST, "CreateIndexRequest"), equalTo(ELASTICSEARCH_REQUEST_INDICES, indexName))), @@ -193,9 +196,9 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "ClusterHealthAction"), + equalTo(maybeStable(DB_OPERATION), "ClusterHealthAction"), equalTo(ELASTICSEARCH_ACTION, "ClusterHealthAction"), equalTo(ELASTICSEARCH_REQUEST, "ClusterHealthRequest"))), trace -> @@ -206,9 +209,9 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), + equalTo(maybeStable(DB_OPERATION), "GetAction"), equalTo(ELASTICSEARCH_ACTION, "GetAction"), equalTo(ELASTICSEARCH_REQUEST, "GetRequest"), equalTo(ELASTICSEARCH_REQUEST_INDICES, indexName), @@ -224,9 +227,9 @@ void elasticsearchGet() { .hasAttributesSatisfyingExactly( addIndexActionAttributes( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "IndexAction"), + equalTo(maybeStable(DB_OPERATION), "IndexAction"), equalTo(ELASTICSEARCH_ACTION, "IndexAction"), equalTo(ELASTICSEARCH_REQUEST, "IndexRequest"), equalTo(ELASTICSEARCH_REQUEST_INDICES, indexName), @@ -243,9 +246,9 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), + equalTo(maybeStable(DB_OPERATION), "GetAction"), equalTo(ELASTICSEARCH_ACTION, "GetAction"), equalTo(ELASTICSEARCH_REQUEST, "GetRequest"), equalTo(ELASTICSEARCH_REQUEST_INDICES, indexName), diff --git a/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchTransportClientTest.java b/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchTransportClientTest.java index 8180c23900f7..cd69a09f0ba4 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchTransportClientTest.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchTransportClientTest.java @@ -7,10 +7,16 @@ import static io.opentelemetry.api.common.AttributeKey.longKey; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanName; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Named.named; @@ -19,7 +25,6 @@ import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.NetworkAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.ArrayList; import java.util.Arrays; @@ -78,12 +83,12 @@ void elasticsearchStatus(ThrowingSupplier suppli .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addNetworkTypeAttribute( - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, getAddress()), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, getPort()), + equalTo(NETWORK_PEER_ADDRESS, getAddress()), + equalTo(NETWORK_PEER_PORT, getPort()), equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "ClusterHealthAction"), + equalTo(maybeStable(DB_OPERATION), "ClusterHealthAction"), equalTo(ELASTICSEARCH_ACTION, "ClusterHealthAction"), equalTo(ELASTICSEARCH_REQUEST, "ClusterHealthRequest"))), span -> @@ -137,9 +142,9 @@ void elasticsearchError(Runnable action) { RemoteTransportException.class.getName()))) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), + equalTo(maybeStable(DB_OPERATION), "GetAction"), equalTo(ELASTICSEARCH_ACTION, "GetAction"), equalTo(ELASTICSEARCH_REQUEST, "GetRequest"), equalTo(ELASTICSEARCH_REQUEST_INDICES, "invalid-index")), @@ -195,12 +200,12 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( addNetworkTypeAttribute( - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, getAddress()), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, getPort()), + equalTo(NETWORK_PEER_ADDRESS, getAddress()), + equalTo(NETWORK_PEER_PORT, getPort()), equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "CreateIndexAction"), + equalTo(maybeStable(DB_OPERATION), "CreateIndexAction"), equalTo(ELASTICSEARCH_ACTION, "CreateIndexAction"), equalTo(ELASTICSEARCH_REQUEST, "CreateIndexRequest"), equalTo(ELASTICSEARCH_REQUEST_INDICES, indexName)))), @@ -212,9 +217,9 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, getPutMappingActionName()), + equalTo(maybeStable(DB_OPERATION), getPutMappingActionName()), equalTo(ELASTICSEARCH_ACTION, getPutMappingActionName()), equalTo(ELASTICSEARCH_REQUEST, "PutMappingRequest"))), trace -> @@ -225,12 +230,12 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( addIndexActionAttributes( - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, getAddress()), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, getPort()), + equalTo(NETWORK_PEER_ADDRESS, getAddress()), + equalTo(NETWORK_PEER_PORT, getPort()), equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "IndexAction"), + equalTo(maybeStable(DB_OPERATION), "IndexAction"), equalTo(ELASTICSEARCH_ACTION, "IndexAction"), equalTo(ELASTICSEARCH_REQUEST, "IndexRequest"), equalTo(ELASTICSEARCH_REQUEST_INDICES, indexName), @@ -248,12 +253,12 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( addNetworkTypeAttribute( - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, getAddress()), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, getPort()), + equalTo(NETWORK_PEER_ADDRESS, getAddress()), + equalTo(NETWORK_PEER_PORT, getPort()), equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), + equalTo(maybeStable(DB_OPERATION), "GetAction"), equalTo(ELASTICSEARCH_ACTION, "GetAction"), equalTo(ELASTICSEARCH_REQUEST, "GetRequest"), equalTo(ELASTICSEARCH_REQUEST_INDICES, indexName), @@ -268,12 +273,12 @@ void elasticsearchGet() { .hasNoParent() .hasAttributesSatisfyingExactly( addNetworkTypeAttribute( - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, getAddress()), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, getPort()), + equalTo(NETWORK_PEER_ADDRESS, getAddress()), + equalTo(NETWORK_PEER_PORT, getPort()), equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), + equalTo(maybeStable(DB_OPERATION), "GetAction"), equalTo(ELASTICSEARCH_ACTION, "GetAction"), equalTo(ELASTICSEARCH_REQUEST, "GetRequest"), equalTo(ELASTICSEARCH_REQUEST_INDICES, indexName), @@ -291,7 +296,7 @@ private List addNetworkTypeAttribute(AttributeAssertion... a if (hasNetworkType()) { result.add( satisfies( - NetworkAttributes.NETWORK_TYPE, + NETWORK_TYPE, k -> k.satisfiesAnyOf( val -> assertThat(val).isEqualTo("ipv4"), diff --git a/instrumentation/finagle-http-23.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/AbstractServerTest.java b/instrumentation/finagle-http-23.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/AbstractServerTest.java index 3b4730a25777..7fefb76a85f3 100644 --- a/instrumentation/finagle-http-23.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/AbstractServerTest.java +++ b/instrumentation/finagle-http-23.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/AbstractServerTest.java @@ -14,6 +14,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import com.google.common.collect.Sets; import com.twitter.finagle.ListeningServer; @@ -33,7 +34,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; -import io.opentelemetry.semconv.HttpAttributes; import java.net.URI; import java.util.Collections; import org.junit.jupiter.api.extension.RegisterExtension; @@ -48,9 +48,7 @@ protected void configure(HttpServerTestOptions options) { super.configure(options); options.setTestException(false); options.setHttpAttributes( - unused -> - Sets.difference( - DEFAULT_HTTP_ATTRIBUTES, Collections.singleton(HttpAttributes.HTTP_ROUTE))); + unused -> Sets.difference(DEFAULT_HTTP_ATTRIBUTES, Collections.singleton(HTTP_ROUTE))); options.setTestCaptureHttpHeaders(true); } diff --git a/instrumentation/finagle-http-23.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/ClientTest.java b/instrumentation/finagle-http-23.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/ClientTest.java index e58eda6d84c6..b0a7b7c350d1 100644 --- a/instrumentation/finagle-http-23.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/ClientTest.java +++ b/instrumentation/finagle-http-23.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/ClientTest.java @@ -6,6 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.finaglehttp.v23_11; import static io.opentelemetry.javaagent.instrumentation.finaglehttp.v23_11.Utils.createClient; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static org.assertj.core.api.Assertions.assertThat; import com.twitter.finagle.ConnectionFailedException; @@ -30,7 +32,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; import io.opentelemetry.javaagent.instrumentation.finaglehttp.v23_11.Utils.ClientType; -import io.opentelemetry.semconv.ServerAttributes; import java.net.ConnectException; import java.net.URI; import java.util.Collections; @@ -194,8 +195,8 @@ private static Set> getHttpAttributes(URI uri) { return Collections.emptySet(); } Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); return attributes; } diff --git a/instrumentation/geode-1.4/javaagent/build.gradle.kts b/instrumentation/geode-1.4/javaagent/build.gradle.kts index 6382b0aedd6d..dd436deef63f 100644 --- a/instrumentation/geode-1.4/javaagent/build.gradle.kts +++ b/instrumentation/geode-1.4/javaagent/build.gradle.kts @@ -16,3 +16,13 @@ dependencies { compileOnly("com.google.auto.value:auto-value-annotations") annotationProcessor("com.google.auto.value:auto-value") } + +tasks { + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } +} diff --git a/instrumentation/geode-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/geode/PutGetTest.java b/instrumentation/geode-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/geode/PutGetTest.java index efbad6848057..55b073d7b4f2 100644 --- a/instrumentation/geode-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/geode/PutGetTest.java +++ b/instrumentation/geode-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/geode/PutGetTest.java @@ -5,14 +5,18 @@ package io.opentelemetry.javaagent.instrumentation.geode; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; @@ -133,24 +137,24 @@ void assertGeodeTrace(String verb, String query) { span.hasName("clear test-region") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "geode"), - equalTo(DbIncubatingAttributes.DB_NAME, "test-region"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "clear")), + equalTo(DB_SYSTEM, "geode"), + equalTo(maybeStable(DB_NAME), "test-region"), + equalTo(maybeStable(DB_OPERATION), "clear")), span -> span.hasName("put test-region") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "geode"), - equalTo(DbIncubatingAttributes.DB_NAME, "test-region"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "put")), + equalTo(DB_SYSTEM, "geode"), + equalTo(maybeStable(DB_NAME), "test-region"), + equalTo(maybeStable(DB_OPERATION), "put")), span -> span.hasName(verb.concat(" test-region")) .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "geode"), - equalTo(DbIncubatingAttributes.DB_NAME, "test-region"), - equalTo(DbIncubatingAttributes.DB_OPERATION, verb), - equalTo(DbIncubatingAttributes.DB_STATEMENT, query)))); + equalTo(DB_SYSTEM, "geode"), + equalTo(maybeStable(DB_NAME), "test-region"), + equalTo(maybeStable(DB_OPERATION), verb), + equalTo(maybeStable(DB_STATEMENT), query)))); } static class Card implements DataSerializable { diff --git a/instrumentation/google-http-client-1.19/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/googlehttpclient/AbstractGoogleHttpClientTest.java b/instrumentation/google-http-client-1.19/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/googlehttpclient/AbstractGoogleHttpClientTest.java index 5782383e4eb4..cde2e417cfb8 100644 --- a/instrumentation/google-http-client-1.19/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/googlehttpclient/AbstractGoogleHttpClientTest.java +++ b/instrumentation/google-http-client-1.19/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/googlehttpclient/AbstractGoogleHttpClientTest.java @@ -8,6 +8,13 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import com.google.api.client.http.GenericUrl; import com.google.api.client.http.HttpRequest; @@ -23,11 +30,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ErrorAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; @@ -104,12 +106,12 @@ void errorTracesWhenExceptionIsNotThrown() throws Exception { List attributes = new ArrayList<>( Arrays.asList( - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - satisfies(ServerAttributes.SERVER_PORT, AbstractLongAssert::isPositive), - equalTo(UrlAttributes.URL_FULL, uri.toString()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 500), - equalTo(ErrorAttributes.ERROR_TYPE, "500"))); + equalTo(SERVER_ADDRESS, "localhost"), + satisfies(SERVER_PORT, AbstractLongAssert::isPositive), + equalTo(URL_FULL, uri.toString()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 500), + equalTo(ERROR_TYPE, "500"))); testing.waitAndAssertTraces( trace -> @@ -139,7 +141,7 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { uri -> { Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); return attributes; }); } diff --git a/instrumentation/graphql-java/graphql-java-common/testing/src/main/java/io/opentelemetry/instrumentation/graphql/AbstractGraphqlTest.java b/instrumentation/graphql-java/graphql-java-common/testing/src/main/java/io/opentelemetry/instrumentation/graphql/AbstractGraphqlTest.java index afc4da0ca6bc..351241a569f9 100644 --- a/instrumentation/graphql-java/graphql-java-common/testing/src/main/java/io/opentelemetry/instrumentation/graphql/AbstractGraphqlTest.java +++ b/instrumentation/graphql-java/graphql-java-common/testing/src/main/java/io/opentelemetry/instrumentation/graphql/AbstractGraphqlTest.java @@ -9,6 +9,8 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; import graphql.ExecutionResult; import graphql.GraphQL; @@ -25,7 +27,6 @@ import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ExceptionAttributes; import io.opentelemetry.semconv.incubating.GraphqlIncubatingAttributes; import java.io.IOException; import java.io.InputStreamReader; @@ -245,11 +246,9 @@ void parseError() { event .hasName("exception") .hasAttributesSatisfyingExactly( - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - "InvalidSyntax"), + equalTo(EXCEPTION_TYPE, "InvalidSyntax"), satisfies( - ExceptionAttributes.EXCEPTION_MESSAGE, + EXCEPTION_MESSAGE, message -> message.startsWithIgnoringCase( "Invalid Syntax")))))); @@ -287,11 +286,9 @@ void validationError() { event .hasName("exception") .hasAttributesSatisfyingExactly( - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - "ValidationError"), + equalTo(EXCEPTION_TYPE, "ValidationError"), satisfies( - ExceptionAttributes.EXCEPTION_MESSAGE, + EXCEPTION_MESSAGE, message -> message.startsWith("Validation error")))))); } diff --git a/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyFilterchainServerTest.java b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyFilterchainServerTest.java index 37bc838b8dc4..f8648d46023e 100644 --- a/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyFilterchainServerTest.java +++ b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyFilterchainServerTest.java @@ -8,6 +8,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import static java.nio.charset.Charset.defaultCharset; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.glassfish.grizzly.memory.Buffers.wrap; @@ -18,7 +19,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; -import io.opentelemetry.semconv.HttpAttributes; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashMap; @@ -71,7 +71,7 @@ protected void configure(HttpServerTestOptions options) { serverEndpoint -> { Set> attributes = new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(HttpAttributes.HTTP_ROUTE); + attributes.remove(HTTP_ROUTE); return attributes; }); diff --git a/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyTest.java b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyTest.java index dee567d5a936..af07764dcf82 100644 --- a/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyTest.java +++ b/instrumentation/grizzly-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlyTest.java @@ -12,6 +12,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; @@ -19,7 +20,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; -import io.opentelemetry.semconv.HttpAttributes; import java.io.IOException; import java.util.HashSet; import java.util.Set; @@ -109,7 +109,7 @@ protected void configure(HttpServerTestOptions options) { serverEndpoint -> { Set> attributes = new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(HttpAttributes.HTTP_ROUTE); + attributes.remove(HTTP_ROUTE); return attributes; }); options.setTestCaptureHttpHeaders(false); diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java index cfc1906634ab..21bf17544044 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java @@ -9,6 +9,15 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import example.GreeterGrpc; import example.Helloworld; @@ -25,10 +34,7 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.util.ThrowingRunnable; import io.opentelemetry.sdk.trace.data.EventData; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.incubating.MessageIncubatingAttributes; -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import java.util.ArrayList; import java.util.List; import java.util.Queue; @@ -184,14 +190,12 @@ public void onCompleted() { .hasNoParent() .hasAttributesSatisfyingExactly( addExtraClientAttributes( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "Conversation"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort()))) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "Conversation"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, (long) server.getPort()))) .satisfies( spanData -> assertThat(spanData.getEvents()) @@ -201,19 +205,15 @@ public void onCompleted() { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "Conversation"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.getPort()), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> assertThat(val).isNotNull())) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "Conversation"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> assertThat(val).isNotNull())) .satisfies( spanData -> assertThat(spanData.getEvents()) @@ -232,17 +232,12 @@ public void onCompleted() { histogram.hasPointsSatisfying( point -> point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(RPC_METHOD, "Conversation"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo( - RpcIncubatingAttributes.RPC_METHOD, - "Conversation"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value())))))); testing() .waitAndAssertMetrics( @@ -258,19 +253,13 @@ public void onCompleted() { histogram.hasPointsSatisfying( point -> point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(RPC_METHOD, "Conversation"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo( - ServerAttributes.SERVER_PORT, server.getPort()), - equalTo( - RpcIncubatingAttributes.RPC_METHOD, - "Conversation"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value())))))); } diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java index 2dd00edfe5eb..801a9ad82df4 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java @@ -8,6 +8,15 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.params.provider.Arguments.arguments; @@ -47,10 +56,7 @@ import io.opentelemetry.instrumentation.testing.util.ThrowingRunnable; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.incubating.MessageIncubatingAttributes; -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -136,14 +142,12 @@ public void sayHello( .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraClientAttributes( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort()))) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( event -> event @@ -165,19 +169,15 @@ public void sayHello( .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.getPort()), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> assertThat(val).isNotNull())) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> assertThat(val).isNotNull())) .hasEventsSatisfyingExactly( event -> event @@ -208,16 +208,12 @@ public void sayHello( histogram.hasPointsSatisfying( point -> point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo( - RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value())))))); testing() .waitAndAssertMetrics( @@ -233,18 +229,13 @@ public void sayHello( histogram.hasPointsSatisfying( point -> point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo( - ServerAttributes.SERVER_PORT, server.getPort()), - equalTo( - RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value())))))); } @@ -304,14 +295,12 @@ public void sayHello( .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraClientAttributes( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort()))) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( event -> event @@ -333,19 +322,15 @@ public void sayHello( .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.getPort()), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> assertThat(val).isNotNull())) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> assertThat(val).isNotNull())) .hasEventsSatisfyingExactly( event -> event @@ -380,16 +365,12 @@ public void sayHello( histogram.hasPointsSatisfying( point -> point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo( - RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value())))))); testing() .waitAndAssertMetrics( @@ -405,18 +386,13 @@ public void sayHello( histogram.hasPointsSatisfying( point -> point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo( - ServerAttributes.SERVER_PORT, server.getPort()), - equalTo( - RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value())))))); } @@ -484,14 +460,12 @@ public void onCompleted() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraClientAttributes( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort()))) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( event -> event @@ -513,19 +487,15 @@ public void onCompleted() { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.getPort()), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> assertThat(val).isNotNull())) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> assertThat(val).isNotNull())) .hasEventsSatisfyingExactly( event -> event @@ -560,16 +530,12 @@ public void onCompleted() { histogram.hasPointsSatisfying( point -> point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo( - RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value())))))); testing() .waitAndAssertMetrics( @@ -585,18 +551,13 @@ public void onCompleted() { histogram.hasPointsSatisfying( point -> point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo( - ServerAttributes.SERVER_PORT, server.getPort()), - equalTo( - RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value())))))); } @@ -639,14 +600,12 @@ public void sayHello( .hasStatus(StatusData.error()) .hasAttributesSatisfyingExactly( addExtraClientAttributes( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) status.getCode().value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort()))) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) status.getCode().value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( event -> event @@ -661,19 +620,15 @@ public void sayHello( .hasParent(trace.getSpan(0)) .hasStatus(isServerError ? StatusData.error() : StatusData.unset()) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) status.getCode().value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.getPort()), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> assertThat(val).isNotNull())) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) status.getCode().value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> assertThat(val).isNotNull())) .hasEventsSatisfying( events -> { assertThat(events).isNotEmpty(); @@ -704,16 +659,12 @@ public void sayHello( histogram.hasPointsSatisfying( point -> point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo( - RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) status.getCode().value())))))); testing() .waitAndAssertMetrics( @@ -729,18 +680,13 @@ public void sayHello( histogram.hasPointsSatisfying( point -> point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo( - ServerAttributes.SERVER_PORT, server.getPort()), - equalTo( - RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) status.getCode().value())))))); } @@ -791,14 +737,14 @@ public void sayHello( .hasStatus(StatusData.error()) .hasAttributesSatisfyingExactly( addExtraClientAttributes( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) Status.UNKNOWN.getCode().value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort()))) + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( event -> event @@ -813,19 +759,15 @@ public void sayHello( .hasParent(trace.getSpan(0)) .hasStatus(StatusData.error()) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.UNKNOWN.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.getPort()), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> assertThat(val).isNotNull())) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.UNKNOWN.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> assertThat(val).isNotNull())) .hasEventsSatisfying( events -> { assertThat(events).hasSize(2); @@ -851,16 +793,12 @@ public void sayHello( histogram.hasPointsSatisfying( point -> point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo( - RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) Status.Code.UNKNOWN.value())))))); testing() .waitAndAssertMetrics( @@ -876,18 +814,13 @@ public void sayHello( histogram.hasPointsSatisfying( point -> point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo( - ServerAttributes.SERVER_PORT, server.getPort()), - equalTo( - RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, + RPC_GRPC_STATUS_CODE, (long) Status.Code.UNKNOWN.value())))))); } @@ -1039,14 +972,12 @@ public void onCompleted() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraClientAttributes( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort()))) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( event -> event @@ -1068,19 +999,15 @@ public void onCompleted() { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.getPort()), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> assertThat(val).isNotNull())) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> assertThat(val).isNotNull())) .hasEventsSatisfyingExactly( event -> event @@ -1162,14 +1089,13 @@ public void onCompleted() { .hasStatus(StatusData.error()) .hasAttributesSatisfyingExactly( addExtraClientAttributes( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayMultipleHello"), + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayMultipleHello"), equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.CANCELLED.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort()))) + RPC_GRPC_STATUS_CODE, (long) Status.Code.CANCELLED.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfying( events -> { assertThat(events).hasSize(3); @@ -1191,19 +1117,15 @@ public void onCompleted() { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayMultipleHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.CANCELLED.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.getPort()), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> assertThat(val).isNotNull())) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayMultipleHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.CANCELLED.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> assertThat(val).isNotNull())) .hasEventsSatisfyingExactly( event -> event @@ -1281,17 +1203,13 @@ public void onCompleted() { .hasNoParent() .hasAttributesSatisfyingExactly( addExtraClientAttributes( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "grpc.reflection.v1alpha.ServerReflection"), + equalTo(RPC_SYSTEM, "grpc"), equalTo( - RpcIncubatingAttributes.RPC_METHOD, "ServerReflectionInfo"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort()))) + RPC_SERVICE, "grpc.reflection.v1alpha.ServerReflection"), + equalTo(RPC_METHOD, "ServerReflectionInfo"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( event -> event @@ -1314,21 +1232,15 @@ public void onCompleted() { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "grpc.reflection.v1alpha.ServerReflection"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ServerReflectionInfo"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.getPort()), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> assertThat(val).isNotNull())) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "grpc.reflection.v1alpha.ServerReflection"), + equalTo(RPC_METHOD, "ServerReflectionInfo"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> assertThat(val).isNotNull())) .hasEventsSatisfyingExactly( event -> event @@ -1394,14 +1306,12 @@ public void sayHello( .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraClientAttributes( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort()))) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( event -> event @@ -1423,19 +1333,15 @@ public void sayHello( .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "example.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SayHello"), - equalTo( - RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.getPort()), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> assertThat(val).isNotNull())) + equalTo(RPC_SYSTEM, "grpc"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> assertThat(val).isNotNull())) .hasEventsSatisfyingExactly( event -> event @@ -1692,10 +1598,9 @@ static List addExtraClientAttributes(AttributeAssertion... a List result = new ArrayList<>(); result.addAll(Arrays.asList(assertions)); if (Boolean.getBoolean("testLatestDeps")) { - result.add(equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4")); - result.add(equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1")); - result.add( - satisfies(NetworkAttributes.NETWORK_PEER_PORT, val -> assertThat(val).isNotNull())); + result.add(equalTo(NETWORK_TYPE, "ipv4")); + result.add(equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")); + result.add(satisfies(NETWORK_PEER_PORT, val -> assertThat(val).isNotNull())); } return result; } diff --git a/instrumentation/gwt-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/gwt/GwtTest.java b/instrumentation/gwt-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/gwt/GwtTest.java index 711d627c3ddb..426bc25b6dbd 100644 --- a/instrumentation/gwt-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/gwt/GwtTest.java +++ b/instrumentation/gwt-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/gwt/GwtTest.java @@ -7,13 +7,15 @@ import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanName; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import static org.junit.jupiter.api.Assertions.assertEquals; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.test.utils.PortUtils; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import java.io.File; import java.io.IOException; import java.net.URI; @@ -157,11 +159,9 @@ void testGwt() { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "gwt"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "test.gwt.shared.MessageService"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "sendMessage")))); + equalTo(RPC_SYSTEM, "gwt"), + equalTo(RPC_SERVICE, "test.gwt.shared.MessageService"), + equalTo(RPC_METHOD, "sendMessage")))); testing.clearData(); @@ -182,11 +182,9 @@ void testGwt() { .hasParent(trace.getSpan(0)) .hasException(new IOException()) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "gwt"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "test.gwt.shared.MessageService"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "sendMessage")))); + equalTo(RPC_SYSTEM, "gwt"), + equalTo(RPC_SERVICE, "test.gwt.shared.MessageService"), + equalTo(RPC_METHOD, "sendMessage")))); driver.close(); } diff --git a/instrumentation/hibernate/hibernate-3.3/javaagent/build.gradle.kts b/instrumentation/hibernate/hibernate-3.3/javaagent/build.gradle.kts index 0a67d56a2826..f46f2d1bf8ec 100644 --- a/instrumentation/hibernate/hibernate-3.3/javaagent/build.gradle.kts +++ b/instrumentation/hibernate/hibernate-3.3/javaagent/build.gradle.kts @@ -48,10 +48,20 @@ if (findProperty("testLatestDeps") as Boolean) { } } -tasks.withType().configureEach { - // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.hibernate.experimental-span-attributes=true") - // required on jdk17 - jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") - jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") +tasks { + withType().configureEach { + // TODO run tests both with and without experimental span attributes + jvmArgs("-Dotel.instrumentation.hibernate.experimental-span-attributes=true") + // required on jdk17 + jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") + jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") + } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/hibernate/hibernate-3.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v3_3/AbstractHibernateTest.java b/instrumentation/hibernate/hibernate-3.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v3_3/AbstractHibernateTest.java index 7042194917d5..ea780b6cb6c1 100644 --- a/instrumentation/hibernate/hibernate-3.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v3_3/AbstractHibernateTest.java +++ b/instrumentation/hibernate/hibernate-3.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v3_3/AbstractHibernateTest.java @@ -5,8 +5,17 @@ package io.opentelemetry.javaagent.instrumentation.hibernate.v3_3; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; @@ -15,7 +24,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -57,35 +65,35 @@ static void cleanUp() { } } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation static SpanDataAssert assertClientSpan(SpanDataAssert span, SpanData parent) { return span.hasKind(SpanKind.CLIENT) .hasParent(parent) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), - satisfies(DbIncubatingAttributes.DB_STATEMENT, val -> val.isInstanceOf(String.class)), - satisfies(DbIncubatingAttributes.DB_OPERATION, val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")); + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : "h2:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), + satisfies(maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation static SpanDataAssert assertClientSpan(SpanDataAssert span, SpanData parent, String verb) { return span.hasName(verb.concat(" db1.Value")) .hasKind(SpanKind.CLIENT) .hasParent(parent) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), stringAssert -> stringAssert.startsWith(verb.toLowerCase(Locale.ROOT))), - equalTo(DbIncubatingAttributes.DB_OPERATION, verb), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")); + equalTo(maybeStable(DB_OPERATION), verb), + equalTo(maybeStable(DB_SQL_TABLE), "Value")); } static SpanDataAssert assertSessionSpan(SpanDataAssert span, SpanData parent, String spanName) { diff --git a/instrumentation/hibernate/hibernate-4.0/javaagent/build.gradle.kts b/instrumentation/hibernate/hibernate-4.0/javaagent/build.gradle.kts index c2b3ac2d615b..aa70c11f7a09 100644 --- a/instrumentation/hibernate/hibernate-4.0/javaagent/build.gradle.kts +++ b/instrumentation/hibernate/hibernate-4.0/javaagent/build.gradle.kts @@ -71,20 +71,25 @@ testing { } } -tasks.withType().configureEach { - // required on jdk17 - jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") - jvmArgs("--add-opens=java.base/java.lang.invoke=ALL-UNNAMED") - jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") +tasks { + withType().configureEach { + // required on jdk17 + jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") + jvmArgs("--add-opens=java.base/java.lang.invoke=ALL-UNNAMED") + jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") - // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.hibernate.experimental-span-attributes=true") + // TODO run tests both with and without experimental span attributes + jvmArgs("-Dotel.instrumentation.hibernate.experimental-span-attributes=true") - jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") -} + jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") + } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } -tasks { check { dependsOn(testing.suites) + dependsOn(testStableSemconv) } } diff --git a/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/CriteriaTest.java b/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/CriteriaTest.java index 509173d79e80..829a9b7ab296 100644 --- a/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/CriteriaTest.java +++ b/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/CriteriaTest.java @@ -8,11 +8,19 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.api.trace.SpanKind.CLIENT; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.function.Consumer; import java.util.stream.Stream; import org.hibernate.Criteria; @@ -66,15 +74,17 @@ void testCriteria(String methodName, Consumer interaction) { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), stringAssert -> stringAssert.startsWith("select")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) diff --git a/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/EntityManagerTest.java b/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/EntityManagerTest.java index d9402fc439ca..e964af69647c 100644 --- a/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/EntityManagerTest.java +++ b/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/EntityManagerTest.java @@ -8,12 +8,20 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.api.trace.SpanKind.CLIENT; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static org.junit.jupiter.api.Named.named; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.function.BiConsumer; import java.util.function.Function; import java.util.stream.Stream; @@ -34,7 +42,7 @@ class EntityManagerTest extends AbstractHibernateTest { static final EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("test-pu"); - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest @MethodSource("provideArgumentsHibernateActionParameters") void testHibernateActions(Parameter parameter) { @@ -100,17 +108,17 @@ void testHibernateActions(Parameter parameter) { span.hasKind(CLIENT) .hasParent(trace.getSpan(2)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), satisfies( - DbIncubatingAttributes.DB_OPERATION, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value"))); + maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value"))); } else { trace.hasSpansSatisfyingExactly( @@ -131,17 +139,17 @@ void testHibernateActions(Parameter parameter) { span.hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), satisfies( - DbIncubatingAttributes.DB_OPERATION, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) @@ -184,7 +192,7 @@ private static Stream provideArgumentsHibernateActionParameters() { Arguments.of(named("remove", new Parameter("delete", true, true, EntityManager::remove)))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @Test void testHibernatePersist() { EntityManager entityManager = entityManagerFactory.createEntityManager(); @@ -217,17 +225,17 @@ void testHibernatePersist() { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), satisfies( - DbIncubatingAttributes.DB_OPERATION, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) @@ -243,20 +251,20 @@ void testHibernatePersist() { span.hasKind(CLIENT) .hasParent(trace.getSpan(3)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), satisfies( - DbIncubatingAttributes.DB_OPERATION, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")))); + maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest @MethodSource("provideArgumentsAttachesState") void testAttachesStateToQuery(Function queryBuildMethod) { @@ -292,17 +300,17 @@ void testAttachesStateToQuery(Function queryBuildMethod) { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), satisfies( - DbIncubatingAttributes.DB_OPERATION, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) diff --git a/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/QueryTest.java b/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/QueryTest.java index f68fe97e9ba5..fc049858e517 100644 --- a/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/QueryTest.java +++ b/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/QueryTest.java @@ -8,12 +8,20 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.api.trace.SpanKind.CLIENT; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static org.junit.jupiter.api.Named.named; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Iterator; import java.util.function.Consumer; import java.util.stream.Stream; @@ -25,7 +33,7 @@ class QueryTest extends AbstractHibernateTest { - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @Test void testHibernateQueryExecuteUpdateWithTransaction() { testing.runWithSpan( @@ -61,17 +69,17 @@ void testHibernateQueryExecuteUpdateWithTransaction() { span.hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), satisfies( - DbIncubatingAttributes.DB_OPERATION, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) @@ -85,7 +93,7 @@ void testHibernateQueryExecuteUpdateWithTransaction() { .get(stringKey("hibernate.session_id")))))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest @MethodSource("providesArgumentsSingleCall") void testHibernateQuerySingleCall(Parameter parameter) { @@ -119,15 +127,15 @@ void testHibernateQuerySingleCall(Parameter parameter) { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.startsWith("select ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")))); + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.startsWith("select ")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Value")))); } private static Stream providesArgumentsSingleCall() { @@ -155,7 +163,7 @@ private static Stream providesArgumentsSingleCall() { new Parameter("SELECT Value", sess -> sess.createQuery("from Value").scroll())))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @Test void testHibernateQueryIterate() { testing.runWithSpan( @@ -193,15 +201,15 @@ void testHibernateQueryIterate() { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.startsWith("select ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.startsWith("select ")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) diff --git a/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/SessionTest.java b/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/SessionTest.java index b40068f4827f..dad05c3e6fa3 100644 --- a/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/SessionTest.java +++ b/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/SessionTest.java @@ -8,14 +8,22 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.api.trace.SpanKind.CLIENT; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.ThrowableAssert.catchThrowable; import static org.junit.jupiter.api.Named.named; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -34,7 +42,7 @@ @SuppressWarnings("deprecation") // 'lock' is a deprecated method in the Session class class SessionTest extends AbstractHibernateTest { - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest @MethodSource("provideArgumentsHibernateAction") void testHibernateAction(Parameter parameter) { @@ -64,17 +72,17 @@ void testHibernateAction(Parameter parameter) { span.hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), satisfies( - DbIncubatingAttributes.DB_OPERATION, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) @@ -144,7 +152,7 @@ private static Stream provideArgumentsHibernateAction() { null)))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest @MethodSource("provideArgumentsHibernateActionStateless") void testHibernateActionStateless(Parameter parameter) { @@ -175,17 +183,17 @@ void testHibernateActionStateless(Parameter parameter) { span.hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), satisfies( - DbIncubatingAttributes.DB_OPERATION, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) @@ -292,7 +300,7 @@ private static Stream provideArgumentsHibernateActionStateless() { })))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest @MethodSource("provideArgumentsHibernateReplicate") void testHibernateReplicate(Parameter parameter) { @@ -322,17 +330,17 @@ void testHibernateReplicate(Parameter parameter) { span.hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), satisfies( - DbIncubatingAttributes.DB_OPERATION, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) @@ -348,17 +356,17 @@ void testHibernateReplicate(Parameter parameter) { span.hasKind(CLIENT) .hasParent(trace.getSpan(3)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), satisfies( - DbIncubatingAttributes.DB_OPERATION, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")))); + maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")))); } private static Stream provideArgumentsHibernateReplicate() { @@ -440,7 +448,7 @@ void testHibernateFailedReplicate() { .get(stringKey("hibernate.session_id")))))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest @MethodSource("provideArgumentsHibernateCommitAction") void testHibernateCommitAction(Parameter parameter) { @@ -482,17 +490,17 @@ void testHibernateCommitAction(Parameter parameter) { span.hasKind(CLIENT) .hasParent(trace.getSpan(2)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), satisfies( - DbIncubatingAttributes.DB_OPERATION, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")))); + maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")))); } private static Stream provideArgumentsHibernateCommitAction() { @@ -630,7 +638,7 @@ private static Stream provideArgumentsHibernateCommitAction() { null)))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest @MethodSource("provideArgumentsStateQuery") void testAttachesStateToQueryCreated(Consumer queryBuilder) { @@ -661,17 +669,17 @@ void testAttachesStateToQueryCreated(Consumer queryBuilder) { span.hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), satisfies( - DbIncubatingAttributes.DB_OPERATION, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) @@ -703,7 +711,7 @@ private static Stream provideArgumentsStateQuery() { session -> session.createSQLQuery("SELECT * FROM Value").list()))))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @Test void testHibernateOverlappingSessions() { testing.runWithSpan( @@ -762,15 +770,17 @@ void testHibernateOverlappingSessions() { .hasKind(CLIENT) .hasParent(trace.getSpan(2)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), stringAssert -> stringAssert.startsWith("insert")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "INSERT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + equalTo(maybeStable(DB_OPERATION), "INSERT"), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> { span.hasName("Session.save " + Value.class.getName()) .hasKind(INTERNAL) @@ -806,29 +816,33 @@ void testHibernateOverlappingSessions() { .hasKind(CLIENT) .hasParent(trace.getSpan(6)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), stringAssert -> stringAssert.startsWith("insert")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "INSERT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + equalTo(maybeStable(DB_OPERATION), "INSERT"), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> span.hasName("DELETE db1.Value") .hasKind(CLIENT) .hasParent(trace.getSpan(6)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), stringAssert -> stringAssert.startsWith("delete")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DELETE"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")))); + equalTo(maybeStable(DB_OPERATION), "DELETE"), + equalTo(maybeStable(DB_SQL_TABLE), "Value")))); assertThat(sessionId1.get()).isNotEqualTo(sessionId2.get()); assertThat(sessionId1.get()).isNotEqualTo(sessionId3.get()); diff --git a/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/spring/jpa/SpringJpaTest.java b/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/spring/jpa/SpringJpaTest.java index 17ebc73ba798..2cbed93d9b42 100644 --- a/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/spring/jpa/SpringJpaTest.java +++ b/instrumentation/hibernate/hibernate-4.0/javaagent/src/test/java/spring/jpa/SpringJpaTest.java @@ -8,14 +8,22 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.api.trace.SpanKind.CLIENT; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.regex.Pattern; import org.hibernate.Version; import org.junit.jupiter.api.Test; @@ -31,7 +39,7 @@ class SpringJpaTest { new AnnotationConfigApplicationContext(PersistenceConfig.class); CustomerRepository repo = context.getBean(CustomerRepository.class); - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @Test void testCrud() { String version = Version.getVersionString(); @@ -66,18 +74,20 @@ void testCrud() { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), val -> val.matches( Pattern.compile( "select ([^.]+).id([^,]*), ([^.]+).firstName([^,]*), ([^.]+).lastName(.*)from Customer(.*)"))), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Customer")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Customer")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) @@ -121,18 +131,20 @@ void testCrud() { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), val -> val.matches( Pattern.compile( "insert into Customer (.*) values \\(.*, \\?, \\?\\)"))), - equalTo(DbIncubatingAttributes.DB_OPERATION, "INSERT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Customer")), + equalTo(maybeStable(DB_OPERATION), "INSERT"), + equalTo(maybeStable(DB_SQL_TABLE), "Customer")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) @@ -164,14 +176,16 @@ void testCrud() { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "call next value for hibernate_sequence"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "CALL")), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + equalTo(maybeStable(DB_OPERATION), "CALL")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) @@ -188,18 +202,20 @@ void testCrud() { .hasKind(CLIENT) .hasParent(trace.getSpan(3)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), val -> val.matches( Pattern.compile( "insert into Customer (.*) values \\(.* \\?, \\?\\)"))), - equalTo(DbIncubatingAttributes.DB_OPERATION, "INSERT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Customer"))); + equalTo(maybeStable(DB_OPERATION), "INSERT"), + equalTo(maybeStable(DB_SQL_TABLE), "Customer"))); } }); testing.clearData(); @@ -235,18 +251,20 @@ void testCrud() { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), val -> val.matches( Pattern.compile( "select ([^.]+).id([^,]*), ([^.]+).firstName([^,]*), ([^.]+).lastName (.*)from Customer (.*)where ([^.]+).id=\\?"))), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Customer")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Customer")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) @@ -263,15 +281,17 @@ void testCrud() { .hasKind(CLIENT) .hasParent(trace.getSpan(3)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + equalTo( + maybeStable(DB_STATEMENT), "update Customer set firstName=?, lastName=? where id=?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "UPDATE"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Customer")))); + equalTo(maybeStable(DB_OPERATION), "UPDATE"), + equalTo(maybeStable(DB_SQL_TABLE), "Customer")))); testing.clearData(); Customer foundCustomer = @@ -301,18 +321,20 @@ void testCrud() { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), val -> val.matches( Pattern.compile( "select ([^.]+).id([^,]*), ([^.]+).firstName([^,]*), ([^.]+).lastName (.*)from Customer (.*)(where ([^.]+).lastName=\\?)"))), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Customer")))); + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Customer")))); testing.clearData(); testing.runWithSpan("parent", () -> repo.delete(foundCustomer)); @@ -339,18 +361,20 @@ void testCrud() { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), val -> val.matches( Pattern.compile( "select ([^.]+).id([^,]*), ([^.]+).firstName([^,]*), ([^.]+).lastName (.*)from Customer (.*)where ([^.]+).id=\\?"))), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Customer")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Customer")), span -> span.hasName("Session.delete spring.jpa.Customer") .hasKind(INTERNAL) @@ -371,15 +395,15 @@ void testCrud() { span.hasName("DELETE test.Customer") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "delete from Customer where id=?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DELETE"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Customer"))); + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + equalTo(maybeStable(DB_STATEMENT), "delete from Customer where id=?"), + equalTo(maybeStable(DB_OPERATION), "DELETE"), + equalTo(maybeStable(DB_SQL_TABLE), "Customer"))); } else { String findAction; @@ -404,18 +428,20 @@ void testCrud() { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), val -> val.matches( Pattern.compile( "select ([^.]+).id([^,]*), ([^.]+).firstName([^,]*), ([^.]+).lastName (.*)from Customer (.*)where ([^.]+).id=\\?"))), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Customer")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Customer")), span -> span.hasName("Session.merge spring.jpa.Customer") .hasKind(INTERNAL) @@ -444,15 +470,15 @@ void testCrud() { span.hasName("DELETE test.Customer") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "delete from Customer where id=?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DELETE"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Customer"))); + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + equalTo(maybeStable(DB_STATEMENT), "delete from Customer where id=?"), + equalTo(maybeStable(DB_OPERATION), "DELETE"), + equalTo(maybeStable(DB_SQL_TABLE), "Customer"))); } }); } diff --git a/instrumentation/hibernate/hibernate-6.0/javaagent/build.gradle.kts b/instrumentation/hibernate/hibernate-6.0/javaagent/build.gradle.kts index 0b7a9c5d339e..6cab40bb5cd5 100644 --- a/instrumentation/hibernate/hibernate-6.0/javaagent/build.gradle.kts +++ b/instrumentation/hibernate/hibernate-6.0/javaagent/build.gradle.kts @@ -35,7 +35,17 @@ otelJava { minJavaVersionSupported.set(JavaVersion.VERSION_11) } -tasks.withType().configureEach { - // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.hibernate.experimental-span-attributes=true") +tasks { + withType().configureEach { + // TODO run tests both with and without experimental span attributes + jvmArgs("-Dotel.instrumentation.hibernate.experimental-span-attributes=true") + } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/CriteriaTest.java b/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/CriteriaTest.java index d2ab1450ed09..c02374b1e18e 100644 --- a/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/CriteriaTest.java +++ b/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/CriteriaTest.java @@ -5,13 +5,21 @@ package io.opentelemetry.javaagent.instrumentation.hibernate.v6_0; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static org.junit.jupiter.api.Named.named; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; @@ -36,7 +44,7 @@ private static Stream provideParameters() { Arguments.of(named("getSingleResultOrNull", interactions.get(2)))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest(name = "{index}: {0}") @MethodSource("provideParameters") void testCriteriaQuery(Consumer> interaction) { @@ -76,15 +84,17 @@ void testCriteriaQuery(Consumer> interaction) { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), stringAssert -> stringAssert.startsWith("select")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> span.hasName("Transaction.commit") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/EntityManagerTest.java b/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/EntityManagerTest.java index 5bc237dc24b2..93aff1f3184e 100644 --- a/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/EntityManagerTest.java +++ b/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/EntityManagerTest.java @@ -5,15 +5,23 @@ package io.opentelemetry.javaagent.instrumentation.hibernate.v6_0; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static org.junit.jupiter.api.Named.named; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityTransaction; @@ -112,7 +120,7 @@ void testHibernateAction(Parameter parameter) { }); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest(name = "{index}: {0}") @MethodSource("provideAttachesStateParameters") void testAttachesStateToQuery(Parameter parameter) { @@ -138,15 +146,16 @@ void testAttachesStateToQuery(Parameter parameter) { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> assertTransactionCommitSpan( span, @@ -288,34 +297,34 @@ private static class Parameter { public final Function queryBuildMethod; } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation private static SpanDataAssert assertClientSpan(SpanDataAssert span, SpanData parent) { return span.hasKind(SpanKind.CLIENT) .hasParent(parent) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), - satisfies(DbIncubatingAttributes.DB_STATEMENT, val -> val.isInstanceOf(String.class)), - satisfies(DbIncubatingAttributes.DB_OPERATION, val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")); + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : "h2:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), + satisfies(maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation private static SpanDataAssert assertClientSpan( SpanDataAssert span, SpanData parent, String spanName) { return span.hasName(spanName) .hasKind(SpanKind.CLIENT) .hasParent(parent) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), - satisfies(DbIncubatingAttributes.DB_STATEMENT, val -> val.isInstanceOf(String.class)), - satisfies(DbIncubatingAttributes.DB_OPERATION, val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")); + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : "h2:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), + satisfies(maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")); } private static SpanDataAssert assertSessionSpan( diff --git a/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/ProcedureCallTest.java b/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/ProcedureCallTest.java index 1a1e36cf9a61..9f528df5cf7d 100644 --- a/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/ProcedureCallTest.java +++ b/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/ProcedureCallTest.java @@ -5,15 +5,22 @@ package io.opentelemetry.javaagent.instrumentation.hibernate.v6_0; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import jakarta.persistence.ParameterMode; import java.sql.Connection; import java.sql.DriverManager; @@ -69,7 +76,7 @@ static void cleanup() { } } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @Test void testProcedureCall() { testing.runWithSpan( @@ -102,12 +109,14 @@ void testProcedureCall() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "{call TEST_PROC()}"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "CALL")), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + equalTo(maybeStable(DB_STATEMENT), "{call TEST_PROC()}"), + equalTo(maybeStable(DB_OPERATION), "CALL")), span -> span.hasName("Transaction.commit") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/SessionTest.java b/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/SessionTest.java index d95c4fe7805d..69e95ce662db 100644 --- a/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/SessionTest.java +++ b/instrumentation/hibernate/hibernate-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/SessionTest.java @@ -5,8 +5,17 @@ package io.opentelemetry.javaagent.instrumentation.hibernate.v6_0; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Named.named; @@ -15,7 +24,6 @@ import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Arrays; import java.util.List; import java.util.Locale; @@ -219,7 +227,7 @@ void testHibernateCommitAction(Parameter parameter) { span -> assertClientSpan(span, trace.getSpan(2)))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest(name = "{index}: {0}") @MethodSource("provideAttachesStateToQueryParameters") void testAttachesStateToQuery(Parameter parameter) { @@ -243,15 +251,16 @@ void testAttachesStateToQuery(Parameter parameter) { span.hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")), + maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Value")), span -> assertSpanWithSessionId( span, @@ -803,35 +812,35 @@ private static SpanDataAssert assertSpanWithSessionId( equalTo(AttributeKey.stringKey("hibernate.session_id"), sessionId)); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation private static SpanDataAssert assertClientSpan(SpanDataAssert span, SpanData parent) { return span.hasKind(SpanKind.CLIENT) .hasParent(parent) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), - satisfies(DbIncubatingAttributes.DB_STATEMENT, val -> val.isInstanceOf(String.class)), - satisfies(DbIncubatingAttributes.DB_OPERATION, val -> val.isInstanceOf(String.class)), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")); + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : "h2:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.isInstanceOf(String.class)), + satisfies(maybeStable(DB_OPERATION), val -> val.isInstanceOf(String.class)), + equalTo(maybeStable(DB_SQL_TABLE), "Value")); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation private static SpanDataAssert assertClientSpan( SpanDataAssert span, SpanData parent, String verb) { return span.hasName(verb.concat(" db1.Value")) .hasKind(SpanKind.CLIENT) .hasParent(parent) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "h2"), - equalTo(DbIncubatingAttributes.DB_NAME, "db1"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "h2:mem:"), + equalTo(DB_SYSTEM, "h2"), + equalTo(maybeStable(DB_NAME), "db1"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : "h2:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), stringAssert -> stringAssert.startsWith(verb.toLowerCase(Locale.ROOT))), - equalTo(DbIncubatingAttributes.DB_OPERATION, verb), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value")); + equalTo(maybeStable(DB_OPERATION), verb), + equalTo(maybeStable(DB_SQL_TABLE), "Value")); } } diff --git a/instrumentation/hibernate/hibernate-6.0/spring-testing/build.gradle.kts b/instrumentation/hibernate/hibernate-6.0/spring-testing/build.gradle.kts index b55825df9f03..723a297a859d 100644 --- a/instrumentation/hibernate/hibernate-6.0/spring-testing/build.gradle.kts +++ b/instrumentation/hibernate/hibernate-6.0/spring-testing/build.gradle.kts @@ -26,11 +26,21 @@ otelJava { minJavaVersionSupported.set(JavaVersion.VERSION_17) } -tasks.withType().configureEach { - jvmArgs("-javaagent:" + springAgent.singleFile.absolutePath) +tasks { + withType().configureEach { + jvmArgs("-javaagent:" + springAgent.singleFile.absolutePath) - // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.hibernate.experimental-span-attributes=true") + // TODO run tests both with and without experimental span attributes + jvmArgs("-Dotel.instrumentation.hibernate.experimental-span-attributes=true") - jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") + jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") + } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/hibernate/hibernate-6.0/spring-testing/src/test/groovy/SpringJpaTest.groovy b/instrumentation/hibernate/hibernate-6.0/spring-testing/src/test/groovy/SpringJpaTest.groovy index 6be2e3e5cdb7..d0ffa8c6c36f 100644 --- a/instrumentation/hibernate/hibernate-6.0/spring-testing/src/test/groovy/SpringJpaTest.groovy +++ b/instrumentation/hibernate/hibernate-6.0/spring-testing/src/test/groovy/SpringJpaTest.groovy @@ -14,6 +14,8 @@ import spring.jpa.PersistenceConfig import static io.opentelemetry.api.trace.SpanKind.CLIENT import static io.opentelemetry.api.trace.SpanKind.INTERNAL +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable class SpringJpaTest extends AgentInstrumentationSpecification { @@ -62,12 +64,12 @@ class SpringJpaTest extends AgentInstrumentationSpecification { childOf span(1) attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "sa" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" ~/select ([^.]+)\.id([^,]*),([^.]+)\.firstName([^,]*),([^.]+)\.lastName(.*)from Customer(.*)/ - "$DbIncubatingAttributes.DB_OPERATION" "SELECT" - "$DbIncubatingAttributes.DB_SQL_TABLE" "Customer" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "sa" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" ~/select ([^.]+)\.id([^,]*),([^.]+)\.firstName([^,]*),([^.]+)\.lastName(.*)from Customer(.*)/ + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "SELECT" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "Customer" } } span(3) { @@ -118,11 +120,11 @@ class SpringJpaTest extends AgentInstrumentationSpecification { childOf span(1) attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "sa" - "$DbIncubatingAttributes.DB_STATEMENT" "call next value for Customer_SEQ" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_OPERATION" "CALL" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "sa" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" "call next value for Customer_SEQ" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "CALL" } } span(3) { @@ -139,12 +141,12 @@ class SpringJpaTest extends AgentInstrumentationSpecification { childOf span(3) attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "sa" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" ~/insert into Customer \(.*\) values \(.*\)/ - "$DbIncubatingAttributes.DB_OPERATION" "INSERT" - "$DbIncubatingAttributes.DB_SQL_TABLE" "Customer" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "sa" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" ~/insert into Customer \(.*\) values \(.*\)/ + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "INSERT" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "Customer" } } } else { @@ -154,12 +156,12 @@ class SpringJpaTest extends AgentInstrumentationSpecification { childOf span(1) attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "sa" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" ~/insert into Customer \(.*\) values \(.*\)/ - "$DbIncubatingAttributes.DB_OPERATION" "INSERT" - "$DbIncubatingAttributes.DB_SQL_TABLE" "Customer" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "sa" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" ~/insert into Customer \(.*\) values \(.*\)/ + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "INSERT" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "Customer" } } span(3) { @@ -209,12 +211,12 @@ class SpringJpaTest extends AgentInstrumentationSpecification { kind CLIENT attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "sa" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" ~/select ([^.]+)\.id([^,]*),([^.]+)\.firstName([^,]*),([^.]+)\.lastName (.*)from Customer (.*)where ([^.]+)\.id( ?)=( ?)\?/ - "$DbIncubatingAttributes.DB_OPERATION" "SELECT" - "$DbIncubatingAttributes.DB_SQL_TABLE" "Customer" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "sa" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" ~/select ([^.]+)\.id([^,]*),([^.]+)\.firstName([^,]*),([^.]+)\.lastName (.*)from Customer (.*)where ([^.]+)\.id( ?)=( ?)\?/ + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "SELECT" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "Customer" } } span(3) { @@ -230,12 +232,12 @@ class SpringJpaTest extends AgentInstrumentationSpecification { kind CLIENT attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "sa" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" ~/update Customer set firstName=\?,(.*)lastName=\? where id=\?/ - "$DbIncubatingAttributes.DB_OPERATION" "UPDATE" - "$DbIncubatingAttributes.DB_SQL_TABLE" "Customer" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "sa" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" ~/update Customer set firstName=\?,(.*)lastName=\? where id=\?/ + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "UPDATE" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "Customer" } } } @@ -273,12 +275,12 @@ class SpringJpaTest extends AgentInstrumentationSpecification { childOf span(1) attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "sa" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" ~/select ([^.]+)\.id([^,]*),([^.]+)\.firstName([^,]*),([^.]+)\.lastName (.*)from Customer (.*)(where ([^.]+)\.lastName( ?)=( ?)\?|)/ - "$DbIncubatingAttributes.DB_OPERATION" "SELECT" - "$DbIncubatingAttributes.DB_SQL_TABLE" "Customer" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "sa" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" ~/select ([^.]+)\.id([^,]*),([^.]+)\.firstName([^,]*),([^.]+)\.lastName (.*)from Customer (.*)(where ([^.]+)\.lastName( ?)=( ?)\?|)/ + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "SELECT" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "Customer" } } } @@ -317,12 +319,12 @@ class SpringJpaTest extends AgentInstrumentationSpecification { childOf span(1) attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "sa" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" ~/select ([^.]+)\.id([^,]*),([^.]+)\.firstName([^,]*),([^.]+)\.lastName (.*)from Customer (.*)where ([^.]+)\.id( ?)=( ?)\?/ - "$DbIncubatingAttributes.DB_OPERATION" "SELECT" - "$DbIncubatingAttributes.DB_SQL_TABLE" "Customer" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "sa" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" ~/select ([^.]+)\.id([^,]*),([^.]+)\.firstName([^,]*),([^.]+)\.lastName (.*)from Customer (.*)where ([^.]+)\.id( ?)=( ?)\?/ + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "SELECT" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "Customer" } } } @@ -342,12 +344,12 @@ class SpringJpaTest extends AgentInstrumentationSpecification { childOf span(1) attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "sa" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" ~/select ([^.]+)\.id([^,]*),([^.]+)\.firstName([^,]*),([^.]+)\.lastName (.*)from Customer (.*)where ([^.]+)\.id( ?)=( ?)\?/ - "$DbIncubatingAttributes.DB_OPERATION" "SELECT" - "$DbIncubatingAttributes.DB_SQL_TABLE" "Customer" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "sa" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" ~/select ([^.]+)\.id([^,]*),([^.]+)\.firstName([^,]*),([^.]+)\.lastName (.*)from Customer (.*)where ([^.]+)\.id( ?)=( ?)\?/ + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "SELECT" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "Customer" } } } @@ -372,12 +374,12 @@ class SpringJpaTest extends AgentInstrumentationSpecification { kind CLIENT attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "sa" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" "delete from Customer where id=?" - "$DbIncubatingAttributes.DB_OPERATION" "DELETE" - "$DbIncubatingAttributes.DB_SQL_TABLE" "Customer" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "sa" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" "delete from Customer where id=?" + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "DELETE" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "Customer" } } } diff --git a/instrumentation/hibernate/hibernate-procedure-call-4.3/javaagent/build.gradle.kts b/instrumentation/hibernate/hibernate-procedure-call-4.3/javaagent/build.gradle.kts index 22e69a8ad86c..dbf4fd8ee5da 100644 --- a/instrumentation/hibernate/hibernate-procedure-call-4.3/javaagent/build.gradle.kts +++ b/instrumentation/hibernate/hibernate-procedure-call-4.3/javaagent/build.gradle.kts @@ -31,7 +31,17 @@ dependencies { latestDepTestLibrary("org.hibernate:hibernate-entitymanager:5.+") // documented limitation } -tasks.withType().configureEach { - // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.hibernate.experimental-span-attributes=true") +tasks { + withType().configureEach { + // TODO run tests both with and without experimental span attributes + jvmArgs("-Dotel.instrumentation.hibernate.experimental-span-attributes=true") + } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/hibernate/hibernate-procedure-call-4.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_3/ProcedureCallTest.java b/instrumentation/hibernate/hibernate-procedure-call-4.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_3/ProcedureCallTest.java index 3e36101c7bef..b8f5a35968a6 100644 --- a/instrumentation/hibernate/hibernate-procedure-call-4.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_3/ProcedureCallTest.java +++ b/instrumentation/hibernate/hibernate-procedure-call-4.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_3/ProcedureCallTest.java @@ -8,8 +8,16 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.api.trace.SpanKind.CLIENT; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; @@ -17,7 +25,6 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; @@ -76,7 +83,7 @@ static void cleanUp() { } } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @Test void testProcedureCall() { @@ -114,12 +121,14 @@ void testProcedureCall() { .hasKind(CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "{call TEST_PROC()}"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "CALL")), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo(maybeStable(DB_STATEMENT), "{call TEST_PROC()}"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + equalTo(maybeStable(DB_OPERATION), "CALL")), span -> span.hasName("Transaction.commit") .hasKind(INTERNAL) diff --git a/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/build.gradle.kts b/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/build.gradle.kts index fbe70f17463c..54b6b8038d97 100644 --- a/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/build.gradle.kts +++ b/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/build.gradle.kts @@ -33,7 +33,7 @@ testing { implementation("org.testcontainers:testcontainers") if (latestDepTest) { implementation("org.hibernate.reactive:hibernate-reactive-core:1.+") - implementation("io.vertx:vertx-pg-client:+") + implementation("io.vertx:vertx-pg-client:4.+") } else { implementation("org.hibernate.reactive:hibernate-reactive-core:1.0.0.Final") implementation("io.vertx:vertx-pg-client:4.1.5") @@ -46,8 +46,8 @@ testing { dependencies { implementation("org.testcontainers:testcontainers") if (latestDepTest) { - implementation("org.hibernate.reactive:hibernate-reactive-core:2.+") - implementation("io.vertx:vertx-pg-client:+") + implementation("org.hibernate.reactive:hibernate-reactive-core:latest.release") + implementation("io.vertx:vertx-pg-client:latest.release") } else { implementation("org.hibernate.reactive:hibernate-reactive-core:2.0.0.Final") implementation("io.vertx:vertx-pg-client:4.4.2") @@ -79,8 +79,13 @@ tasks { } } + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + check { dependsOn(testing.suites) + dependsOn(testStableSemconv) } } diff --git a/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive1Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v1_0/HibernateReactiveTest.java b/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive1Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v1_0/HibernateReactiveTest.java index bf382ba49237..46f35502e2b0 100644 --- a/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive1Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v1_0/HibernateReactiveTest.java +++ b/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive1Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v1_0/HibernateReactiveTest.java @@ -5,15 +5,21 @@ package io.opentelemetry.javaagent.instrumentation.hibernate.reactive.v1_0; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import io.vertx.core.Vertx; import java.time.Duration; import java.util.concurrent.CompletableFuture; @@ -301,13 +307,13 @@ private static void assertTrace() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_NAME, DB), - equalTo(DbIncubatingAttributes.DB_USER, USER_DB), + equalTo(maybeStable(DB_NAME), DB), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "select value0_.id as id1_0_0_, value0_.name as name2_0_0_ from Value value0_ where value0_.id=$1"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value"), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Value"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)), span -> diff --git a/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive2Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v2_0/HibernateReactiveTest.java b/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive2Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v2_0/HibernateReactiveTest.java index 3d418604fd15..f78264ca3ff3 100644 --- a/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive2Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v2_0/HibernateReactiveTest.java +++ b/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive2Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v2_0/HibernateReactiveTest.java @@ -5,15 +5,21 @@ package io.opentelemetry.javaagent.instrumentation.hibernate.reactive.v2_0; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import io.vertx.core.Vertx; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Persistence; @@ -293,13 +299,13 @@ private static void assertTrace() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_NAME, DB), - equalTo(DbIncubatingAttributes.DB_USER, USER_DB), + equalTo(maybeStable(DB_NAME), DB), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "select v1_0.id,v1_0.name from Value v1_0 where v1_0.id=$1"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value"), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "Value"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)), span -> diff --git a/instrumentation/http-url-connection/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionTest.java b/instrumentation/http-url-connection/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionTest.java index 1fcdc8384c55..cb5c87f0057c 100644 --- a/instrumentation/http-url-connection/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionTest.java +++ b/instrumentation/http-url-connection/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionTest.java @@ -10,6 +10,13 @@ import static io.opentelemetry.api.trace.SpanKind.SERVER; import static io.opentelemetry.javaagent.instrumentation.httpurlconnection.StreamUtils.readLines; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; @@ -21,11 +28,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ErrorAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; @@ -123,12 +125,12 @@ public void traceRequest(boolean useCache) throws IOException { List attributes = new ArrayList<>( Arrays.asList( - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, url.getPort()), - equalTo(UrlAttributes.URL_FULL, url.toString()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, STATUS))); + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, url.getPort()), + equalTo(URL_FULL, url.toString()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, STATUS))); testing.waitAndAssertTraces( trace -> @@ -168,12 +170,12 @@ public void testBrokenApiUsage() throws IOException { List attributes = new ArrayList<>( Arrays.asList( - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, url.getPort()), - equalTo(UrlAttributes.URL_FULL, url.toString()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, STATUS))); + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, url.getPort()), + equalTo(URL_FULL, url.toString()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, STATUS))); testing.waitAndAssertTraces( trace -> @@ -219,12 +221,12 @@ public void testPostRequest() throws IOException { List attributes = new ArrayList<>( Arrays.asList( - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, url.getPort()), - equalTo(UrlAttributes.URL_FULL, url.toString()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, STATUS))); + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, url.getPort()), + equalTo(URL_FULL, url.toString()), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, STATUS))); testing.waitAndAssertTraces( trace -> @@ -272,12 +274,12 @@ public void getOutputStreamShouldTransformGetIntoPost() throws IOException { List attributes = new ArrayList<>( Arrays.asList( - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, url.getPort()), - equalTo(UrlAttributes.URL_FULL, url.toString()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, STATUS))); + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, url.getPort()), + equalTo(URL_FULL, url.toString()), + equalTo(HTTP_REQUEST_METHOD, "POST"), + equalTo(HTTP_RESPONSE_STATUS_CODE, STATUS))); testing.waitAndAssertTraces( trace -> @@ -314,12 +316,12 @@ public void traceRequestWithConnectionFailure(String scheme) { List attributes = new ArrayList<>( Arrays.asList( - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, PortUtils.UNUSABLE_PORT), - equalTo(UrlAttributes.URL_FULL, uri), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(ErrorAttributes.ERROR_TYPE, "java.net.ConnectException"))); + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, PortUtils.UNUSABLE_PORT), + equalTo(URL_FULL, uri), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(ERROR_TYPE, "java.net.ConnectException"))); testing.waitAndAssertTraces( trace -> diff --git a/instrumentation/influxdb-2.4/javaagent/build.gradle.kts b/instrumentation/influxdb-2.4/javaagent/build.gradle.kts index ab93583d3e03..04909adbc594 100644 --- a/instrumentation/influxdb-2.4/javaagent/build.gradle.kts +++ b/instrumentation/influxdb-2.4/javaagent/build.gradle.kts @@ -36,7 +36,10 @@ testing { } tasks { - test { + withType().configureEach { + // we disable the okhttp instrumentation, so we don't need to assert on the okhttp spans + // from the okhttp instrumentation we need OkHttp3IgnoredTypesConfigurer to fix context leaks + jvmArgs("-Dotel.instrumentation.okhttp.enabled=false") usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } @@ -45,10 +48,12 @@ tasks { dependsOn(testing.suites) } } -} -tasks.withType().configureEach { - // we disable the okhttp instrumentation, so we don't need to assert on the okhttp spans - // from the okhttp instrumentation we need OkHttp3IgnoredTypesConfigurer to fix context leaks - jvmArgs("-Dotel.instrumentation.okhttp.enabled=false") + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/influxdb-2.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbClientTest.java b/instrumentation/influxdb-2.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbClientTest.java index 40d5300fe5d8..4f3033991f97 100644 --- a/instrumentation/influxdb-2.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbClientTest.java +++ b/instrumentation/influxdb-2.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbClientTest.java @@ -5,7 +5,14 @@ package io.opentelemetry.javaagent.instrumentation.influxdb.v2_4; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; @@ -13,8 +20,6 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingQueue; @@ -318,13 +323,13 @@ private static List attributeAssertions( List result = new ArrayList<>(); result.addAll( asList( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "influxdb"), - equalTo(DbIncubatingAttributes.DB_NAME, databaseName), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_OPERATION, operation))); + equalTo(DB_SYSTEM, "influxdb"), + equalTo(maybeStable(DB_NAME), databaseName), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(maybeStable(DB_OPERATION), operation))); if (statement != null) { - result.add(equalTo(DbIncubatingAttributes.DB_STATEMENT, statement)); + result.add(equalTo(maybeStable(DB_STATEMENT), statement)); } return result; } diff --git a/instrumentation/influxdb-2.4/javaagent/src/test24/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbClient24Test.java b/instrumentation/influxdb-2.4/javaagent/src/test24/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbClient24Test.java index ddc4fcd6d191..e7bc6c08398e 100644 --- a/instrumentation/influxdb-2.4/javaagent/src/test24/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbClient24Test.java +++ b/instrumentation/influxdb-2.4/javaagent/src/test24/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbClient24Test.java @@ -5,7 +5,14 @@ package io.opentelemetry.javaagent.instrumentation.influxdb.v2_4; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; @@ -13,8 +20,6 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -147,13 +152,13 @@ private static List attributeAssertions( List result = new ArrayList<>(); result.addAll( asList( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "influxdb"), - equalTo(DbIncubatingAttributes.DB_NAME, databaseName), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_OPERATION, operation))); + equalTo(DB_SYSTEM, "influxdb"), + equalTo(maybeStable(DB_NAME), databaseName), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(maybeStable(DB_OPERATION), operation))); if (statement != null) { - result.add(equalTo(DbIncubatingAttributes.DB_STATEMENT, statement)); + result.add(equalTo(maybeStable(DB_STATEMENT), statement)); } return result; } diff --git a/instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/httpclient/AbstractJavaHttpClientTest.java b/instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/httpclient/AbstractJavaHttpClientTest.java index 02e9c3818688..bf747d53f252 100644 --- a/instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/httpclient/AbstractJavaHttpClientTest.java +++ b/instrumentation/java-http-client/testing/src/main/java/io/opentelemetry/instrumentation/httpclient/AbstractJavaHttpClientTest.java @@ -5,11 +5,12 @@ package io.opentelemetry.instrumentation.httpclient; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; + import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.NetworkAttributes; import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; @@ -94,7 +95,7 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { if ("http://localhost:61/".equals(uri.toString()) || "https://192.0.2.1/".equals(uri.toString()) || uri.toString().contains("/read-timeout")) { - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); } return attributes; }); diff --git a/instrumentation/java-util-logging/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingTest.java b/instrumentation/java-util-logging/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingTest.java index a18bfd8c871b..518390e36a9c 100644 --- a/instrumentation/java-util-logging/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingTest.java +++ b/instrumentation/java-util-logging/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingTest.java @@ -8,13 +8,15 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogRecordData; -import io.opentelemetry.semconv.ExceptionAttributes; import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; import java.util.logging.Level; import java.util.logging.Logger; @@ -117,11 +119,10 @@ private static void test( .hasAttributesSatisfyingExactly( equalTo(ThreadIncubatingAttributes.THREAD_NAME, Thread.currentThread().getName()), equalTo(ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()), - equalTo(ExceptionAttributes.EXCEPTION_TYPE, IllegalStateException.class.getName()), - equalTo(ExceptionAttributes.EXCEPTION_MESSAGE, "hello"), + equalTo(EXCEPTION_TYPE, IllegalStateException.class.getName()), + equalTo(EXCEPTION_MESSAGE, "hello"), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, - v -> v.contains(JavaUtilLoggingTest.class.getName()))); + EXCEPTION_STACKTRACE, v -> v.contains(JavaUtilLoggingTest.class.getName()))); } else { assertThat(log) .hasAttributesSatisfyingExactly( diff --git a/instrumentation/javalin-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javalin/v5_0/JavalinTest.java b/instrumentation/javalin-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javalin/v5_0/JavalinTest.java index b9c16a4b941c..5ea3fe578ae4 100644 --- a/instrumentation/javalin-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javalin/v5_0/JavalinTest.java +++ b/instrumentation/javalin-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javalin/v5_0/JavalinTest.java @@ -8,20 +8,25 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ClientAttributes.CLIENT_ADDRESS; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_PATH; +import static io.opentelemetry.semconv.UrlAttributes.URL_SCHEME; +import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL; import io.javalin.Javalin; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.test.utils.PortUtils; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.ClientAttributes; -import io.opentelemetry.semconv.ErrorAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.UserAgentAttributes; import io.opentelemetry.testing.internal.armeria.client.WebClient; import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse; import org.junit.jupiter.api.AfterAll; @@ -66,22 +71,18 @@ void testSpanNameAndHttpRouteSpanWithPathParamResponseSuccessful() { .hasKind(SpanKind.SERVER) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(UrlAttributes.URL_SCHEME, "http"), - equalTo(UrlAttributes.URL_PATH, "/param/" + id), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - satisfies( - UserAgentAttributes.USER_AGENT_ORIGINAL, - val -> val.isInstanceOf(String.class)), + equalTo(URL_SCHEME, "http"), + equalTo(URL_PATH, "/param/" + id), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, "/param/{id}"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(ClientAttributes.CLIENT_ADDRESS, "127.0.0.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class))))); + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port), + equalTo(CLIENT_ADDRESS, "127.0.0.1"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class))))); } @Test @@ -96,23 +97,19 @@ void testSpanNameAndHttpRouteSpanResponseError() { .hasKind(SpanKind.SERVER) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(UrlAttributes.URL_SCHEME, "http"), - equalTo(UrlAttributes.URL_PATH, "/error"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 500), - satisfies( - UserAgentAttributes.USER_AGENT_ORIGINAL, - val -> val.isInstanceOf(String.class)), + equalTo(URL_SCHEME, "http"), + equalTo(URL_PATH, "/error"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 500), + satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, "/error"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(ErrorAttributes.ERROR_TYPE, "500"), - equalTo(ClientAttributes.CLIENT_ADDRESS, "127.0.0.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class))))); + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port), + equalTo(ERROR_TYPE, "500"), + equalTo(CLIENT_ADDRESS, "127.0.0.1"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class))))); } @Test @@ -128,22 +125,18 @@ public void testSpanNameAndHttpRouteSpanAsyncRouteResponseSuccessful() { .hasKind(SpanKind.SERVER) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(UrlAttributes.URL_SCHEME, "http"), - equalTo(UrlAttributes.URL_PATH, "/async"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - satisfies( - UserAgentAttributes.USER_AGENT_ORIGINAL, - val -> val.isInstanceOf(String.class)), + equalTo(URL_SCHEME, "http"), + equalTo(URL_PATH, "/async"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, "/async"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(ClientAttributes.CLIENT_ADDRESS, "127.0.0.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class))))); + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port), + equalTo(CLIENT_ADDRESS, "127.0.0.1"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class))))); } @Test diff --git a/instrumentation/jaxrs-client/jaxrs-client-1.1-testing/src/test/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/JaxRsClientV1Test.java b/instrumentation/jaxrs-client/jaxrs-client-1.1-testing/src/test/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/JaxRsClientV1Test.java index 21c1de97490d..6d22d2cd7dda 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-1.1-testing/src/test/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/JaxRsClientV1Test.java +++ b/instrumentation/jaxrs-client/jaxrs-client-1.1-testing/src/test/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/JaxRsClientV1Test.java @@ -5,6 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.jaxrsclient; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; + import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientHandlerException; import com.sun.jersey.api.client.ClientResponse; @@ -17,7 +19,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; -import io.opentelemetry.semconv.NetworkAttributes; import java.net.URI; import java.util.HashSet; import java.util.Map; @@ -54,7 +55,7 @@ protected void configure(HttpClientTestOptions.Builder options) { serverEndpoint -> { Set> attributes = new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); return attributes; }); } diff --git a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/JbossLogmanagerTest.java b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/JbossLogmanagerTest.java index acef12077658..97d886c020a5 100644 --- a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/JbossLogmanagerTest.java +++ b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/JbossLogmanagerTest.java @@ -8,6 +8,9 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; import static java.util.concurrent.TimeUnit.MILLISECONDS; import io.opentelemetry.api.common.AttributeKey; @@ -18,7 +21,6 @@ import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.ExceptionAttributes; import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; import java.time.Instant; import java.util.ArrayList; @@ -156,12 +158,10 @@ private static void test( if (logException) { attributeAsserts.addAll( Arrays.asList( - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - IllegalStateException.class.getName()), - equalTo(ExceptionAttributes.EXCEPTION_MESSAGE, "hello"), + equalTo(EXCEPTION_TYPE, IllegalStateException.class.getName()), + equalTo(EXCEPTION_MESSAGE, "hello"), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, + EXCEPTION_STACKTRACE, v -> v.contains(JbossLogmanagerTest.class.getName())))); } logRecord.hasAttributesSatisfyingExactly(attributeAsserts); diff --git a/instrumentation/jdbc/javaagent/build.gradle.kts b/instrumentation/jdbc/javaagent/build.gradle.kts index c5e46b8e24ac..07bdea12d3ed 100644 --- a/instrumentation/jdbc/javaagent/build.gradle.kts +++ b/instrumentation/jdbc/javaagent/build.gradle.kts @@ -67,7 +67,25 @@ tasks { jvmArgs("-Dotel.instrumentation.jdbc-datasource.enabled=true") } + val testStableSemconv by registering(Test::class) { + filter { + excludeTestsMatching("SlickTest") + } + jvmArgs("-Dotel.instrumentation.jdbc-datasource.enabled=true") + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + val testSlickStableSemconv by registering(Test::class) { + filter { + includeTestsMatching("SlickTest") + } + include("**/SlickTest.*") + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + check { dependsOn(testSlick) + dependsOn(testStableSemconv) + dependsOn(testSlickStableSemconv) } } diff --git a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java index 6d9742e9223e..649b5c480e45 100644 --- a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java +++ b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java @@ -5,8 +5,16 @@ package io.opentelemetry.javaagent.instrumentation.jdbc.test; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; @@ -24,7 +32,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.testing.assertj.TraceAssert; -import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.beans.PropertyVetoException; @@ -69,7 +76,7 @@ class JdbcInstrumentationTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation static final AttributeKey DB_CONNECTION_STRING = DbIncubatingAttributes.DB_CONNECTION_STRING; @@ -365,19 +372,13 @@ public void testBasicStatement( .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, system), - equalTo(DbIncubatingAttributes.DB_NAME, dbNameLower), - satisfies( - DbIncubatingAttributes.DB_USER, - val -> { - if (username != null) { - val.isEqualTo(username); - } - }), - equalTo(DB_CONNECTION_STRING, url), - equalTo(DbIncubatingAttributes.DB_STATEMENT, sanitizedQuery), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, table)))); + equalTo(DB_SYSTEM, system), + equalTo(maybeStable(DB_NAME), dbNameLower), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : username), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : url), + equalTo(maybeStable(DB_STATEMENT), sanitizedQuery), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), table)))); } static Stream preparedStatementStream() throws SQLException { @@ -490,19 +491,13 @@ void testPreparedStatementExecute( .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfying( - equalTo(DbIncubatingAttributes.DB_SYSTEM, system), - equalTo(DbIncubatingAttributes.DB_NAME, dbNameLower), - satisfies( - DbIncubatingAttributes.DB_USER, - val -> { - if (username != null) { - val.isEqualTo(username); - } - }), - equalTo(DB_CONNECTION_STRING, url), - equalTo(DbIncubatingAttributes.DB_STATEMENT, sanitizedQuery), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, table)))); + equalTo(DB_SYSTEM, system), + equalTo(maybeStable(DB_NAME), dbNameLower), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : username), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : url), + equalTo(maybeStable(DB_STATEMENT), sanitizedQuery), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), table)))); } @ParameterizedTest @@ -533,19 +528,13 @@ void testPreparedStatementQuery( .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfying( - equalTo(DbIncubatingAttributes.DB_SYSTEM, system), - equalTo(DbIncubatingAttributes.DB_NAME, dbNameLower), - satisfies( - DbIncubatingAttributes.DB_USER, - val -> { - if (username != null) { - val.isEqualTo(username); - } - }), - equalTo(DB_CONNECTION_STRING, url), - equalTo(DbIncubatingAttributes.DB_STATEMENT, sanitizedQuery), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, table)))); + equalTo(DB_SYSTEM, system), + equalTo(maybeStable(DB_NAME), dbNameLower), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : username), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : url), + equalTo(maybeStable(DB_STATEMENT), sanitizedQuery), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), table)))); } @ParameterizedTest @@ -576,19 +565,13 @@ void testPreparedCall( .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfying( - equalTo(DbIncubatingAttributes.DB_SYSTEM, system), - equalTo(DbIncubatingAttributes.DB_NAME, dbNameLower), - satisfies( - DbIncubatingAttributes.DB_USER, - val -> { - if (username != null) { - val.isEqualTo(username); - } - }), - equalTo(DB_CONNECTION_STRING, url), - equalTo(DbIncubatingAttributes.DB_STATEMENT, sanitizedQuery), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, table)))); + equalTo(DB_SYSTEM, system), + equalTo(maybeStable(DB_NAME), dbNameLower), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : username), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : url), + equalTo(maybeStable(DB_STATEMENT), sanitizedQuery), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), table)))); } static Stream statementUpdateStream() throws SQLException { @@ -718,19 +701,13 @@ void testStatementUpdate( .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfying( - equalTo(DbIncubatingAttributes.DB_SYSTEM, system), - equalTo(DbIncubatingAttributes.DB_NAME, dbNameLower), - satisfies( - DbIncubatingAttributes.DB_USER, - val -> { - if (username != null) { - val.isEqualTo(username); - } - }), - equalTo(DB_CONNECTION_STRING, url), - equalTo(DbIncubatingAttributes.DB_STATEMENT, query), - equalTo(DbIncubatingAttributes.DB_OPERATION, "CREATE TABLE"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, table)))); + equalTo(DB_SYSTEM, system), + equalTo(maybeStable(DB_NAME), dbNameLower), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : username), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : url), + equalTo(maybeStable(DB_STATEMENT), query), + equalTo(maybeStable(DB_OPERATION), "CREATE TABLE"), + equalTo(maybeStable(DB_SQL_TABLE), table)))); } static Stream preparedStatementUpdateStream() throws SQLException { @@ -826,19 +803,13 @@ void testPreparedStatementUpdate( .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfying( - equalTo(DbIncubatingAttributes.DB_SYSTEM, system), - equalTo(DbIncubatingAttributes.DB_NAME, dbNameLower), - satisfies( - DbIncubatingAttributes.DB_USER, - val -> { - if (username != null) { - val.isEqualTo(username); - } - }), - equalTo(DB_CONNECTION_STRING, url), - equalTo(DbIncubatingAttributes.DB_STATEMENT, query), - equalTo(DbIncubatingAttributes.DB_OPERATION, "CREATE TABLE"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, table)))); + equalTo(DB_SYSTEM, system), + equalTo(maybeStable(DB_NAME), dbNameLower), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : username), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : url), + equalTo(maybeStable(DB_STATEMENT), query), + equalTo(maybeStable(DB_OPERATION), "CREATE TABLE"), + equalTo(maybeStable(DB_SQL_TABLE), table)))); } static Stream connectionConstructorStream() { @@ -939,19 +910,13 @@ void testConnectionConstructorThrowing( .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfying( - equalTo(DbIncubatingAttributes.DB_SYSTEM, system), - equalTo(DbIncubatingAttributes.DB_NAME, dbNameLower), - satisfies( - DbIncubatingAttributes.DB_USER, - val -> { - if (username != null) { - val.isEqualTo(username); - } - }), - equalTo(DB_CONNECTION_STRING, url), - equalTo(DbIncubatingAttributes.DB_STATEMENT, sanitizedQuery), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, table)))); + equalTo(DB_SYSTEM, system), + equalTo(maybeStable(DB_NAME), dbNameLower), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : username), + equalTo(DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : url), + equalTo(maybeStable(DB_STATEMENT), sanitizedQuery), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), table)))); } static Stream getConnectionStream() { @@ -1015,16 +980,12 @@ void testGetConnection( CodeIncubatingAttributes.CODE_NAMESPACE, datasource.getClass().getName()), equalTo(CodeIncubatingAttributes.CODE_FUNCTION, "getConnection"), - equalTo(DbIncubatingAttributes.DB_SYSTEM, system), - satisfies( - DbIncubatingAttributes.DB_USER, - val -> { - if (user != null) { - val.isEqualTo(user); - } - }), - equalTo(DbIncubatingAttributes.DB_NAME, "jdbcunittest"), - equalTo(DB_CONNECTION_STRING, connectionString)))); + equalTo(DB_SYSTEM, system), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : user), + equalTo(maybeStable(DB_NAME), "jdbcunittest"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : connectionString)))); if (recursive) { assertions.add( span -> @@ -1036,16 +997,12 @@ void testGetConnection( CodeIncubatingAttributes.CODE_NAMESPACE, datasource.getClass().getName()), equalTo(CodeIncubatingAttributes.CODE_FUNCTION, "getConnection"), - equalTo(DbIncubatingAttributes.DB_SYSTEM, system), - satisfies( - DbIncubatingAttributes.DB_USER, - val -> { - if (user != null) { - val.isEqualTo(user); - } - }), - equalTo(DbIncubatingAttributes.DB_NAME, "jdbcunittest"), - equalTo(DB_CONNECTION_STRING, connectionString))); + equalTo(DB_SYSTEM, system), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : user), + equalTo(maybeStable(DB_NAME), "jdbcunittest"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : connectionString))); } trace.hasSpansSatisfyingExactly(assertions); }); @@ -1078,10 +1035,12 @@ void testGetClientInfoException(String query) throws SQLException { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfying( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "other_sql"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "testing ?"), - equalTo(DB_CONNECTION_STRING, "testdb://localhost"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost")))); + equalTo(DB_SYSTEM, "other_sql"), + equalTo(maybeStable(DB_STATEMENT), "testing ?"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "testdb://localhost"), + equalTo(SERVER_ADDRESS, "localhost")))); } static Stream spanNameStream() { @@ -1159,13 +1118,15 @@ void testProduceProperSpanName( .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfying( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "other_sql"), - equalTo(DbIncubatingAttributes.DB_NAME, databaseName), - equalTo(DB_CONNECTION_STRING, "testdb://localhost"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, sanitizedQuery), - equalTo(DbIncubatingAttributes.DB_OPERATION, operation), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, table), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost")))); + equalTo(DB_SYSTEM, "other_sql"), + equalTo(maybeStable(DB_NAME), databaseName), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "testdb://localhost"), + equalTo(maybeStable(DB_STATEMENT), sanitizedQuery), + equalTo(maybeStable(DB_OPERATION), operation), + equalTo(maybeStable(DB_SQL_TABLE), table), + equalTo(SERVER_ADDRESS, "localhost")))); } @ParameterizedTest @@ -1207,17 +1168,17 @@ void testConnectionCached(String connectionPoolName) throws SQLException { span.hasName("SELECT INFORMATION_SCHEMA.SYSTEM_USERS") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfying( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, dbNameLower), - equalTo(DbIncubatingAttributes.DB_USER, "SA"), - equalTo(DB_CONNECTION_STRING, "hsqldb:mem:"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), dbNameLower), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "SA"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "SELECT ? FROM INFORMATION_SCHEMA.SYSTEM_USERS"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), equalTo( - DbIncubatingAttributes.DB_SQL_TABLE, - "INFORMATION_SCHEMA.SYSTEM_USERS"))); + maybeStable(DB_STATEMENT), + "SELECT ? FROM INFORMATION_SCHEMA.SYSTEM_USERS"), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "INFORMATION_SCHEMA.SYSTEM_USERS"))); for (int i = 0; i < numQueries; i++) { assertions.add(traceAssertConsumer); } @@ -1281,12 +1242,14 @@ void testHandleRecursiveStatements( .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfying( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "other_sql"), - equalTo(DB_CONNECTION_STRING, "testdb://localhost"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM table"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "table"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost")))); + equalTo(DB_SYSTEM, "other_sql"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "testdb://localhost"), + equalTo(maybeStable(DB_STATEMENT), "SELECT * FROM table"), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "table"), + equalTo(SERVER_ADDRESS, "localhost")))); } // regression test for diff --git a/instrumentation/jdbc/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/scalaexecutors/SlickTest.scala b/instrumentation/jdbc/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/scalaexecutors/SlickTest.scala index fa8684e5dcfb..e12d958a6b73 100644 --- a/instrumentation/jdbc/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/scalaexecutors/SlickTest.scala +++ b/instrumentation/jdbc/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/scalaexecutors/SlickTest.scala @@ -6,24 +6,24 @@ package io.opentelemetry.javaagent.instrumentation.scalaexecutors import io.opentelemetry.api.trace.{SpanKind, Tracer} +import io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv +import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable import io.opentelemetry.instrumentation.testing.junit.{ AgentInstrumentationExtension, InstrumentationExtension } import io.opentelemetry.javaagent.testing.common.Java8BytecodeBridge -import io.opentelemetry.sdk.testing.assertj.{SpanDataAssert, TraceAssert} import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DbSystemIncubatingValues - -import java.util.function.Consumer +import io.opentelemetry.sdk.testing.assertj.{SpanDataAssert, TraceAssert} +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes._ import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.{Test, TestInstance} import org.junit.jupiter.api.extension.RegisterExtension +import org.junit.jupiter.api.{Test, TestInstance} +import slick.jdbc.H2Profile.api._ -import scala.concurrent.{Await, Future} +import java.util.function.Consumer import scala.concurrent.duration.Duration -import slick.jdbc.H2Profile.api._ +import scala.concurrent.{Await, Future} @TestInstance(TestInstance.Lifecycle.PER_CLASS) class SlickTest { @@ -81,18 +81,18 @@ class SlickTest { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( + equalTo(DB_SYSTEM, DbSystemIncubatingValues.H2), + equalTo(maybeStable(DB_NAME), Db), equalTo( - DbIncubatingAttributes.DB_SYSTEM, - DbSystemIncubatingValues.H2 + DB_USER, + if (emitStableDatabaseSemconv()) null else Username ), - equalTo(DbIncubatingAttributes.DB_NAME, Db), - equalTo(DbIncubatingAttributes.DB_USER, Username), equalTo( - DbIncubatingAttributes.DB_CONNECTION_STRING, - "h2:mem:" + DB_CONNECTION_STRING, + if (emitStableDatabaseSemconv()) null else "h2:mem:" ), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SELECT ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT") + equalTo(maybeStable(DB_STATEMENT), "SELECT ?"), + equalTo(maybeStable(DB_OPERATION), "SELECT") ) } ) diff --git a/instrumentation/jdbc/library/build.gradle.kts b/instrumentation/jdbc/library/build.gradle.kts index 02af72e4c9dc..63116006a6c9 100644 --- a/instrumentation/jdbc/library/build.gradle.kts +++ b/instrumentation/jdbc/library/build.gradle.kts @@ -41,4 +41,12 @@ tasks { into("build/extracted/shadow-bootstrap") include("io/opentelemetry/javaagent/bootstrap/**") } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java index dc69acb48c45..1f3db9d51bfa 100644 --- a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java +++ b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java @@ -5,13 +5,14 @@ package io.opentelemetry.instrumentation.jdbc.datasource; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.instrumentation.jdbc.internal.OpenTelemetryConnection; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; @@ -42,7 +43,7 @@ void buildWithDefaults() throws SQLException { span -> span.hasName("TestDataSource.getConnection"), span -> span.hasName("SELECT dbname") - .hasAttribute(equalTo(DbIncubatingAttributes.DB_STATEMENT, "SELECT ?;")))); + .hasAttribute(equalTo(maybeStable(DB_STATEMENT), "SELECT ?;")))); } @Test @@ -118,7 +119,7 @@ void buildWithSanitizationDisabled() throws SQLException { span -> span.hasName("TestDataSource.getConnection"), span -> span.hasName("SELECT dbname") - .hasAttribute(equalTo(DbIncubatingAttributes.DB_STATEMENT, "SELECT 1;")))); + .hasAttribute(equalTo(maybeStable(DB_STATEMENT), "SELECT 1;")))); } @Test diff --git a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/OpenTelemetryDataSourceTest.java b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/OpenTelemetryDataSourceTest.java index 6c775f9c2b7f..b185c16f5a98 100644 --- a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/OpenTelemetryDataSourceTest.java +++ b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/OpenTelemetryDataSourceTest.java @@ -5,7 +5,12 @@ package io.opentelemetry.instrumentation.jdbc.datasource; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.params.provider.Arguments.arguments; @@ -16,7 +21,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.sql.Connection; import java.sql.SQLException; import java.util.stream.Stream; @@ -33,7 +37,7 @@ class OpenTelemetryDataSourceTest { @RegisterExtension static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest @ArgumentsSource(GetConnectionMethods.class) void shouldEmitGetConnectionSpans(GetConnectionFunction getConnection) throws SQLException { @@ -55,11 +59,13 @@ void shouldEmitGetConnectionSpans(GetConnectionFunction getConnection) throws SQ CodeIncubatingAttributes.CODE_NAMESPACE, TestDataSource.class.getName()), equalTo(CodeIncubatingAttributes.CODE_FUNCTION, "getConnection"), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "postgresql"), - equalTo(DbIncubatingAttributes.DB_NAME, "dbname"), + equalTo(DB_SYSTEM, "postgresql"), + equalTo(maybeStable(DB_NAME), "dbname"), equalTo( - DbIncubatingAttributes.DB_CONNECTION_STRING, - "postgresql://127.0.0.1:5432")))); + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() + ? null + : "postgresql://127.0.0.1:5432")))); assertThat(connection).isExactlyInstanceOf(OpenTelemetryConnection.class); DbInfo dbInfo = ((OpenTelemetryConnection) connection).getDbInfo(); diff --git a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/OpenTelemetryConnectionTest.java b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/OpenTelemetryConnectionTest.java index 5405ddd14026..7b7b90c02dc8 100644 --- a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/OpenTelemetryConnectionTest.java +++ b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/OpenTelemetryConnectionTest.java @@ -5,8 +5,19 @@ package io.opentelemetry.instrumentation.jdbc.internal; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; import static io.opentelemetry.instrumentation.jdbc.internal.JdbcInstrumenterFactory.createStatementInstrumenter; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.OpenTelemetry; @@ -17,8 +28,6 @@ import io.opentelemetry.instrumentation.jdbc.internal.dbinfo.DbInfo; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; @@ -187,15 +196,16 @@ private static void jdbcTraceAssertion(DbInfo dbInfo, String query) { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, dbInfo.getSystem()), - equalTo(DbIncubatingAttributes.DB_NAME, dbInfo.getName()), - equalTo(DbIncubatingAttributes.DB_USER, dbInfo.getUser()), + equalTo(DB_SYSTEM, dbInfo.getSystem()), + equalTo(maybeStable(DB_NAME), dbInfo.getName()), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : dbInfo.getUser()), equalTo( - DbIncubatingAttributes.DB_CONNECTION_STRING, dbInfo.getShortUrl()), - equalTo(DbIncubatingAttributes.DB_STATEMENT, query), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "users"), - equalTo(ServerAttributes.SERVER_ADDRESS, dbInfo.getHost()), - equalTo(ServerAttributes.SERVER_PORT, dbInfo.getPort())))); + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : dbInfo.getShortUrl()), + equalTo(maybeStable(DB_STATEMENT), query), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "users"), + equalTo(SERVER_ADDRESS, dbInfo.getHost()), + equalTo(SERVER_PORT, dbInfo.getPort())))); } } diff --git a/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts b/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts index 4af0c8ce1d33..22293482fb0a 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts +++ b/instrumentation/jedis/jedis-1.4/javaagent/build.gradle.kts @@ -43,7 +43,12 @@ tasks { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + check { dependsOn(testing.suites) + dependsOn(testStableSemconv) } } diff --git a/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java b/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java index cdca4a29498c..0786a51b1afc 100644 --- a/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java +++ b/instrumentation/jedis/jedis-1.4/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/AbstractJedisTest.java @@ -5,14 +5,18 @@ package io.opentelemetry.javaagent.instrumentation.jedis; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -65,11 +69,11 @@ void setCommand() { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET"), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port)))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET foo ?"), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port)))); } @Test @@ -86,22 +90,22 @@ void getCommand() { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET"), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port))), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET foo ?"), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET foo"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET"), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port)))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET foo"), + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port)))); } @Test @@ -118,21 +122,21 @@ void commandWithNoArguments() { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET"), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port))), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET foo ?"), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("RANDOMKEY") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RANDOMKEY"), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port)))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "RANDOMKEY"), + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY"), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port)))); } } diff --git a/instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts b/instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts index 2a11c52f2268..532a471e280b 100644 --- a/instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts +++ b/instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts @@ -29,7 +29,15 @@ dependencies { } tasks { - test { + withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java b/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java index 1889d2a7d66d..921610937bc1 100644 --- a/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java +++ b/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java @@ -5,16 +5,22 @@ package io.opentelemetry.javaagent.instrumentation.jedis.v3_0; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.InetAddress; import java.net.UnknownHostException; import org.assertj.core.api.AbstractLongAssert; @@ -74,16 +80,14 @@ void setCommand() { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET"), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative)))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET foo ?"), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)))); } @Test @@ -100,32 +104,28 @@ void getCommand() { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET"), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative))), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET foo ?"), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET foo"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET"), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative)))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET foo"), + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)))); } @Test @@ -142,31 +142,27 @@ void commandWithNoArguments() { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET"), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative))), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET foo ?"), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("RANDOMKEY") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RANDOMKEY"), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative)))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "RANDOMKEY"), + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY"), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)))); } } diff --git a/instrumentation/jedis/jedis-4.0/javaagent/build.gradle.kts b/instrumentation/jedis/jedis-4.0/javaagent/build.gradle.kts index d6127aa061e8..01afcaa36f52 100644 --- a/instrumentation/jedis/jedis-4.0/javaagent/build.gradle.kts +++ b/instrumentation/jedis/jedis-4.0/javaagent/build.gradle.kts @@ -25,9 +25,17 @@ dependencies { } tasks { - test { + withType().configureEach { // latest dep test fails because peer ip is 0:0:0:0:0:0:0:1 instead of 127.0.0.1 jvmArgs("-Djava.net.preferIPv4Stack=true") usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/jedis/jedis-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/Jedis40ClientTest.java b/instrumentation/jedis/jedis-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/Jedis40ClientTest.java index fb8db40a906b..9e965ee16b99 100644 --- a/instrumentation/jedis/jedis-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/Jedis40ClientTest.java +++ b/instrumentation/jedis/jedis-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/Jedis40ClientTest.java @@ -5,14 +5,19 @@ package io.opentelemetry.javaagent.instrumentation.jedis.v4_0; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.InetAddress; import java.net.UnknownHostException; import org.junit.jupiter.api.AfterAll; @@ -68,12 +73,12 @@ void setCommand() { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip)))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET foo ?"), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_PORT, port), + equalTo(NETWORK_PEER_ADDRESS, ip)))); } @Test @@ -90,24 +95,24 @@ void getCommand() { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip))), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET foo ?"), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_PORT, port), + equalTo(NETWORK_PEER_ADDRESS, ip))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET foo"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip)))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET foo"), + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_PORT, port), + equalTo(NETWORK_PEER_ADDRESS, ip)))); } @Test @@ -124,23 +129,23 @@ void commandWithNoArguments() { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip))), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET foo ?"), + equalTo(maybeStable(DB_OPERATION), "SET"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_PORT, port), + equalTo(NETWORK_PEER_ADDRESS, ip))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("RANDOMKEY") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RANDOMKEY"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip)))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "RANDOMKEY"), + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_PORT, port), + equalTo(NETWORK_PEER_ADDRESS, ip)))); } } diff --git a/instrumentation/jetty/jetty-11.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v11_0/JettyHandlerTest.java b/instrumentation/jetty/jetty-11.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v11_0/JettyHandlerTest.java index 55b85c2c5b94..3b7619c9bf01 100644 --- a/instrumentation/jetty/jetty-11.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v11_0/JettyHandlerTest.java +++ b/instrumentation/jetty/jetty-11.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v11_0/JettyHandlerTest.java @@ -15,6 +15,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.Sets; @@ -25,7 +26,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; -import io.opentelemetry.semconv.HttpAttributes; import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import jakarta.servlet.DispatcherType; import jakarta.servlet.ServletException; @@ -79,9 +79,7 @@ protected void stopServer(Server server) throws Exception { @Override protected void configure(HttpServerTestOptions options) { options.setHttpAttributes( - unused -> - Sets.difference( - DEFAULT_HTTP_ATTRIBUTES, Collections.singleton(HttpAttributes.HTTP_ROUTE))); + unused -> Sets.difference(DEFAULT_HTTP_ATTRIBUTES, Collections.singleton(HTTP_ROUTE))); options.setHasResponseSpan(endpoint -> endpoint == REDIRECT || endpoint == ERROR); options.setHasResponseCustomizer(endpoint -> true); } diff --git a/instrumentation/jetty/jetty-12.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12HandlerTest.java b/instrumentation/jetty/jetty-12.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12HandlerTest.java index 498bc624defd..b5bf258e0785 100644 --- a/instrumentation/jetty/jetty-12.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12HandlerTest.java +++ b/instrumentation/jetty/jetty-12.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12HandlerTest.java @@ -15,6 +15,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.Sets; @@ -25,7 +26,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; -import io.opentelemetry.semconv.HttpAttributes; import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -60,9 +60,7 @@ protected void stopServer(Server server) throws Exception { @Override protected void configure(HttpServerTestOptions options) { options.setHttpAttributes( - unused -> - Sets.difference( - DEFAULT_HTTP_ATTRIBUTES, Collections.singleton(HttpAttributes.HTTP_ROUTE))); + unused -> Sets.difference(DEFAULT_HTTP_ATTRIBUTES, Collections.singleton(HTTP_ROUTE))); options.setHasResponseCustomizer(endpoint -> endpoint != EXCEPTION); } diff --git a/instrumentation/jetty/jetty-8.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v8_0/JettyHandlerTest.java b/instrumentation/jetty/jetty-8.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v8_0/JettyHandlerTest.java index 49196c6dbf93..8619ca2b70b2 100644 --- a/instrumentation/jetty/jetty-8.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v8_0/JettyHandlerTest.java +++ b/instrumentation/jetty/jetty-8.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v8_0/JettyHandlerTest.java @@ -15,6 +15,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.Sets; @@ -25,7 +26,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; -import io.opentelemetry.semconv.HttpAttributes; import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import java.io.IOException; import java.io.Writer; @@ -79,9 +79,7 @@ protected void stopServer(Server server) throws Exception { @Override protected void configure(HttpServerTestOptions options) { options.setHttpAttributes( - unused -> - Sets.difference( - DEFAULT_HTTP_ATTRIBUTES, Collections.singleton(HttpAttributes.HTTP_ROUTE))); + unused -> Sets.difference(DEFAULT_HTTP_ATTRIBUTES, Collections.singleton(HTTP_ROUTE))); options.setHasResponseSpan(endpoint -> endpoint == REDIRECT || endpoint == ERROR); options.setHasResponseCustomizer(endpoint -> endpoint != EXCEPTION); } diff --git a/instrumentation/jms/jms-1.1/javaagent/src/jms2Test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms2InstrumentationTest.java b/instrumentation/jms/jms-1.1/javaagent/src/jms2Test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms2InstrumentationTest.java index 0b9813b49fdb..c38767ee02de 100644 --- a/instrumentation/jms/jms-1.1/javaagent/src/jms2Test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms2InstrumentationTest.java +++ b/instrumentation/jms/jms-1.1/javaagent/src/jms2Test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms2InstrumentationTest.java @@ -9,6 +9,11 @@ import static io.opentelemetry.api.trace.SpanKind.PRODUCER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_TEMPORARY; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.params.provider.Arguments.arguments; @@ -18,7 +23,6 @@ import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.io.File; import java.nio.file.Files; import java.util.Collections; @@ -168,12 +172,10 @@ void testMessageConsumer( .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary))); producerSpan.set(trace.getSpan(1)); @@ -187,12 +189,10 @@ void testMessageConsumer( .hasParent(trace.getSpan(0)) .hasLinks(LinkData.create(producerSpan.get().getSpanContext())) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary)))); } @@ -235,24 +235,20 @@ void testMessageListener( .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary)), span -> span.hasName(destinationName + " process") .hasKind(CONSUMER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary)), span -> span.hasName("consumer").hasParent(trace.getSpan(2)))); } @@ -279,9 +275,8 @@ void shouldNotEmitTelemetryOnEmptyReceive( private static AttributeAssertion messagingTempDestination(boolean isTemporary) { return isTemporary - ? equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_TEMPORARY, true) - : satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_TEMPORARY, AbstractAssert::isNull); + ? equalTo(MESSAGING_DESTINATION_TEMPORARY, true) + : satisfies(MESSAGING_DESTINATION_TEMPORARY, AbstractAssert::isNull); } static final class EmptyReceiveArgumentsProvider implements ArgumentsProvider { diff --git a/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/AbstractJms1Test.java b/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/AbstractJms1Test.java index 9e06b0854a1d..ee8455cc813a 100644 --- a/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/AbstractJms1Test.java +++ b/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/AbstractJms1Test.java @@ -10,6 +10,11 @@ import static io.opentelemetry.api.trace.SpanKind.PRODUCER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_TEMPORARY; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.params.provider.Arguments.arguments; @@ -18,7 +23,6 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.stream.Stream; @@ -128,24 +132,20 @@ void testMessageListener( .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary)), span -> span.hasName(destinationName + " process") .hasKind(CONSUMER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary)), span -> span.hasName("consumer").hasParent(trace.getSpan(2)))); } @@ -211,12 +211,10 @@ void shouldCaptureMessageHeaders( .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary), equalTo( stringArrayKey("messaging.header.test_message_header"), @@ -229,12 +227,10 @@ void shouldCaptureMessageHeaders( .hasKind(CONSUMER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary), equalTo( stringArrayKey("messaging.header.test_message_header"), @@ -285,12 +281,10 @@ void shouldFailWhenSendingReadOnlyMessage( .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary))), trace -> trace.hasSpansSatisfyingExactly( @@ -300,20 +294,17 @@ void shouldFailWhenSendingReadOnlyMessage( .hasNoParent() .hasTotalRecordedLinks(0) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary)))); } static AttributeAssertion messagingTempDestination(boolean isTemporary) { return isTemporary - ? equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_TEMPORARY, true) - : satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_TEMPORARY, AbstractAssert::isNull); + ? equalTo(MESSAGING_DESTINATION_TEMPORARY, true) + : satisfies(MESSAGING_DESTINATION_TEMPORARY, AbstractAssert::isNull); } static final class EmptyReceiveArgumentsProvider implements ArgumentsProvider { diff --git a/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1InstrumentationTest.java b/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1InstrumentationTest.java index 2de618b59df7..7e0d099839fd 100644 --- a/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1InstrumentationTest.java +++ b/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1InstrumentationTest.java @@ -8,11 +8,14 @@ import static io.opentelemetry.api.trace.SpanKind.CONSUMER; import static io.opentelemetry.api.trace.SpanKind.PRODUCER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.util.concurrent.atomic.AtomicReference; import javax.jms.Destination; import javax.jms.JMSException; @@ -61,12 +64,10 @@ void testMessageConsumer( .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary))); producerSpan.set(trace.getSpan(1)); @@ -80,12 +81,10 @@ void testMessageConsumer( .hasParent(trace.getSpan(0)) .hasLinks(LinkData.create(producerSpan.get().getSpanContext())) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary)))); } } diff --git a/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1SuppressReceiveSpansTest.java b/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1SuppressReceiveSpansTest.java index e5706f69e175..413795d42272 100644 --- a/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1SuppressReceiveSpansTest.java +++ b/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1SuppressReceiveSpansTest.java @@ -8,9 +8,12 @@ import static io.opentelemetry.api.trace.SpanKind.CONSUMER; import static io.opentelemetry.api.trace.SpanKind.PRODUCER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageConsumer; @@ -57,12 +60,10 @@ void testMessageConsumer( .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary)), span -> span.hasName(destinationName + " receive") @@ -70,12 +71,10 @@ void testMessageConsumer( .hasParent(trace.getSpan(1)) .hasTotalRecordedLinks(0) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary))), trace -> trace.hasSpansSatisfyingExactly(span -> span.hasName("consumer parent").hasNoParent())); diff --git a/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/AbstractJms3Test.java b/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/AbstractJms3Test.java index 8f2939f03606..57dbab31fb31 100644 --- a/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/AbstractJms3Test.java +++ b/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/AbstractJms3Test.java @@ -10,6 +10,11 @@ import static io.opentelemetry.api.trace.SpanKind.PRODUCER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_TEMPORARY; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.params.provider.Arguments.arguments; @@ -18,7 +23,6 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import jakarta.jms.Connection; import jakarta.jms.Destination; import jakarta.jms.JMSException; @@ -144,24 +148,20 @@ void testMessageListener(DestinationFactory destinationFactory, boolean isTempor .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - producerDestinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, producerDestinationName), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary)), span -> span.hasName(actualDestinationName + " process") .hasKind(CONSUMER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - actualDestinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId)), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, actualDestinationName), + equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_MESSAGE_ID, messageId)), span -> span.hasName("consumer").hasParent(trace.getSpan(2)))); } @@ -228,12 +228,10 @@ void shouldCaptureMessageHeaders(DestinationFactory destinationFactory, boolean .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - producerDestinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, producerDestinationName), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary), equalTo( stringArrayKey("messaging.header.test_message_header"), @@ -246,12 +244,10 @@ void shouldCaptureMessageHeaders(DestinationFactory destinationFactory, boolean .hasKind(CONSUMER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - actualDestinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, actualDestinationName), + equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_MESSAGE_ID, messageId), equalTo( stringArrayKey("messaging.header.test_message_header"), singletonList("test")), @@ -263,9 +259,8 @@ void shouldCaptureMessageHeaders(DestinationFactory destinationFactory, boolean static AttributeAssertion messagingTempDestination(boolean isTemporary) { return isTemporary - ? equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_TEMPORARY, true) - : satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_TEMPORARY, AbstractAssert::isNull); + ? equalTo(MESSAGING_DESTINATION_TEMPORARY, true) + : satisfies(MESSAGING_DESTINATION_TEMPORARY, AbstractAssert::isNull); } static final class EmptyReceiveArgumentsProvider implements ArgumentsProvider { diff --git a/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3InstrumentationTest.java b/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3InstrumentationTest.java index 28a074bf9db0..a0666663a893 100644 --- a/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3InstrumentationTest.java +++ b/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3InstrumentationTest.java @@ -8,11 +8,14 @@ import static io.opentelemetry.api.trace.SpanKind.CONSUMER; import static io.opentelemetry.api.trace.SpanKind.PRODUCER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import jakarta.jms.Destination; import jakarta.jms.JMSException; import jakarta.jms.MessageConsumer; @@ -64,12 +67,10 @@ void testMessageConsumer(DestinationFactory destinationFactory, boolean isTempor .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - producerDestinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, producerDestinationName), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary))); producerSpan.set(trace.getSpan(1)); @@ -83,12 +84,9 @@ void testMessageConsumer(DestinationFactory destinationFactory, boolean isTempor .hasParent(trace.getSpan(0)) .hasLinks(LinkData.create(producerSpan.get().getSpanContext())) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - actualDestinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId)))); + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, actualDestinationName), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_MESSAGE_ID, messageId)))); } } diff --git a/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3SuppressReceiveSpansTest.java b/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3SuppressReceiveSpansTest.java index 423616096a88..d0514410b7d6 100644 --- a/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3SuppressReceiveSpansTest.java +++ b/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3SuppressReceiveSpansTest.java @@ -8,9 +8,12 @@ import static io.opentelemetry.api.trace.SpanKind.CONSUMER; import static io.opentelemetry.api.trace.SpanKind.PRODUCER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import jakarta.jms.Destination; import jakarta.jms.JMSException; import jakarta.jms.MessageConsumer; @@ -60,12 +63,10 @@ void testMessageConsumer(DestinationFactory destinationFactory, boolean isTempor .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - producerDestinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, producerDestinationName), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_MESSAGE_ID, messageId), messagingTempDestination(isTemporary)), span -> span.hasName(actualDestinationName + " receive") @@ -73,13 +74,10 @@ void testMessageConsumer(DestinationFactory destinationFactory, boolean isTempor .hasParent(trace.getSpan(1)) .hasTotalRecordedLinks(0) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - actualDestinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, messageId))), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, actualDestinationName), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_MESSAGE_ID, messageId))), trace -> trace.hasSpansSatisfyingExactly(span -> span.hasName("consumer parent").hasNoParent())); } diff --git a/instrumentation/jsf/jsf-jakarta-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jsf/jakarta/BaseJsfTest.java b/instrumentation/jsf/jsf-jakarta-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jsf/jakarta/BaseJsfTest.java index d375a64b6e12..3ad100eaf21c 100644 --- a/instrumentation/jsf/jsf-jakarta-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jsf/jakarta/BaseJsfTest.java +++ b/instrumentation/jsf/jsf-jakarta-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jsf/jakarta/BaseJsfTest.java @@ -7,6 +7,18 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ClientAttributes.CLIENT_ADDRESS; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_PATH; +import static io.opentelemetry.semconv.UrlAttributes.URL_SCHEME; +import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; @@ -16,12 +28,6 @@ import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.testing.assertj.TraceAssert; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ClientAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.UserAgentAttributes; import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpRequest; import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse; import io.opentelemetry.testing.internal.armeria.common.HttpData; @@ -110,21 +116,19 @@ void testPath(String path, String route) { span.hasName(getContextPath() + "/hello.xhtml") .hasKind(SpanKind.SERVER) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class)), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_SCHEME, "http"), + equalTo(URL_PATH, getContextPath() + "/" + path), + equalTo(USER_AGENT_ORIGINAL, TEST_USER_AGENT), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(HTTP_ROUTE, getContextPath() + "/" + route), satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class)), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_SCHEME, "http"), - equalTo(UrlAttributes.URL_PATH, getContextPath() + "/" + path), - equalTo(UserAgentAttributes.USER_AGENT_ORIGINAL, TEST_USER_AGENT), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(HttpAttributes.HTTP_ROUTE, getContextPath() + "/" + route), - satisfies( - ClientAttributes.CLIENT_ADDRESS, + CLIENT_ADDRESS, val -> val.satisfiesAnyOf( v -> assertThat(v).isEqualTo(TEST_CLIENT_IP), diff --git a/instrumentation/jsf/jsf-javax-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jsf/javax/BaseJsfTest.java b/instrumentation/jsf/jsf-javax-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jsf/javax/BaseJsfTest.java index 01aaf48d159e..1657b4a6e9d5 100644 --- a/instrumentation/jsf/jsf-javax-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jsf/javax/BaseJsfTest.java +++ b/instrumentation/jsf/jsf-javax-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/jsf/javax/BaseJsfTest.java @@ -7,6 +7,18 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ClientAttributes.CLIENT_ADDRESS; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_PATH; +import static io.opentelemetry.semconv.UrlAttributes.URL_SCHEME; +import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL; import static java.util.Collections.addAll; import static org.assertj.core.api.Assertions.assertThat; @@ -17,12 +29,6 @@ import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.testing.assertj.TraceAssert; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ClientAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.UserAgentAttributes; import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpRequest; import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse; import io.opentelemetry.testing.internal.armeria.common.HttpData; @@ -119,21 +125,19 @@ void testPath(String path, String route) { span.hasName(getContextPath() + "/hello.xhtml") .hasKind(SpanKind.SERVER) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class)), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_SCHEME, "http"), + equalTo(URL_PATH, getContextPath() + "/" + path), + equalTo(USER_AGENT_ORIGINAL, TEST_USER_AGENT), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(HTTP_ROUTE, getContextPath() + "/" + route), satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class)), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_SCHEME, "http"), - equalTo(UrlAttributes.URL_PATH, getContextPath() + "/" + path), - equalTo(UserAgentAttributes.USER_AGENT_ORIGINAL, TEST_USER_AGENT), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(HttpAttributes.HTTP_ROUTE, getContextPath() + "/" + route), - satisfies( - ClientAttributes.CLIENT_ADDRESS, + CLIENT_ADDRESS, val -> val.satisfiesAnyOf( v -> assertThat(v).isEqualTo(TEST_CLIENT_IP), diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/metrics/KafkaMetricsConsumerInstrumentation.java b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/metrics/KafkaMetricsConsumerInstrumentation.java index c9775596465d..45c0d6078d4a 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/metrics/KafkaMetricsConsumerInstrumentation.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/metrics/KafkaMetricsConsumerInstrumentation.java @@ -42,10 +42,24 @@ public static class ConstructorMapAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(value = 0, readOnly = false) Map config) { - // ensure config is a mutable map - if (config.getClass() != HashMap.class) { - config = new HashMap<>(config); - } + + // In versions of spring-kafka prior to 2.5.0.RC1, when the `ProducerPerThread` + // of DefaultKafkaProducerFactory is set to true, the `config` object entering + // this advice block can be shared across multiple threads. Directly modifying + // `config` could lead to unexpected item loss due to race conditions, where + // some entries might be lost as different threads attempt to modify it + // concurrently. + // + // To prevent such issues, a copy of the `config` should be created here before + // any modifications are made. This ensures that each thread operates on its + // own independent copy of the configuration, thereby eliminating the risk of + // configurations corruption. + // + // More detailed information: + // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/12538 + + // ensure config is a mutable map and avoid concurrency conflicts + config = new HashMap<>(config); enhanceConfig(config); } } diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/metrics/KafkaMetricsProducerInstrumentation.java b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/metrics/KafkaMetricsProducerInstrumentation.java index 821bb8443a1d..3c199255522f 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/metrics/KafkaMetricsProducerInstrumentation.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaclients/v0_11/metrics/KafkaMetricsProducerInstrumentation.java @@ -42,10 +42,24 @@ public static class ConstructorMapAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter( @Advice.Argument(value = 0, readOnly = false) Map config) { - // ensure config is a mutable map - if (config.getClass() != HashMap.class) { - config = new HashMap<>(config); - } + + // In versions of spring-kafka prior to 2.5.0.RC1, when the `ProducerPerThread` + // of DefaultKafkaProducerFactory is set to true, the `config` object entering + // this advice block can be shared across multiple threads. Directly modifying + // `config` could lead to unexpected item loss due to race conditions, where + // some entries might be lost as different threads attempt to modify it + // concurrently. + // + // To prevent such issues, a copy of the `config` should be created here before + // any modifications are made. This ensures that each thread operates on its + // own independent copy of the configuration, thereby eliminating the risk of + // configurations corruption. + // + // More detailed information: + // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/12538 + + // ensure config is a mutable map and avoid concurrency conflicts + config = new HashMap<>(config); enhanceConfig(config); } } diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/testing/src/main/java/io/opentelemetry/instrumentation/kafka/internal/KafkaClientBaseTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/testing/src/main/java/io/opentelemetry/instrumentation/kafka/internal/KafkaClientBaseTest.java index 0698eb811521..decf68c18b7b 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/testing/src/main/java/io/opentelemetry/instrumentation/kafka/internal/KafkaClientBaseTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/testing/src/main/java/io/opentelemetry/instrumentation/kafka/internal/KafkaClientBaseTest.java @@ -7,10 +7,19 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_TOMBSTONE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.ArrayList; @@ -161,23 +170,17 @@ protected static List sendAttributes( List assertions = new ArrayList<>( Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "publish"), satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), - satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative))); + satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), + satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative))); if (messageKey != null) { - assertions.add( - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, messageKey)); + assertions.add(equalTo(MESSAGING_KAFKA_MESSAGE_KEY, messageKey)); } if (messageValue == null) { - assertions.add( - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_TOMBSTONE, true)); + assertions.add(equalTo(MESSAGING_KAFKA_MESSAGE_TOMBSTONE, true)); } if (testHeaders) { assertions.add( @@ -193,16 +196,14 @@ protected static List receiveAttributes(boolean testHeaders) List assertions = new ArrayList<>( Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "receive"), satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), - satisfies( - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, - AbstractLongAssert::isPositive))); + satisfies(MESSAGING_BATCH_MESSAGE_COUNT, AbstractLongAssert::isPositive))); // consumer group is not available in version 0.11 if (Boolean.getBoolean("testLatestDeps")) { - assertions.add(equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test")); + assertions.add(equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test")); } if (testHeaders) { assertions.add( @@ -219,35 +220,28 @@ protected static List processAttributes( List assertions = new ArrayList<>( Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "process"), satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), - satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), + satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), + satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), satisfies( AttributeKey.longKey("kafka.record.queue_time_ms"), AbstractLongAssert::isNotNegative))); // consumer group is not available in version 0.11 if (Boolean.getBoolean("testLatestDeps")) { - assertions.add(equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test")); + assertions.add(equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test")); } if (messageKey != null) { - assertions.add( - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, messageKey)); + assertions.add(equalTo(MESSAGING_KAFKA_MESSAGE_KEY, messageKey)); } if (messageValue == null) { - assertions.add( - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_TOMBSTONE, true)); + assertions.add(equalTo(MESSAGING_KAFKA_MESSAGE_TOMBSTONE, true)); } else { assertions.add( equalTo( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - messageValue.getBytes(StandardCharsets.UTF_8).length)); + MESSAGING_MESSAGE_BODY_SIZE, messageValue.getBytes(StandardCharsets.UTF_8).length)); } if (testHeaders) { assertions.add( diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsSuppressReceiveSpansTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsSuppressReceiveSpansTest.java index ad2df34dc8c9..7c80e7837a5e 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsSuppressReceiveSpansTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsSuppressReceiveSpansTest.java @@ -7,9 +7,15 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.nio.charset.StandardCharsets; import org.assertj.core.api.AbstractLongAssert; import org.assertj.core.api.AbstractStringAssert; @@ -28,11 +34,9 @@ void assertTraces() { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer"))), @@ -41,23 +45,18 @@ void assertTraces() { .hasKind(SpanKind.CONSUMER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "process"), equalTo( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, + MESSAGING_MESSAGE_BODY_SIZE, greeting.getBytes(StandardCharsets.UTF_8).length), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "test"), + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer"))), diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsTest.java index 83f87c8edc72..8f4f65dc2262 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsTest.java @@ -8,12 +8,19 @@ import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanName; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.sdk.trace.data.LinkData; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.nio.charset.StandardCharsets; import java.util.concurrent.atomic.AtomicReference; import org.assertj.core.api.AbstractLongAssert; @@ -35,11 +42,9 @@ void assertTraces() { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")))); @@ -59,42 +64,32 @@ void assertTraces() { .hasNoParent() .hasLinksSatisfying(links -> assertThat(links).isEmpty()) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "test"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), - equalTo( - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1)), + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1)), span -> span.hasName(SHARED_TOPIC + " process") .hasKind(SpanKind.CONSUMER) .hasParent(trace.getSpan(0)) .hasLinks(LinkData.create(producerSpanContext.get())) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "process"), equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, + MESSAGING_MESSAGE_BODY_SIZE, greeting.getBytes(StandardCharsets.UTF_8).length), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "test"), + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer"))), diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperSuppressReceiveSpansTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperSuppressReceiveSpansTest.java index 55b4b37e0234..ab588285c1b3 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperSuppressReceiveSpansTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperSuppressReceiveSpansTest.java @@ -7,11 +7,17 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; @@ -58,16 +64,12 @@ protected static List sendAttributes(boolean testHeaders) { List assertions = new ArrayList<>( Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "publish"), satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), - satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative))); + satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), + satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative))); if (testHeaders) { assertions.add( equalTo( @@ -82,22 +84,17 @@ private static List processAttributes(String greeting, boole List assertions = new ArrayList<>( Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "process"), equalTo( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - greeting.getBytes(StandardCharsets.UTF_8).length), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), - satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), + MESSAGING_MESSAGE_BODY_SIZE, greeting.getBytes(StandardCharsets.UTF_8).length), + satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), + satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), satisfies( AttributeKey.longKey("kafka.record.queue_time_ms"), AbstractLongAssert::isNotNegative), - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")))); if (testHeaders) { diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperTest.java index 5728847319e6..890b68733f2e 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperTest.java @@ -7,6 +7,14 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; @@ -14,7 +22,6 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.LinkData; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; @@ -80,16 +87,12 @@ protected static List sendAttributes(boolean testHeaders) { List assertions = new ArrayList<>( Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "publish"), satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), - satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative))); + satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), + satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative))); if (testHeaders) { assertions.add( equalTo( @@ -104,22 +107,17 @@ private static List processAttributes(String greeting, boole List assertions = new ArrayList<>( Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "process"), equalTo( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - greeting.getBytes(StandardCharsets.UTF_8).length), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), - satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), + MESSAGING_MESSAGE_BODY_SIZE, greeting.getBytes(StandardCharsets.UTF_8).length), + satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), + satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), satisfies( AttributeKey.longKey("kafka.record.queue_time_ms"), AbstractLongAssert::isNotNegative), - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")))); if (testHeaders) { @@ -136,12 +134,12 @@ protected static List receiveAttributes(boolean testHeaders) List assertions = new ArrayList<>( Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test"), satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), - equalTo(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1))); + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1))); if (testHeaders) { assertions.add( equalTo( diff --git a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsDefaultTest.java b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsDefaultTest.java index 46caa0a78c90..943f2448b8a8 100644 --- a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsDefaultTest.java +++ b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsDefaultTest.java @@ -9,6 +9,15 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; @@ -103,19 +112,16 @@ void testKafkaProduceAndConsumeWithStreamsInBetween() throws Exception { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues.KAFKA), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - STREAM_PENDING), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_DESTINATION_NAME, STREAM_PENDING), + equalTo(MESSAGING_OPERATION, "publish"), satisfies(MESSAGING_CLIENT_ID, k -> k.startsWith("producer")), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, k -> k.isInstanceOf(String.class)), - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"))); + equalTo(MESSAGING_KAFKA_MESSAGE_OFFSET, 0), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"))); producerPendingRef.set(trace.getSpan(0)); }, trace -> { @@ -126,21 +132,15 @@ void testKafkaProduceAndConsumeWithStreamsInBetween() throws Exception { new ArrayList<>( asList( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .KAFKA), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - STREAM_PENDING), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_DESTINATION_NAME, STREAM_PENDING), + equalTo(MESSAGING_OPERATION, "receive"), satisfies(MESSAGING_CLIENT_ID, k -> k.endsWith("consumer")), - equalTo( - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1))); + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1))); if (Boolean.getBoolean("testLatestDeps")) { - assertions.add( - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "test-application")); + assertions.add(equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test-application")); } span.hasName(STREAM_PENDING + " receive") .hasKind(SpanKind.CONSUMER) @@ -153,33 +153,24 @@ void testKafkaProduceAndConsumeWithStreamsInBetween() throws Exception { new ArrayList<>( asList( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .KAFKA), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - STREAM_PENDING), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_DESTINATION_NAME, STREAM_PENDING), + equalTo(MESSAGING_OPERATION, "process"), satisfies(MESSAGING_CLIENT_ID, k -> k.endsWith("consumer")), + satisfies(MESSAGING_MESSAGE_BODY_SIZE, k -> k.isInstanceOf(Long.class)), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - k -> k.isInstanceOf(Long.class)), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, k -> k.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), + equalTo(MESSAGING_KAFKA_MESSAGE_OFFSET, 0), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"), satisfies( longKey("kafka.record.queue_time_ms"), k -> k.isGreaterThanOrEqualTo(0)), equalTo(stringKey("asdf"), "testing"))); if (Boolean.getBoolean("testLatestDeps")) { - assertions.add( - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "test-application")); + assertions.add(equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test-application")); } span.hasName(STREAM_PENDING + " process") .hasKind(SpanKind.CONSUMER) @@ -196,18 +187,15 @@ void testKafkaProduceAndConsumeWithStreamsInBetween() throws Exception { .hasSpanId(receivedContext.getSpanId()) .hasAttributesSatisfyingExactly( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues.KAFKA), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - STREAM_PROCESSED), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_DESTINATION_NAME, STREAM_PROCESSED), + equalTo(MESSAGING_OPERATION, "publish"), satisfies(MESSAGING_CLIENT_ID, k -> k.endsWith("producer")), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, k -> k.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0))); + equalTo(MESSAGING_KAFKA_MESSAGE_OFFSET, 0))); producerProcessedRef.set(trace.getSpan(2)); }, @@ -219,20 +207,15 @@ void testKafkaProduceAndConsumeWithStreamsInBetween() throws Exception { new ArrayList<>( asList( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .KAFKA), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - STREAM_PROCESSED), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_DESTINATION_NAME, STREAM_PROCESSED), + equalTo(MESSAGING_OPERATION, "receive"), satisfies(MESSAGING_CLIENT_ID, k -> k.startsWith("consumer")), - equalTo( - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1))); + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1))); if (Boolean.getBoolean("testLatestDeps")) { - assertions.add( - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test")); + assertions.add(equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test")); } span.hasName(STREAM_PROCESSED + " receive") .hasKind(SpanKind.CONSUMER) @@ -245,32 +228,25 @@ void testKafkaProduceAndConsumeWithStreamsInBetween() throws Exception { new ArrayList<>( asList( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .KAFKA), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - STREAM_PROCESSED), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_DESTINATION_NAME, STREAM_PROCESSED), + equalTo(MESSAGING_OPERATION, "process"), satisfies(MESSAGING_CLIENT_ID, k -> k.startsWith("consumer")), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - k -> k.isInstanceOf(Long.class)), + MESSAGING_MESSAGE_BODY_SIZE, k -> k.isInstanceOf(Long.class)), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, k -> k.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), + equalTo(MESSAGING_KAFKA_MESSAGE_OFFSET, 0), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"), satisfies( longKey("kafka.record.queue_time_ms"), k -> k.isGreaterThanOrEqualTo(0)), equalTo(longKey("testing"), 123))); if (Boolean.getBoolean("testLatestDeps")) { - assertions.add( - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test")); + assertions.add(equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test")); } span.hasName(STREAM_PROCESSED + " process") .hasKind(SpanKind.CONSUMER) diff --git a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsSuppressReceiveSpansTest.java b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsSuppressReceiveSpansTest.java index ceb2b10c03c4..0afa69dbecff 100644 --- a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsSuppressReceiveSpansTest.java +++ b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsSuppressReceiveSpansTest.java @@ -9,6 +9,14 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; @@ -94,54 +102,42 @@ void testKafkaProduceAndConsumeWithStreamsInBetween() throws Exception { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .KAFKA), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - STREAM_PENDING), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_DESTINATION_NAME, STREAM_PENDING), + equalTo(MESSAGING_OPERATION, "publish"), equalTo(MESSAGING_CLIENT_ID, "producer-1"), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, k -> k.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10")), + equalTo(MESSAGING_KAFKA_MESSAGE_OFFSET, 0), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10")), // kafka-stream CONSUMER span -> { List assertions = new ArrayList<>( asList( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .KAFKA), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - STREAM_PENDING), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_DESTINATION_NAME, STREAM_PENDING), + equalTo(MESSAGING_OPERATION, "process"), satisfies(MESSAGING_CLIENT_ID, k -> k.endsWith("consumer")), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - k -> k.isInstanceOf(Long.class)), + MESSAGING_MESSAGE_BODY_SIZE, k -> k.isInstanceOf(Long.class)), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, k -> k.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), + equalTo(MESSAGING_KAFKA_MESSAGE_OFFSET, 0), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"), satisfies( longKey("kafka.record.queue_time_ms"), k -> k.isGreaterThanOrEqualTo(0)), equalTo(stringKey("asdf"), "testing"))); if (Boolean.getBoolean("testLatestDeps")) { - assertions.add( - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "test-application")); + assertions.add(equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test-application")); } span.hasName(STREAM_PENDING + " process") .hasKind(SpanKind.CONSUMER) @@ -158,17 +154,15 @@ void testKafkaProduceAndConsumeWithStreamsInBetween() throws Exception { .hasSpanId(receivedContext.getSpanId()) .hasAttributesSatisfyingExactly( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues.KAFKA), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - STREAM_PROCESSED), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_DESTINATION_NAME, STREAM_PROCESSED), + equalTo(MESSAGING_OPERATION, "publish"), satisfies(MESSAGING_CLIENT_ID, k -> k.isInstanceOf(String.class)), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, k -> k.isInstanceOf(String.class)), - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0)); + equalTo(MESSAGING_KAFKA_MESSAGE_OFFSET, 0)); }, // kafka-clients CONSUMER process span -> { @@ -176,32 +170,25 @@ void testKafkaProduceAndConsumeWithStreamsInBetween() throws Exception { new ArrayList<>( asList( equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .KAFKA), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - STREAM_PROCESSED), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_DESTINATION_NAME, STREAM_PROCESSED), + equalTo(MESSAGING_OPERATION, "process"), satisfies(MESSAGING_CLIENT_ID, k -> k.startsWith("consumer")), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - k -> k.isInstanceOf(Long.class)), + MESSAGING_MESSAGE_BODY_SIZE, k -> k.isInstanceOf(Long.class)), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, k -> k.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), + equalTo(MESSAGING_KAFKA_MESSAGE_OFFSET, 0), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"), satisfies( longKey("kafka.record.queue_time_ms"), k -> k.isGreaterThanOrEqualTo(0)), equalTo(longKey("testing"), 123))); if (Boolean.getBoolean("testLatestDeps")) { - assertions.add( - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test")); + assertions.add(equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test")); } span.hasName(STREAM_PROCESSED + " process") .hasKind(SpanKind.CONSUMER) diff --git a/instrumentation/ktor/ktor-1.0/library/README.md b/instrumentation/ktor/ktor-1.0/library/README.md index 9fa477f1d825..2701fd8c5125 100644 --- a/instrumentation/ktor/ktor-1.0/library/README.md +++ b/instrumentation/ktor/ktor-1.0/library/README.md @@ -1,4 +1,4 @@ -# Library Instrumentation for Ktor versions 1.x +# Library Instrumentation for Ktor version 1.x This package contains libraries to help instrument Ktor. Currently, only server instrumentation is supported. diff --git a/instrumentation/ktor/ktor-2-common/library/build.gradle.kts b/instrumentation/ktor/ktor-2-common/library/build.gradle.kts new file mode 100644 index 000000000000..03206ba46b59 --- /dev/null +++ b/instrumentation/ktor/ktor-2-common/library/build.gradle.kts @@ -0,0 +1,22 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion + +plugins { + id("otel.library-instrumentation") + id("org.jetbrains.kotlin.jvm") +} +dependencies { + implementation(project(":instrumentation:ktor:ktor-common:library")) + implementation("io.opentelemetry:opentelemetry-extension-kotlin") + compileOnly("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + compileOnly("io.ktor:ktor-client-core:2.0.0") + compileOnly("io.ktor:ktor-server-core:2.0.0") +} + +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_1_8) + @Suppress("deprecation") + languageVersion.set(KotlinVersion.KOTLIN_1_4) + } +} diff --git a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/client/AbstractKtorClientTracing.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/client/AbstractKtorClientTracing.kt new file mode 100644 index 000000000000..925cb6cf3156 --- /dev/null +++ b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/client/AbstractKtorClientTracing.kt @@ -0,0 +1,42 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.client + +import io.ktor.client.call.* +import io.ktor.client.request.* +import io.ktor.client.statement.* +import io.opentelemetry.context.Context +import io.opentelemetry.context.propagation.ContextPropagators +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter + +abstract class AbstractKtorClientTracing( + private val instrumenter: Instrumenter, + private val propagators: ContextPropagators, +) { + + internal fun createSpan(requestBuilder: HttpRequestBuilder): Context? { + val parentContext = Context.current() + val requestData = requestBuilder.build() + + return if (instrumenter.shouldStart(parentContext, requestData)) { + instrumenter.start(parentContext, requestData) + } else { + null + } + } + + internal fun populateRequestHeaders(requestBuilder: HttpRequestBuilder, context: Context) { + propagators.textMapPropagator.inject(context, requestBuilder, KtorHttpHeadersSetter) + } + + internal fun endSpan(context: Context, call: HttpClientCall, error: Throwable?) { + endSpan(context, HttpRequestBuilder().takeFrom(call.request), call.response, error) + } + + internal fun endSpan(context: Context, requestBuilder: HttpRequestBuilder, response: HttpResponse?, error: Throwable?) { + instrumenter.end(context, requestBuilder.build(), response, error) + } +} diff --git a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/client/AbstractKtorClientTracingBuilder.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/client/AbstractKtorClientTracingBuilder.kt new file mode 100644 index 000000000000..3b99bba1f6af --- /dev/null +++ b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/client/AbstractKtorClientTracingBuilder.kt @@ -0,0 +1,172 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.client + +import io.ktor.client.request.* +import io.ktor.client.statement.* +import io.ktor.http.* +import io.opentelemetry.api.OpenTelemetry +import io.opentelemetry.api.common.AttributesBuilder +import io.opentelemetry.context.Context +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor +import io.opentelemetry.instrumentation.ktor.internal.KtorBuilderUtil + +abstract class AbstractKtorClientTracingBuilder( + private val instrumentationName: String +) { + companion object { + init { + KtorBuilderUtil.clientBuilderExtractor = { it.clientBuilder } + } + } + + internal lateinit var openTelemetry: OpenTelemetry + protected lateinit var clientBuilder: DefaultHttpClientInstrumenterBuilder + + fun setOpenTelemetry(openTelemetry: OpenTelemetry) { + this.openTelemetry = openTelemetry + this.clientBuilder = DefaultHttpClientInstrumenterBuilder.create( + instrumentationName, + openTelemetry, + KtorHttpClientAttributesGetter + ) + } + + protected fun getOpenTelemetry(): OpenTelemetry { + return openTelemetry + } + + @Deprecated( + "Please use method `capturedRequestHeaders`", + ReplaceWith("capturedRequestHeaders(headers.asIterable())") + ) + fun setCapturedRequestHeaders(vararg headers: String) = capturedRequestHeaders(headers.asIterable()) + + @Deprecated( + "Please use method `capturedRequestHeaders`", + ReplaceWith("capturedRequestHeaders(headers)") + ) + fun setCapturedRequestHeaders(headers: List) = capturedRequestHeaders(headers) + + fun capturedRequestHeaders(vararg headers: String) = capturedRequestHeaders(headers.asIterable()) + + fun capturedRequestHeaders(headers: Iterable) { + clientBuilder.setCapturedRequestHeaders(headers.toList()) + } + + @Deprecated( + "Please use method `capturedResponseHeaders`", + ReplaceWith("capturedResponseHeaders(headers.asIterable())") + ) + fun setCapturedResponseHeaders(vararg headers: String) = capturedResponseHeaders(headers.asIterable()) + + @Deprecated( + "Please use method `capturedResponseHeaders`", + ReplaceWith("capturedResponseHeaders(headers)") + ) + fun setCapturedResponseHeaders(headers: List) = capturedResponseHeaders(headers) + + fun capturedResponseHeaders(vararg headers: String) = capturedResponseHeaders(headers.asIterable()) + + fun capturedResponseHeaders(headers: Iterable) { + clientBuilder.setCapturedResponseHeaders(headers.toList()) + } + + @Deprecated( + "Please use method `knownMethods`", + ReplaceWith("knownMethods(knownMethods)") + ) + fun setKnownMethods(knownMethods: Set) = knownMethods(knownMethods) + + fun knownMethods(vararg methods: String) = knownMethods(methods.asIterable()) + + fun knownMethods(vararg methods: HttpMethod) = knownMethods(methods.asIterable()) + + @JvmName("knownMethodsJvm") + fun knownMethods(methods: Iterable) = knownMethods(methods.map { it.value }) + + fun knownMethods(methods: Iterable) { + clientBuilder.setKnownMethods(methods.toSet()) + } + + @Deprecated("Please use method `attributeExtractor`") + fun addAttributesExtractors(vararg extractors: AttributesExtractor) = addAttributesExtractors(extractors.asList()) + + @Deprecated("Please use method `attributeExtractor`") + fun addAttributesExtractors(extractors: Iterable>) { + extractors.forEach { + attributeExtractor { + onStart { it.onStart(attributes, parentContext, request) } + onEnd { it.onEnd(attributes, parentContext, request, response, error) } + } + } + } + + fun attributeExtractor(extractorBuilder: ExtractorBuilder.() -> Unit = {}) { + val builder = ExtractorBuilder().apply(extractorBuilder).build() + this.clientBuilder.addAttributeExtractor( + object : AttributesExtractor { + override fun onStart(attributes: AttributesBuilder, parentContext: Context, request: HttpRequestData) { + builder.onStart(OnStartData(attributes, parentContext, request)) + } + + override fun onEnd(attributes: AttributesBuilder, context: Context, request: HttpRequestData, response: HttpResponse?, error: Throwable?) { + builder.onEnd(OnEndData(attributes, context, request, response, error)) + } + } + ) + } + + class ExtractorBuilder { + private var onStart: OnStartData.() -> Unit = {} + private var onEnd: OnEndData.() -> Unit = {} + + fun onStart(block: OnStartData.() -> Unit) { + onStart = block + } + + fun onEnd(block: OnEndData.() -> Unit) { + onEnd = block + } + + internal fun build(): Extractor { + return Extractor(onStart, onEnd) + } + } + + internal class Extractor(val onStart: OnStartData.() -> Unit, val onEnd: OnEndData.() -> Unit) + + data class OnStartData( + val attributes: AttributesBuilder, + val parentContext: Context, + val request: HttpRequestData + ) + + data class OnEndData( + val attributes: AttributesBuilder, + val parentContext: Context, + val request: HttpRequestData, + val response: HttpResponse?, + val error: Throwable? + ) + + /** + * Configures the instrumentation to emit experimental HTTP client metrics. + * + * @param emitExperimentalHttpClientMetrics `true` if the experimental HTTP client metrics are to be emitted. + */ + @Deprecated("Please use method `emitExperimentalHttpClientMetrics`") + fun setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics: Boolean) { + if (emitExperimentalHttpClientMetrics) { + emitExperimentalHttpClientMetrics() + } + } + + fun emitExperimentalHttpClientMetrics() { + clientBuilder.setEmitExperimentalHttpClientMetrics(true) + } +} diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorHttpClientAttributesGetter.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/client/KtorHttpClientAttributesGetter.kt similarity index 96% rename from instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorHttpClientAttributesGetter.kt rename to instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/client/KtorHttpClientAttributesGetter.kt index 62e61090b927..db1a9d1a0f0b 100644 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorHttpClientAttributesGetter.kt +++ b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/client/KtorHttpClientAttributesGetter.kt @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.ktor.v2_0.client +package io.opentelemetry.instrumentation.ktor.client import io.ktor.client.request.* import io.ktor.client.statement.* diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorHttpHeadersSetter.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/client/KtorHttpHeadersSetter.kt similarity index 87% rename from instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorHttpHeadersSetter.kt rename to instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/client/KtorHttpHeadersSetter.kt index a98567c0f440..d6be22087a26 100644 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorHttpHeadersSetter.kt +++ b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/client/KtorHttpHeadersSetter.kt @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.ktor.v2_0.client +package io.opentelemetry.instrumentation.ktor.client import io.ktor.client.request.HttpRequestBuilder import io.opentelemetry.context.propagation.TextMapSetter diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/internal/KtorBuilderUtil.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/internal/KtorBuilderUtil.kt similarity index 52% rename from instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/internal/KtorBuilderUtil.kt rename to instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/internal/KtorBuilderUtil.kt index 10bb56d5a720..ec074cca66bd 100644 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/internal/KtorBuilderUtil.kt +++ b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/internal/KtorBuilderUtil.kt @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.ktor.v2_0.internal +package io.opentelemetry.instrumentation.ktor.internal import io.ktor.client.request.* import io.ktor.client.statement.* @@ -11,14 +11,16 @@ import io.ktor.server.request.* import io.ktor.server.response.* import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder -import io.opentelemetry.instrumentation.ktor.v2_0.client.KtorClientTracingBuilder -import io.opentelemetry.instrumentation.ktor.v2_0.server.KtorServerTracing +import io.opentelemetry.instrumentation.ktor.client.AbstractKtorClientTracingBuilder +import io.opentelemetry.instrumentation.ktor.server.AbstractKtorServerTracingBuilder /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at * any time. */ object KtorBuilderUtil { - lateinit var clientBuilderExtractor: (KtorClientTracingBuilder) -> DefaultHttpClientInstrumenterBuilder - lateinit var serverBuilderExtractor: (KtorServerTracing.Configuration) -> DefaultHttpServerInstrumenterBuilder + lateinit var clientBuilderExtractor: (AbstractKtorClientTracingBuilder) -> DefaultHttpClientInstrumenterBuilder + lateinit var serverBuilderExtractor: ( + AbstractKtorServerTracingBuilder + ) -> DefaultHttpServerInstrumenterBuilder } diff --git a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/internal/KtorClientTracingUtil.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/internal/KtorClientTracingUtil.kt new file mode 100644 index 000000000000..b1735217a99a --- /dev/null +++ b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/internal/KtorClientTracingUtil.kt @@ -0,0 +1,88 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.internal + +import io.ktor.client.* +import io.ktor.client.request.* +import io.ktor.client.statement.* +import io.ktor.util.* +import io.ktor.util.pipeline.* +import io.opentelemetry.context.Context +import io.opentelemetry.extension.kotlin.asContextElement +import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount +import io.opentelemetry.instrumentation.ktor.client.AbstractKtorClientTracing +import kotlinx.coroutines.InternalCoroutinesApi +import kotlinx.coroutines.job +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +object KtorClientTracingUtil { + private val openTelemetryContextKey = AttributeKey("OpenTelemetry") + + fun install(plugin: AbstractKtorClientTracing, scope: HttpClient) { + installSpanCreation(plugin, scope) + installSpanEnd(plugin, scope) + } + + private fun installSpanCreation(plugin: AbstractKtorClientTracing, scope: HttpClient) { + val initializeRequestPhase = PipelinePhase("OpenTelemetryInitializeRequest") + scope.requestPipeline.insertPhaseAfter(HttpRequestPipeline.State, initializeRequestPhase) + + scope.requestPipeline.intercept(initializeRequestPhase) { + val openTelemetryContext = HttpClientRequestResendCount.initialize(Context.current()) + withContext(openTelemetryContext.asContextElement()) { proceed() } + } + + val createSpanPhase = PipelinePhase("OpenTelemetryCreateSpan") + scope.sendPipeline.insertPhaseAfter(HttpSendPipeline.State, createSpanPhase) + + scope.sendPipeline.intercept(createSpanPhase) { + val requestBuilder = context + val openTelemetryContext = plugin.createSpan(requestBuilder) + + if (openTelemetryContext != null) { + try { + requestBuilder.attributes.put(openTelemetryContextKey, openTelemetryContext) + plugin.populateRequestHeaders(requestBuilder, openTelemetryContext) + + withContext(openTelemetryContext.asContextElement()) { proceed() } + } catch (e: Throwable) { + plugin.endSpan(openTelemetryContext, requestBuilder, null, e) + throw e + } + } else { + proceed() + } + } + } + + @OptIn(InternalCoroutinesApi::class) + private fun installSpanEnd(plugin: AbstractKtorClientTracing, scope: HttpClient) { + val endSpanPhase = PipelinePhase("OpenTelemetryEndSpan") + scope.receivePipeline.insertPhaseBefore(HttpReceivePipeline.State, endSpanPhase) + + scope.receivePipeline.intercept(endSpanPhase) { + val openTelemetryContext = it.call.attributes.getOrNull(openTelemetryContextKey) + openTelemetryContext ?: return@intercept + + scope.launch { + val job = it.call.coroutineContext.job + job.join() + val cause = if (!job.isCancelled) { + null + } else { + kotlin.runCatching { job.getCancellationException() }.getOrNull() + } + + plugin.endSpan(openTelemetryContext, it.call, cause) + } + } + } +} diff --git a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/internal/KtorServerTracer.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/internal/KtorServerTracer.kt new file mode 100644 index 000000000000..2226f4169a94 --- /dev/null +++ b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/internal/KtorServerTracer.kt @@ -0,0 +1,29 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.internal + +import io.ktor.server.application.* +import io.ktor.server.request.* +import io.ktor.server.response.* +import io.opentelemetry.context.Context +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter + +class KtorServerTracer( + private val instrumenter: Instrumenter, +) { + fun start(call: ApplicationCall): Context? { + val parentContext = Context.current() + if (!instrumenter.shouldStart(parentContext, call.request)) { + return null + } + + return instrumenter.start(parentContext, call.request) + } + + fun end(context: Context, call: ApplicationCall, error: Throwable?) { + instrumenter.end(context, call.request, call.response, error) + } +} diff --git a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/internal/KtorServerTracingUtil.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/internal/KtorServerTracingUtil.kt new file mode 100644 index 000000000000..e5e3ea4fc908 --- /dev/null +++ b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/internal/KtorServerTracingUtil.kt @@ -0,0 +1,83 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.internal + +import io.ktor.server.application.* +import io.ktor.server.request.* +import io.ktor.server.response.* +import io.ktor.util.* +import io.ktor.util.pipeline.* +import io.opentelemetry.context.Context +import io.opentelemetry.extension.kotlin.asContextElement +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter +import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor +import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil +import io.opentelemetry.instrumentation.ktor.server.AbstractKtorServerTracingBuilder +import io.opentelemetry.instrumentation.ktor.server.ApplicationRequestGetter +import kotlinx.coroutines.withContext + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +object KtorServerTracingUtil { + + fun configureTracing(builder: AbstractKtorServerTracingBuilder, application: Application) { + val contextKey = AttributeKey("OpenTelemetry") + val errorKey = AttributeKey("OpenTelemetryException") + + val instrumenter = instrumenter(builder) + val tracer = KtorServerTracer(instrumenter) + val startPhase = PipelinePhase("OpenTelemetry") + + application.insertPhaseBefore(ApplicationCallPipeline.Monitoring, startPhase) + application.intercept(startPhase) { + val context = tracer.start(call) + + if (context != null) { + call.attributes.put(contextKey, context) + withContext(context.asContextElement()) { + try { + proceed() + } catch (err: Throwable) { + // Stash error for reporting later since need ktor to finish setting up the response + call.attributes.put(errorKey, err) + throw err + } + } + } else { + proceed() + } + } + + val postSendPhase = PipelinePhase("OpenTelemetryPostSend") + application.sendPipeline.insertPhaseAfter(ApplicationSendPipeline.After, postSendPhase) + application.sendPipeline.intercept(postSendPhase) { + val context = call.attributes.getOrNull(contextKey) + if (context != null) { + var error: Throwable? = call.attributes.getOrNull(errorKey) + try { + proceed() + } catch (t: Throwable) { + error = t + throw t + } finally { + tracer.end(context, call, error) + } + } else { + proceed() + } + } + } + + private fun instrumenter(builder: AbstractKtorServerTracingBuilder): Instrumenter { + return InstrumenterUtil.buildUpstreamInstrumenter( + builder.serverBuilder.instrumenterBuilder(), + ApplicationRequestGetter, + builder.spanKindExtractor(SpanKindExtractor.alwaysServer()) + ) + } +} diff --git a/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/server/AbstractKtorServerTracingBuilder.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/server/AbstractKtorServerTracingBuilder.kt new file mode 100644 index 000000000000..65abba99460c --- /dev/null +++ b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/server/AbstractKtorServerTracingBuilder.kt @@ -0,0 +1,196 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.server + +import io.ktor.http.* +import io.ktor.server.application.* +import io.ktor.server.request.* +import io.ktor.server.response.* +import io.opentelemetry.api.OpenTelemetry +import io.opentelemetry.api.common.AttributesBuilder +import io.opentelemetry.api.trace.SpanKind +import io.opentelemetry.context.Context +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor +import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor +import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusBuilder +import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor +import io.opentelemetry.instrumentation.ktor.internal.KtorBuilderUtil + +abstract class AbstractKtorServerTracingBuilder(private val instrumentationName: String) { + companion object { + init { + KtorBuilderUtil.serverBuilderExtractor = { it.serverBuilder } + } + } + + internal lateinit var serverBuilder: DefaultHttpServerInstrumenterBuilder + + internal var spanKindExtractor: + (SpanKindExtractor) -> SpanKindExtractor = { a -> a } + + fun setOpenTelemetry(openTelemetry: OpenTelemetry) { + this.serverBuilder = + DefaultHttpServerInstrumenterBuilder.create( + instrumentationName, + openTelemetry, + KtorHttpServerAttributesGetter.INSTANCE + ) + } + + @Deprecated("Please use method `spanStatusExtractor`") + fun setStatusExtractor( + extractor: (SpanStatusExtractor) -> SpanStatusExtractor + ) { + spanStatusExtractor { prevStatusExtractor -> + extractor(prevStatusExtractor).extract(spanStatusBuilder, request, response, error) + } + } + + fun spanStatusExtractor(extract: SpanStatusData.(SpanStatusExtractor) -> Unit) { + serverBuilder.setStatusExtractor { prevExtractor -> + SpanStatusExtractor { spanStatusBuilder: SpanStatusBuilder, + request: ApplicationRequest, + response: ApplicationResponse?, + throwable: Throwable? -> + extract( + SpanStatusData(spanStatusBuilder, request, response, throwable), + prevExtractor + ) + } + } + } + + data class SpanStatusData( + val spanStatusBuilder: SpanStatusBuilder, + val request: ApplicationRequest, + val response: ApplicationResponse?, + val error: Throwable? + ) + + @Deprecated("Please use method `spanKindExtractor`") + fun setSpanKindExtractor(extractor: (SpanKindExtractor) -> SpanKindExtractor) { + spanKindExtractor { prevSpanKindExtractor -> + extractor(prevSpanKindExtractor).extract(this) + } + } + + fun spanKindExtractor(extract: ApplicationRequest.(SpanKindExtractor) -> SpanKind) { + spanKindExtractor = { prevExtractor -> + SpanKindExtractor { request: ApplicationRequest -> + extract(request, prevExtractor) + } + } + } + + @Deprecated("Please use method `attributeExtractor`") + fun addAttributeExtractor(extractor: AttributesExtractor) { + attributeExtractor { + onStart { + extractor.onStart(attributes, parentContext, request) + } + onEnd { + extractor.onEnd(attributes, parentContext, request, response, error) + } + } + } + + fun attributeExtractor(extractorBuilder: ExtractorBuilder.() -> Unit = {}) { + val builder = ExtractorBuilder().apply(extractorBuilder).build() + serverBuilder.addAttributesExtractor( + object : AttributesExtractor { + override fun onStart(attributes: AttributesBuilder, parentContext: Context, request: ApplicationRequest) { + builder.onStart(OnStartData(attributes, parentContext, request)) + } + + override fun onEnd(attributes: AttributesBuilder, context: Context, request: ApplicationRequest, response: ApplicationResponse?, error: Throwable?) { + builder.onEnd(OnEndData(attributes, context, request, response, error)) + } + } + ) + } + + class ExtractorBuilder { + private var onStart: OnStartData.() -> Unit = {} + private var onEnd: OnEndData.() -> Unit = {} + + fun onStart(block: OnStartData.() -> Unit) { + onStart = block + } + + fun onEnd(block: OnEndData.() -> Unit) { + onEnd = block + } + + internal fun build(): Extractor { + return Extractor(onStart, onEnd) + } + } + + internal class Extractor(val onStart: OnStartData.() -> Unit, val onEnd: OnEndData.() -> Unit) + + data class OnStartData( + val attributes: AttributesBuilder, + val parentContext: Context, + val request: ApplicationRequest + ) + + data class OnEndData( + val attributes: AttributesBuilder, + val parentContext: Context, + val request: ApplicationRequest, + val response: ApplicationResponse?, + val error: Throwable? + ) + + @Deprecated( + "Please use method `capturedRequestHeaders`", + ReplaceWith("capturedRequestHeaders(headers)") + ) + fun setCapturedRequestHeaders(headers: List) = capturedRequestHeaders(headers) + + fun capturedRequestHeaders(vararg headers: String) = capturedRequestHeaders(headers.asIterable()) + + fun capturedRequestHeaders(headers: Iterable) { + serverBuilder.setCapturedRequestHeaders(headers.toList()) + } + + @Deprecated( + "Please use method `capturedResponseHeaders`", + ReplaceWith("capturedResponseHeaders(headers)") + ) + fun setCapturedResponseHeaders(headers: List) = capturedResponseHeaders(headers) + + fun capturedResponseHeaders(vararg headers: String) = capturedResponseHeaders(headers.asIterable()) + + fun capturedResponseHeaders(headers: Iterable) { + serverBuilder.setCapturedResponseHeaders(headers.toList()) + } + + @Deprecated( + "Please use method `knownMethods`", + ReplaceWith("knownMethods(knownMethods)") + ) + fun setKnownMethods(knownMethods: Set) = knownMethods(knownMethods) + + fun knownMethods(vararg methods: String) = knownMethods(methods.asIterable()) + + fun knownMethods(vararg methods: HttpMethod) = knownMethods(methods.asIterable()) + + @JvmName("knownMethodsJvm") + fun knownMethods(methods: Iterable) = knownMethods(methods.map { it.value }) + + fun knownMethods(methods: Iterable) { + methods.toSet().apply { + serverBuilder.setKnownMethods(this) + } + } + + /** + * {@link #setOpenTelemetry(OpenTelemetry)} sets the serverBuilder to a non-null value. + */ + fun isOpenTelemetryInitialized(): Boolean = this::serverBuilder.isInitialized +} diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/ApplicationRequestGetter.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/server/ApplicationRequestGetter.kt similarity index 89% rename from instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/ApplicationRequestGetter.kt rename to instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/server/ApplicationRequestGetter.kt index 267ea53dd7cf..053436977ef2 100644 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/ApplicationRequestGetter.kt +++ b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/server/ApplicationRequestGetter.kt @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.ktor.v2_0.server +package io.opentelemetry.instrumentation.ktor.server import io.ktor.server.request.* import io.opentelemetry.context.propagation.TextMapGetter diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorHttpServerAttributesGetter.kt b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/server/KtorHttpServerAttributesGetter.kt similarity index 96% rename from instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorHttpServerAttributesGetter.kt rename to instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/server/KtorHttpServerAttributesGetter.kt index 49bdedf85d6d..9471aa44f64b 100644 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorHttpServerAttributesGetter.kt +++ b/instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/server/KtorHttpServerAttributesGetter.kt @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.ktor.v2_0.server +package io.opentelemetry.instrumentation.ktor.server import io.ktor.server.plugins.* import io.ktor.server.request.* @@ -13,7 +13,7 @@ import io.opentelemetry.instrumentation.ktor.isIpAddress internal enum class KtorHttpServerAttributesGetter : HttpServerAttributesGetter { - INSTANCE, ; + INSTANCE; override fun getHttpRequestMethod(request: ApplicationRequest): String { return request.httpMethod.value diff --git a/instrumentation/ktor/ktor-2.0/javaagent/build.gradle.kts b/instrumentation/ktor/ktor-2.0/javaagent/build.gradle.kts index f201b43e6c69..2c0398e73b8f 100644 --- a/instrumentation/ktor/ktor-2.0/javaagent/build.gradle.kts +++ b/instrumentation/ktor/ktor-2.0/javaagent/build.gradle.kts @@ -7,10 +7,22 @@ plugins { muzzle { pass { - group.set("org.jetbrains.kotlinx") + group.set("io.ktor") + module.set("ktor-client-core") + versions.set("[2.0.0,3.0.0)") + assertInverse.set(true) + excludeInstrumentationName("ktor-server") + // missing dependencies + skip("1.1.0", "1.1.1", "1.1.5") + } + pass { + group.set("io.ktor") module.set("ktor-server-core") - versions.set("[2.0.0,)") + versions.set("[2.0.0,3.0.0)") assertInverse.set(true) + excludeInstrumentationName("ktor-client") + // missing dependencies + skip("1.1.0", "1.1.1") } } @@ -25,6 +37,7 @@ dependencies { compileOnly("org.jetbrains.kotlin:kotlin-stdlib-jdk8") testInstrumentation(project(":instrumentation:netty:netty-4.1:javaagent")) + testInstrumentation(project(":instrumentation:ktor:ktor-3.0:javaagent")) testImplementation(project(":instrumentation:ktor:ktor-2.0:testing")) testImplementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") diff --git a/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/HttpClientInstrumentation.java b/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/HttpClientInstrumentation.java index f1b54532f728..79fb525fdb7a 100644 --- a/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/HttpClientInstrumentation.java +++ b/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/HttpClientInstrumentation.java @@ -13,9 +13,9 @@ import io.ktor.client.HttpClientConfig; import io.ktor.client.engine.HttpClientEngineConfig; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.ktor.internal.KtorBuilderUtil; import io.opentelemetry.instrumentation.ktor.v2_0.client.KtorClientTracing; import io.opentelemetry.instrumentation.ktor.v2_0.client.KtorClientTracingBuilder; -import io.opentelemetry.instrumentation.ktor.v2_0.internal.KtorBuilderUtil; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; diff --git a/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/KtorClientInstrumentationModule.java b/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/KtorClientInstrumentationModule.java index 7893fc86f893..af4f2f5f14f2 100644 --- a/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/KtorClientInstrumentationModule.java +++ b/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/KtorClientInstrumentationModule.java @@ -5,12 +5,14 @@ package io.opentelemetry.javaagent.instrumentation.ktor.v2_0; +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 java.util.List; +import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) public class KtorClientInstrumentationModule extends InstrumentationModule { @@ -24,6 +26,12 @@ public boolean isHelperClass(String className) { return className.startsWith("io.opentelemetry.extension.kotlin."); } + @Override + public ElementMatcher.Junction classLoaderMatcher() { + // removed in ktor 3 + return hasClassesNamed("io.ktor.client.engine.HttpClientJvmEngine"); + } + @Override public List typeInstrumentations() { return singletonList(new HttpClientInstrumentation()); diff --git a/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/ServerInstrumentation.java b/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/ServerInstrumentation.java index 835e247f004b..214d94d80df0 100644 --- a/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/ServerInstrumentation.java +++ b/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/ServerInstrumentation.java @@ -11,8 +11,9 @@ import io.ktor.server.application.Application; import io.ktor.server.application.ApplicationPluginKt; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.ktor.v2_0.internal.KtorBuilderUtil; -import io.opentelemetry.instrumentation.ktor.v2_0.server.KtorServerTracing; +import io.opentelemetry.instrumentation.ktor.internal.KtorBuilderUtil; +import io.opentelemetry.instrumentation.ktor.server.AbstractKtorServerTracingBuilder; +import io.opentelemetry.instrumentation.ktor.v2_0.server.KtorServerTracingBuilderKt; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -39,19 +40,18 @@ public static class ConstructorAdvice { @Advice.OnMethodExit public static void onExit(@Advice.FieldValue("_applicationInstance") Application application) { - ApplicationPluginKt.install(application, KtorServerTracing.Feature, new SetupFunction()); + ApplicationPluginKt.install( + application, KtorServerTracingBuilderKt.getKtorServerTracing(), new SetupFunction()); } } public static class SetupFunction - implements Function1 { + implements Function1 { @Override - public Unit invoke(KtorServerTracing.Configuration configuration) { - configuration.setOpenTelemetry(GlobalOpenTelemetry.get()); - KtorBuilderUtil.serverBuilderExtractor - .invoke(configuration) - .configure(AgentCommonConfig.get()); + public Unit invoke(AbstractKtorServerTracingBuilder builder) { + builder.setOpenTelemetry(GlobalOpenTelemetry.get()); + KtorBuilderUtil.serverBuilderExtractor.invoke(builder).configure(AgentCommonConfig.get()); return kotlin.Unit.INSTANCE; } } diff --git a/instrumentation/ktor/ktor-2.0/library/README.md b/instrumentation/ktor/ktor-2.0/library/README.md index 46e0be300abe..f9af95e58a5b 100644 --- a/instrumentation/ktor/ktor-2.0/library/README.md +++ b/instrumentation/ktor/ktor-2.0/library/README.md @@ -1,4 +1,4 @@ -# Library Instrumentation for Ktor version 2.0 and higher +# Library Instrumentation for Ktor version 2.x This package contains libraries to help instrument Ktor. Server and client instrumentations are supported. diff --git a/instrumentation/ktor/ktor-2.0/library/build.gradle.kts b/instrumentation/ktor/ktor-2.0/library/build.gradle.kts index b7817a5866eb..45f9669717f4 100644 --- a/instrumentation/ktor/ktor-2.0/library/build.gradle.kts +++ b/instrumentation/ktor/ktor-2.0/library/build.gradle.kts @@ -13,7 +13,7 @@ dependencies { library("io.ktor:ktor-client-core:$ktorVersion") library("io.ktor:ktor-server-core:$ktorVersion") - implementation(project(":instrumentation:ktor:ktor-common:library")) + api(project(":instrumentation:ktor:ktor-2-common:library")) implementation("io.opentelemetry:opentelemetry-extension-kotlin") compileOnly("org.jetbrains.kotlin:kotlin-stdlib-jdk8") diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracing.kt b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracing.kt index 25ab52608eea..429e2ccdfe0c 100644 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracing.kt +++ b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracing.kt @@ -6,116 +6,28 @@ package io.opentelemetry.instrumentation.ktor.v2_0.client import io.ktor.client.* -import io.ktor.client.call.* import io.ktor.client.plugins.* import io.ktor.client.request.* import io.ktor.client.statement.* import io.ktor.util.* -import io.ktor.util.pipeline.* -import io.opentelemetry.context.Context import io.opentelemetry.context.propagation.ContextPropagators -import io.opentelemetry.extension.kotlin.asContextElement import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter -import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount -import kotlinx.coroutines.InternalCoroutinesApi -import kotlinx.coroutines.job -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext +import io.opentelemetry.instrumentation.ktor.client.AbstractKtorClientTracing +import io.opentelemetry.instrumentation.ktor.internal.KtorClientTracingUtil class KtorClientTracing internal constructor( - private val instrumenter: Instrumenter, - private val propagators: ContextPropagators, -) { - - private fun createSpan(requestBuilder: HttpRequestBuilder): Context? { - val parentContext = Context.current() - val requestData = requestBuilder.build() - - return if (instrumenter.shouldStart(parentContext, requestData)) { - instrumenter.start(parentContext, requestData) - } else { - null - } - } - - private fun populateRequestHeaders(requestBuilder: HttpRequestBuilder, context: Context) { - propagators.textMapPropagator.inject(context, requestBuilder, KtorHttpHeadersSetter) - } - - private fun endSpan(context: Context, call: HttpClientCall, error: Throwable?) { - endSpan(context, HttpRequestBuilder().takeFrom(call.request), call.response, error) - } - - private fun endSpan(context: Context, requestBuilder: HttpRequestBuilder, response: HttpResponse?, error: Throwable?) { - instrumenter.end(context, requestBuilder.build(), response, error) - } + instrumenter: Instrumenter, + propagators: ContextPropagators +) : AbstractKtorClientTracing(instrumenter, propagators) { companion object : HttpClientPlugin { - private val openTelemetryContextKey = AttributeKey("OpenTelemetry") - override val key = AttributeKey("OpenTelemetry") override fun prepare(block: KtorClientTracingBuilder.() -> Unit) = KtorClientTracingBuilder().apply(block).build() override fun install(plugin: KtorClientTracing, scope: HttpClient) { - installSpanCreation(plugin, scope) - installSpanEnd(plugin, scope) - } - - private fun installSpanCreation(plugin: KtorClientTracing, scope: HttpClient) { - val initializeRequestPhase = PipelinePhase("OpenTelemetryInitializeRequest") - scope.requestPipeline.insertPhaseAfter(HttpRequestPipeline.State, initializeRequestPhase) - - scope.requestPipeline.intercept(initializeRequestPhase) { - val openTelemetryContext = HttpClientRequestResendCount.initialize(Context.current()) - withContext(openTelemetryContext.asContextElement()) { proceed() } - } - - val createSpanPhase = PipelinePhase("OpenTelemetryCreateSpan") - scope.sendPipeline.insertPhaseAfter(HttpSendPipeline.State, createSpanPhase) - - scope.sendPipeline.intercept(createSpanPhase) { - val requestBuilder = context - val openTelemetryContext = plugin.createSpan(requestBuilder) - - if (openTelemetryContext != null) { - try { - requestBuilder.attributes.put(openTelemetryContextKey, openTelemetryContext) - plugin.populateRequestHeaders(requestBuilder, openTelemetryContext) - - withContext(openTelemetryContext.asContextElement()) { proceed() } - } catch (e: Throwable) { - plugin.endSpan(openTelemetryContext, requestBuilder, null, e) - throw e - } - } else { - proceed() - } - } - } - - @OptIn(InternalCoroutinesApi::class) - private fun installSpanEnd(plugin: KtorClientTracing, scope: HttpClient) { - val endSpanPhase = PipelinePhase("OpenTelemetryEndSpan") - scope.receivePipeline.insertPhaseBefore(HttpReceivePipeline.State, endSpanPhase) - - scope.receivePipeline.intercept(endSpanPhase) { - val openTelemetryContext = it.call.attributes.getOrNull(openTelemetryContextKey) - openTelemetryContext ?: return@intercept - - scope.launch { - val job = it.call.coroutineContext.job - job.join() - val cause = if (!job.isCancelled) { - null - } else { - kotlin.runCatching { job.getCancellationException() }.getOrNull() - } - - plugin.endSpan(openTelemetryContext, it.call, cause) - } - } + KtorClientTracingUtil.install(plugin, scope) } } } diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracingBuilder.kt b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracingBuilder.kt index f03128224b07..b93fb82f02da 100644 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracingBuilder.kt +++ b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracingBuilder.kt @@ -5,168 +5,13 @@ package io.opentelemetry.instrumentation.ktor.v2_0.client -import io.ktor.client.request.* -import io.ktor.client.statement.* -import io.ktor.http.* -import io.opentelemetry.api.OpenTelemetry -import io.opentelemetry.api.common.AttributesBuilder -import io.opentelemetry.context.Context -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor +import io.opentelemetry.instrumentation.ktor.client.AbstractKtorClientTracingBuilder import io.opentelemetry.instrumentation.ktor.v2_0.InstrumentationProperties.INSTRUMENTATION_NAME -import io.opentelemetry.instrumentation.ktor.v2_0.internal.KtorBuilderUtil -class KtorClientTracingBuilder { - companion object { - init { - KtorBuilderUtil.clientBuilderExtractor = { it.clientBuilder } - } - } - - private lateinit var openTelemetry: OpenTelemetry - private lateinit var clientBuilder: DefaultHttpClientInstrumenterBuilder - - fun setOpenTelemetry(openTelemetry: OpenTelemetry) { - this.openTelemetry = openTelemetry - this.clientBuilder = DefaultHttpClientInstrumenterBuilder.create( - INSTRUMENTATION_NAME, - openTelemetry, - KtorHttpClientAttributesGetter - ) - } - - @Deprecated( - "Please use method `capturedRequestHeaders`", - ReplaceWith("capturedRequestHeaders(headers.asIterable())") - ) - fun setCapturedRequestHeaders(vararg headers: String) = capturedRequestHeaders(headers.asIterable()) - - @Deprecated( - "Please use method `capturedRequestHeaders`", - ReplaceWith("capturedRequestHeaders(headers)") - ) - fun setCapturedRequestHeaders(headers: List) = capturedRequestHeaders(headers) - - fun capturedRequestHeaders(vararg headers: String) = capturedRequestHeaders(headers.asIterable()) - - fun capturedRequestHeaders(headers: Iterable) { - clientBuilder.setCapturedRequestHeaders(headers.toList()) - } - - @Deprecated( - "Please use method `capturedResponseHeaders`", - ReplaceWith("capturedResponseHeaders(headers.asIterable())") - ) - fun setCapturedResponseHeaders(vararg headers: String) = capturedResponseHeaders(headers.asIterable()) - - @Deprecated( - "Please use method `capturedResponseHeaders`", - ReplaceWith("capturedResponseHeaders(headers)") - ) - fun setCapturedResponseHeaders(headers: List) = capturedResponseHeaders(headers) - - fun capturedResponseHeaders(vararg headers: String) = capturedResponseHeaders(headers.asIterable()) - - fun capturedResponseHeaders(headers: Iterable) { - clientBuilder.setCapturedResponseHeaders(headers.toList()) - } - - @Deprecated( - "Please use method `knownMethods`", - ReplaceWith("knownMethods(knownMethods)") - ) - fun setKnownMethods(knownMethods: Set) = knownMethods(knownMethods) - - fun knownMethods(vararg methods: String) = knownMethods(methods.asIterable()) - - fun knownMethods(vararg methods: HttpMethod) = knownMethods(methods.asIterable()) - - @JvmName("knownMethodsJvm") - fun knownMethods(methods: Iterable) = knownMethods(methods.map { it.value }) - - fun knownMethods(methods: Iterable) { - clientBuilder.setKnownMethods(methods.toSet()) - } - - @Deprecated("Please use method `attributeExtractor`") - fun addAttributesExtractors(vararg extractors: AttributesExtractor) = addAttributesExtractors(extractors.asList()) - - @Deprecated("Please use method `attributeExtractor`") - fun addAttributesExtractors(extractors: Iterable>) { - extractors.forEach { - attributeExtractor { - onStart { it.onStart(attributes, parentContext, request) } - onEnd { it.onEnd(attributes, parentContext, request, response, error) } - } - } - } - - fun attributeExtractor(extractorBuilder: ExtractorBuilder.() -> Unit = {}) { - val builder = ExtractorBuilder().apply(extractorBuilder).build() - this.clientBuilder.addAttributeExtractor( - object : AttributesExtractor { - override fun onStart(attributes: AttributesBuilder, parentContext: Context, request: HttpRequestData) { - builder.onStart(OnStartData(attributes, parentContext, request)) - } - - override fun onEnd(attributes: AttributesBuilder, context: Context, request: HttpRequestData, response: HttpResponse?, error: Throwable?) { - builder.onEnd(OnEndData(attributes, context, request, response, error)) - } - } - ) - } - - class ExtractorBuilder { - private var onStart: OnStartData.() -> Unit = {} - private var onEnd: OnEndData.() -> Unit = {} - - fun onStart(block: OnStartData.() -> Unit) { - onStart = block - } - - fun onEnd(block: OnEndData.() -> Unit) { - onEnd = block - } - - internal fun build(): Extractor { - return Extractor(onStart, onEnd) - } - } - - internal class Extractor(val onStart: OnStartData.() -> Unit, val onEnd: OnEndData.() -> Unit) - - data class OnStartData( - val attributes: AttributesBuilder, - val parentContext: Context, - val request: HttpRequestData - ) - - data class OnEndData( - val attributes: AttributesBuilder, - val parentContext: Context, - val request: HttpRequestData, - val response: HttpResponse?, - val error: Throwable? - ) - - /** - * Configures the instrumentation to emit experimental HTTP client metrics. - * - * @param emitExperimentalHttpClientMetrics `true` if the experimental HTTP client metrics are to be emitted. - */ - @Deprecated("Please use method `emitExperimentalHttpClientMetrics`") - fun setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics: Boolean) { - if (emitExperimentalHttpClientMetrics) { - emitExperimentalHttpClientMetrics() - } - } - - fun emitExperimentalHttpClientMetrics() { - clientBuilder.setEmitExperimentalHttpClientMetrics(true) - } +class KtorClientTracingBuilder : AbstractKtorClientTracingBuilder(INSTRUMENTATION_NAME) { internal fun build(): KtorClientTracing = KtorClientTracing( instrumenter = clientBuilder.build(), - propagators = openTelemetry.propagators, + propagators = getOpenTelemetry().propagators, ) } diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracing.kt b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracing.kt deleted file mode 100644 index 66d0324a60e1..000000000000 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracing.kt +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.ktor.v2_0.server - -import io.ktor.http.* -import io.ktor.server.application.* -import io.ktor.server.request.* -import io.ktor.server.response.* -import io.ktor.server.routing.* -import io.ktor.util.* -import io.ktor.util.pipeline.* -import io.opentelemetry.api.OpenTelemetry -import io.opentelemetry.api.common.AttributesBuilder -import io.opentelemetry.api.trace.SpanKind -import io.opentelemetry.context.Context -import io.opentelemetry.extension.kotlin.asContextElement -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter -import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor -import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusBuilder -import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor -import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute -import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource -import io.opentelemetry.instrumentation.ktor.v2_0.InstrumentationProperties.INSTRUMENTATION_NAME -import io.opentelemetry.instrumentation.ktor.v2_0.internal.KtorBuilderUtil -import kotlinx.coroutines.withContext - -class KtorServerTracing private constructor( - private val instrumenter: Instrumenter, -) { - - class Configuration { - companion object { - init { - KtorBuilderUtil.serverBuilderExtractor = { it.serverBuilder } - } - } - - internal lateinit var serverBuilder: DefaultHttpServerInstrumenterBuilder - - internal var spanKindExtractor: - (SpanKindExtractor) -> SpanKindExtractor = { a -> a } - - fun setOpenTelemetry(openTelemetry: OpenTelemetry) { - this.serverBuilder = - DefaultHttpServerInstrumenterBuilder.create( - INSTRUMENTATION_NAME, - openTelemetry, - KtorHttpServerAttributesGetter.INSTANCE - ) - } - - @Deprecated("Please use method `spanStatusExtractor`") - fun setStatusExtractor( - extractor: (SpanStatusExtractor) -> SpanStatusExtractor - ) { - spanStatusExtractor { prevStatusExtractor -> - extractor(prevStatusExtractor).extract(spanStatusBuilder, request, response, error) - } - } - - fun spanStatusExtractor(extract: SpanStatusData.(SpanStatusExtractor) -> Unit) { - serverBuilder.setStatusExtractor { prevExtractor -> - SpanStatusExtractor { spanStatusBuilder: SpanStatusBuilder, - request: ApplicationRequest, - response: ApplicationResponse?, - throwable: Throwable? -> - extract( - SpanStatusData(spanStatusBuilder, request, response, throwable), - prevExtractor - ) - } - } - } - - data class SpanStatusData( - val spanStatusBuilder: SpanStatusBuilder, - val request: ApplicationRequest, - val response: ApplicationResponse?, - val error: Throwable? - ) - - @Deprecated("Please use method `spanKindExtractor`") - fun setSpanKindExtractor(extractor: (SpanKindExtractor) -> SpanKindExtractor) { - spanKindExtractor { prevSpanKindExtractor -> - extractor(prevSpanKindExtractor).extract(this) - } - } - - fun spanKindExtractor(extract: ApplicationRequest.(SpanKindExtractor) -> SpanKind) { - spanKindExtractor = { prevExtractor -> - SpanKindExtractor { request: ApplicationRequest -> - extract(request, prevExtractor) - } - } - } - - @Deprecated("Please use method `attributeExtractor`") - fun addAttributeExtractor(extractor: AttributesExtractor) { - attributeExtractor { - onStart { - extractor.onStart(attributes, parentContext, request) - } - onEnd { - extractor.onEnd(attributes, parentContext, request, response, error) - } - } - } - - fun attributeExtractor(extractorBuilder: ExtractorBuilder.() -> Unit = {}) { - val builder = ExtractorBuilder().apply(extractorBuilder).build() - serverBuilder.addAttributesExtractor( - object : AttributesExtractor { - override fun onStart(attributes: AttributesBuilder, parentContext: Context, request: ApplicationRequest) { - builder.onStart(OnStartData(attributes, parentContext, request)) - } - - override fun onEnd(attributes: AttributesBuilder, context: Context, request: ApplicationRequest, response: ApplicationResponse?, error: Throwable?) { - builder.onEnd(OnEndData(attributes, context, request, response, error)) - } - } - ) - } - - class ExtractorBuilder { - private var onStart: OnStartData.() -> Unit = {} - private var onEnd: OnEndData.() -> Unit = {} - - fun onStart(block: OnStartData.() -> Unit) { - onStart = block - } - - fun onEnd(block: OnEndData.() -> Unit) { - onEnd = block - } - - internal fun build(): Extractor { - return Extractor(onStart, onEnd) - } - } - - internal class Extractor(val onStart: OnStartData.() -> Unit, val onEnd: OnEndData.() -> Unit) - - data class OnStartData( - val attributes: AttributesBuilder, - val parentContext: Context, - val request: ApplicationRequest - ) - - data class OnEndData( - val attributes: AttributesBuilder, - val parentContext: Context, - val request: ApplicationRequest, - val response: ApplicationResponse?, - val error: Throwable? - ) - - @Deprecated( - "Please use method `capturedRequestHeaders`", - ReplaceWith("capturedRequestHeaders(headers)") - ) - fun setCapturedRequestHeaders(headers: List) = capturedRequestHeaders(headers) - - fun capturedRequestHeaders(vararg headers: String) = capturedRequestHeaders(headers.asIterable()) - - fun capturedRequestHeaders(headers: Iterable) { - serverBuilder.setCapturedRequestHeaders(headers.toList()) - } - - @Deprecated( - "Please use method `capturedResponseHeaders`", - ReplaceWith("capturedResponseHeaders(headers)") - ) - fun setCapturedResponseHeaders(headers: List) = capturedResponseHeaders(headers) - - fun capturedResponseHeaders(vararg headers: String) = capturedResponseHeaders(headers.asIterable()) - - fun capturedResponseHeaders(headers: Iterable) { - serverBuilder.setCapturedResponseHeaders(headers.toList()) - } - - @Deprecated( - "Please use method `knownMethods`", - ReplaceWith("knownMethods(knownMethods)") - ) - fun setKnownMethods(knownMethods: Set) = knownMethods(knownMethods) - - fun knownMethods(vararg methods: String) = knownMethods(methods.asIterable()) - - fun knownMethods(vararg methods: HttpMethod) = knownMethods(methods.asIterable()) - - @JvmName("knownMethodsJvm") - fun knownMethods(methods: Iterable) = knownMethods(methods.map { it.value }) - - fun knownMethods(methods: Iterable) { - methods.toSet().apply { - serverBuilder.setKnownMethods(this) - } - } - - /** - * {@link #setOpenTelemetry(OpenTelemetry)} sets the serverBuilder to a non-null value. - */ - internal fun isOpenTelemetryInitialized(): Boolean = this::serverBuilder.isInitialized - } - - private fun start(call: ApplicationCall): Context? { - val parentContext = Context.current() - if (!instrumenter.shouldStart(parentContext, call.request)) { - return null - } - - return instrumenter.start(parentContext, call.request) - } - - private fun end(context: Context, call: ApplicationCall, error: Throwable?) { - instrumenter.end(context, call.request, call.response, error) - } - - companion object Feature : BaseApplicationPlugin { - - private val contextKey = AttributeKey("OpenTelemetry") - private val errorKey = AttributeKey("OpenTelemetryException") - - override val key: AttributeKey = AttributeKey("OpenTelemetry") - - override fun install(pipeline: Application, configure: Configuration.() -> Unit): KtorServerTracing { - val configuration = Configuration().apply(configure) - - require(configuration.isOpenTelemetryInitialized()) { "OpenTelemetry must be set" } - - val instrumenter = InstrumenterUtil.buildUpstreamInstrumenter( - configuration.serverBuilder.instrumenterBuilder(), - ApplicationRequestGetter, - configuration.spanKindExtractor(SpanKindExtractor.alwaysServer()) - ) - - val feature = KtorServerTracing(instrumenter) - - val startPhase = PipelinePhase("OpenTelemetry") - pipeline.insertPhaseBefore(ApplicationCallPipeline.Monitoring, startPhase) - pipeline.intercept(startPhase) { - val context = feature.start(call) - - if (context != null) { - call.attributes.put(contextKey, context) - withContext(context.asContextElement()) { - try { - proceed() - } catch (err: Throwable) { - // Stash error for reporting later since need ktor to finish setting up the response - call.attributes.put(errorKey, err) - throw err - } - } - } else { - proceed() - } - } - - val postSendPhase = PipelinePhase("OpenTelemetryPostSend") - pipeline.sendPipeline.insertPhaseAfter(ApplicationSendPipeline.After, postSendPhase) - pipeline.sendPipeline.intercept(postSendPhase) { - val context = call.attributes.getOrNull(contextKey) - if (context != null) { - var error: Throwable? = call.attributes.getOrNull(errorKey) - try { - proceed() - } catch (t: Throwable) { - error = t - throw t - } finally { - feature.end(context, call, error) - } - } else { - proceed() - } - } - - pipeline.environment.monitor.subscribe(Routing.RoutingCallStarted) { call -> - HttpServerRoute.update(Context.current(), HttpServerRouteSource.SERVER, { _, arg -> arg.route.parent.toString() }, call) - } - - return feature - } - } -} diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracingBuilder.kt b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracingBuilder.kt new file mode 100644 index 000000000000..b2c4be9b86db --- /dev/null +++ b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracingBuilder.kt @@ -0,0 +1,29 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v2_0.server + +import io.ktor.server.application.* +import io.ktor.server.routing.* +import io.opentelemetry.context.Context +import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute +import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource +import io.opentelemetry.instrumentation.ktor.internal.KtorServerTracingUtil +import io.opentelemetry.instrumentation.ktor.server.AbstractKtorServerTracingBuilder +import io.opentelemetry.instrumentation.ktor.v2_0.InstrumentationProperties.INSTRUMENTATION_NAME + +class KtorServerTracingBuilder internal constructor( + instrumentationName: String +) : AbstractKtorServerTracingBuilder(instrumentationName) + +val KtorServerTracing = createRouteScopedPlugin("OpenTelemetry", { KtorServerTracingBuilder(INSTRUMENTATION_NAME) }) { + require(pluginConfig.isOpenTelemetryInitialized()) { "OpenTelemetry must be set" } + + KtorServerTracingUtil.configureTracing(pluginConfig, application) + + application.environment.monitor.subscribe(Routing.RoutingCallStarted) { call -> + HttpServerRoute.update(Context.current(), HttpServerRouteSource.SERVER, { _, arg -> arg.route.parent.toString() }, call) + } +} diff --git a/instrumentation/ktor/ktor-2.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/AbstractKtorHttpClientTest.kt b/instrumentation/ktor/ktor-2.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/AbstractKtorHttpClientTest.kt index 5d7619dcf3a7..991e32f347f6 100644 --- a/instrumentation/ktor/ktor-2.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/AbstractKtorHttpClientTest.kt +++ b/instrumentation/ktor/ktor-2.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/AbstractKtorHttpClientTest.kt @@ -18,6 +18,7 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES import io.opentelemetry.semconv.NetworkAttributes import kotlinx.coroutines.* +import org.junit.jupiter.api.AfterAll import java.net.URI abstract class AbstractKtorHttpClientTest : AbstractHttpClientTest() { @@ -27,6 +28,19 @@ abstract class AbstractKtorHttpClientTest : AbstractHttpClientTest.installTracing() @@ -67,7 +81,7 @@ abstract class AbstractKtorHttpClientTest : AbstractHttpClientTest - KtorHttpClientSingleConnection(host, port) { installTracing() } + KtorHttpClientSingleConnection(singleConnectionClient, host, port) } } } diff --git a/instrumentation/ktor/ktor-2.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorHttpClientSingleConnection.kt b/instrumentation/ktor/ktor-2.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorHttpClientSingleConnection.kt index 1a1f00a8fc58..2396d62bb6b1 100644 --- a/instrumentation/ktor/ktor-2.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorHttpClientSingleConnection.kt +++ b/instrumentation/ktor/ktor-2.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorHttpClientSingleConnection.kt @@ -12,23 +12,11 @@ import io.opentelemetry.instrumentation.testing.junit.http.SingleConnection import kotlinx.coroutines.runBlocking class KtorHttpClientSingleConnection( + private val client: HttpClient, private val host: String, - private val port: Int, - private val installTracing: HttpClientConfig<*>.() -> Unit, + private val port: Int ) : SingleConnection { - private val client: HttpClient - - init { - val engine = CIO.create { - maxConnectionsCount = 1 - } - - client = HttpClient(engine) { - installTracing() - } - } - override fun doRequest(path: String, requestHeaders: MutableMap) = runBlocking { val request = HttpRequestBuilder( scheme = "http", diff --git a/instrumentation/ktor/ktor-3.0/javaagent/build.gradle.kts b/instrumentation/ktor/ktor-3.0/javaagent/build.gradle.kts new file mode 100644 index 000000000000..7f2aa66d5dcc --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/javaagent/build.gradle.kts @@ -0,0 +1,56 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + id("org.jetbrains.kotlin.jvm") + id("otel.javaagent-instrumentation") +} + +muzzle { + pass { + group.set("io.ktor") + module.set("ktor-client-core") + versions.set("[3.0.0,)") + assertInverse.set(true) + excludeInstrumentationName("ktor-server") + // missing dependencies + skip("1.1.0", "1.1.1", "1.1.5") + } + pass { + group.set("io.ktor") + module.set("ktor-server-core") + versions.set("[3.0.0,)") + assertInverse.set(true) + excludeInstrumentationName("ktor-client") + // missing dependencies + skip("1.1.0", "1.1.1") + } +} + +val ktorVersion = "3.0.0" + +dependencies { + library("io.ktor:ktor-client-core:$ktorVersion") + library("io.ktor:ktor-server-core:$ktorVersion") + + implementation(project(":instrumentation:ktor:ktor-3.0:library")) + + compileOnly("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + + testInstrumentation(project(":instrumentation:netty:netty-4.1:javaagent")) + testInstrumentation(project(":instrumentation:ktor:ktor-2.0:javaagent")) + + testImplementation(project(":instrumentation:ktor:ktor-3.0:testing")) + testImplementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + testImplementation("io.opentelemetry:opentelemetry-extension-kotlin") + + testLibrary("io.ktor:ktor-server-netty:$ktorVersion") + testLibrary("io.ktor:ktor-client-cio:$ktorVersion") +} + +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_1_8) + // generate metadata for Java 1.8 reflection on method parameters, used in @WithSpan tests + javaParameters = true + } +} diff --git a/instrumentation/ktor/ktor-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v3_0/HttpClientInstrumentation.java b/instrumentation/ktor/ktor-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v3_0/HttpClientInstrumentation.java new file mode 100644 index 000000000000..09dfcca67e20 --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v3_0/HttpClientInstrumentation.java @@ -0,0 +1,62 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.ktor.v3_0; + +import static net.bytebuddy.matcher.ElementMatchers.isConstructor; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +import io.ktor.client.HttpClientConfig; +import io.ktor.client.engine.HttpClientEngineConfig; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.ktor.internal.KtorBuilderUtil; +import io.opentelemetry.instrumentation.ktor.v3_0.client.KtorClientTracing; +import io.opentelemetry.instrumentation.ktor.v3_0.client.KtorClientTracingBuilder; +import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import kotlin.Unit; +import kotlin.jvm.functions.Function1; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class HttpClientInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named("io.ktor.client.HttpClient"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isConstructor() + .and(takesArguments(2)) + .and(takesArgument(1, named("io.ktor.client.HttpClientConfig"))), + this.getClass().getName() + "$ConstructorAdvice"); + } + + @SuppressWarnings("unused") + public static class ConstructorAdvice { + + @Advice.OnMethodEnter + public static void onEnter( + @Advice.Argument(1) HttpClientConfig httpClientConfig) { + httpClientConfig.install(KtorClientTracing.Companion, new SetupFunction()); + } + } + + public static class SetupFunction implements Function1 { + + @Override + public Unit invoke(KtorClientTracingBuilder builder) { + builder.setOpenTelemetry(GlobalOpenTelemetry.get()); + KtorBuilderUtil.clientBuilderExtractor.invoke(builder).configure(AgentCommonConfig.get()); + return Unit.INSTANCE; + } + } +} diff --git a/instrumentation/ktor/ktor-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v3_0/KtorClientInstrumentationModule.java b/instrumentation/ktor/ktor-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v3_0/KtorClientInstrumentationModule.java new file mode 100644 index 000000000000..666a83d8e59d --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v3_0/KtorClientInstrumentationModule.java @@ -0,0 +1,39 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.ktor.v3_0; + +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 java.util.List; +import net.bytebuddy.matcher.ElementMatcher; + +@AutoService(InstrumentationModule.class) +public class KtorClientInstrumentationModule extends InstrumentationModule { + + public KtorClientInstrumentationModule() { + super("ktor", "ktor-client", "ktor-3.0", "ktor-client-3.0"); + } + + @Override + public boolean isHelperClass(String className) { + return className.startsWith("io.opentelemetry.extension.kotlin."); + } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + // added in ktor 3 + return hasClassesNamed("io.ktor.client.content.ProgressListener"); + } + + @Override + public List typeInstrumentations() { + return singletonList(new HttpClientInstrumentation()); + } +} diff --git a/instrumentation/ktor/ktor-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v3_0/KtorServerInstrumentationModule.java b/instrumentation/ktor/ktor-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v3_0/KtorServerInstrumentationModule.java new file mode 100644 index 000000000000..11152c53526d --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v3_0/KtorServerInstrumentationModule.java @@ -0,0 +1,31 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.ktor.v3_0; + +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 java.util.List; + +@AutoService(InstrumentationModule.class) +public class KtorServerInstrumentationModule extends InstrumentationModule { + + public KtorServerInstrumentationModule() { + super("ktor", "ktor-server", "ktor-3.0", "ktor-server-3.0"); + } + + @Override + public boolean isHelperClass(String className) { + return className.startsWith("io.opentelemetry.extension.kotlin."); + } + + @Override + public List typeInstrumentations() { + return singletonList(new ServerInstrumentation()); + } +} diff --git a/instrumentation/ktor/ktor-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v3_0/ServerInstrumentation.java b/instrumentation/ktor/ktor-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v3_0/ServerInstrumentation.java new file mode 100644 index 000000000000..df4335fa686d --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v3_0/ServerInstrumentation.java @@ -0,0 +1,57 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.ktor.v3_0; + +import static net.bytebuddy.matcher.ElementMatchers.isConstructor; +import static net.bytebuddy.matcher.ElementMatchers.named; + +import io.ktor.server.application.Application; +import io.ktor.server.application.ApplicationPluginKt; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.ktor.internal.KtorBuilderUtil; +import io.opentelemetry.instrumentation.ktor.server.AbstractKtorServerTracingBuilder; +import io.opentelemetry.instrumentation.ktor.v3_0.server.KtorServerTracingBuilderKt; +import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import kotlin.Unit; +import kotlin.jvm.functions.Function1; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class ServerInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named("io.ktor.server.engine.EmbeddedServer"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isConstructor(), this.getClass().getName() + "$ConstructorAdvice"); + } + + @SuppressWarnings("unused") + public static class ConstructorAdvice { + + @Advice.OnMethodExit + public static void onExit(@Advice.FieldValue("_applicationInstance") Application application) { + ApplicationPluginKt.install( + application, KtorServerTracingBuilderKt.getKtorServerTracing(), new SetupFunction()); + } + } + + public static class SetupFunction implements Function1 { + + @Override + public Unit invoke(AbstractKtorServerTracingBuilder builder) { + builder.setOpenTelemetry(GlobalOpenTelemetry.get()); + KtorBuilderUtil.serverBuilderExtractor.invoke(builder).configure(AgentCommonConfig.get()); + return Unit.INSTANCE; + } + } +} diff --git a/instrumentation/ktor/ktor-3.0/javaagent/src/test/java/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorHttpClientTest.kt b/instrumentation/ktor/ktor-3.0/javaagent/src/test/java/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorHttpClientTest.kt new file mode 100644 index 000000000000..b9e3623e01a9 --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/javaagent/src/test/java/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorHttpClientTest.kt @@ -0,0 +1,22 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v3_0.client + +import io.ktor.client.* +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension +import org.junit.jupiter.api.extension.RegisterExtension + +class KtorHttpClientTest : AbstractKtorHttpClientTest() { + + companion object { + @JvmStatic + @RegisterExtension + private val TESTING = HttpClientInstrumentationExtension.forAgent() + } + + override fun HttpClientConfig<*>.installTracing() { + } +} diff --git a/instrumentation/ktor/ktor-3.0/javaagent/src/test/java/io/opentelemetry/instrumentation/ktor/v3_0/server/KtorHttpServerTest.kt b/instrumentation/ktor/ktor-3.0/javaagent/src/test/java/io/opentelemetry/instrumentation/ktor/v3_0/server/KtorHttpServerTest.kt new file mode 100644 index 000000000000..138a6911144d --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/javaagent/src/test/java/io/opentelemetry/instrumentation/ktor/v3_0/server/KtorHttpServerTest.kt @@ -0,0 +1,33 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v3_0.server + +import io.ktor.server.application.* +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions +import org.junit.jupiter.api.extension.RegisterExtension + +class KtorHttpServerTest : AbstractKtorHttpServerTest() { + + companion object { + @JvmStatic + @RegisterExtension + val TESTING: InstrumentationExtension = HttpServerInstrumentationExtension.forAgent() + } + + override fun getTesting(): InstrumentationExtension { + return TESTING + } + + override fun installOpenTelemetry(application: Application) { + } + + override fun configure(options: HttpServerTestOptions) { + super.configure(options) + options.setTestException(false) + } +} diff --git a/instrumentation/ktor/ktor-3.0/library/README.md b/instrumentation/ktor/ktor-3.0/library/README.md new file mode 100644 index 000000000000..ce6fe411b3cd --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/library/README.md @@ -0,0 +1,60 @@ +# Library Instrumentation for Ktor version 3.0 and higher + +This package contains libraries to help instrument Ktor. Server and client instrumentations are supported. + +## Quickstart + +### Add these dependencies to your project + +Replace `OPENTELEMETRY_VERSION` with the [latest +release](https://search.maven.org/search?q=g:io.opentelemetry.instrumentation%20AND%20a:opentelemetry-ktor-3.0). + +For Maven, add to your `pom.xml` dependencies: + +```xml + + + io.opentelemetry.instrumentation + opentelemetry-ktor-3.0 + OPENTELEMETRY_VERSION + + +``` + +For Gradle, add to your dependencies: + +```groovy +implementation("io.opentelemetry.instrumentation:opentelemetry-ktor-3.0:OPENTELEMETRY_VERSION") +``` + +## Usage + +## Initializing server instrumentation + +Initialize instrumentation by installing the `KtorServerTracing` feature. You must set the `OpenTelemetry` to use with +the feature. + +```kotlin +val openTelemetry: OpenTelemetry = ... + +embeddedServer(Netty, 8080) { + install(KtorServerTracing) { + setOpenTelemetry(openTelemetry) + } +} +``` + +## Initializing client instrumentation + +Initialize instrumentation by installing the `KtorClientTracing` feature. You must set the `OpenTelemetry` to use with +the feature. + +```kotlin +val openTelemetry: OpenTelemetry = ... + +val client = HttpClient { + install(KtorClientTracing) { + setOpenTelemetry(openTelemetry) + } +} +``` diff --git a/instrumentation/ktor/ktor-3.0/library/build.gradle.kts b/instrumentation/ktor/ktor-3.0/library/build.gradle.kts new file mode 100644 index 000000000000..eb796b47455d --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/library/build.gradle.kts @@ -0,0 +1,34 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion + +plugins { + id("otel.library-instrumentation") + + id("org.jetbrains.kotlin.jvm") +} + +val ktorVersion = "3.0.0" + +dependencies { + library("io.ktor:ktor-client-core:$ktorVersion") + library("io.ktor:ktor-server-core:$ktorVersion") + + api(project(":instrumentation:ktor:ktor-2-common:library")) + implementation("io.opentelemetry:opentelemetry-extension-kotlin") + + compileOnly("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + + testImplementation(project(":instrumentation:ktor:ktor-3.0:testing")) + testImplementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + + testLibrary("io.ktor:ktor-server-netty:$ktorVersion") + testLibrary("io.ktor:ktor-client-cio:$ktorVersion") +} + +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_1_8) + @Suppress("deprecation") + languageVersion.set(KotlinVersion.KOTLIN_1_6) + } +} diff --git a/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/InstrumentationProperties.kt b/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/InstrumentationProperties.kt new file mode 100644 index 000000000000..722f27ca21e7 --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/InstrumentationProperties.kt @@ -0,0 +1,14 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v3_0 + +/** + * Common properties for both client and server instrumentations + */ +internal object InstrumentationProperties { + + internal const val INSTRUMENTATION_NAME = "io.opentelemetry.ktor-3.0" +} diff --git a/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorClientTracing.kt b/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorClientTracing.kt new file mode 100644 index 000000000000..d5bf578cc56c --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorClientTracing.kt @@ -0,0 +1,33 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v3_0.client + +import io.ktor.client.* +import io.ktor.client.plugins.* +import io.ktor.client.request.* +import io.ktor.client.statement.* +import io.ktor.util.* +import io.opentelemetry.context.propagation.ContextPropagators +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter +import io.opentelemetry.instrumentation.ktor.client.AbstractKtorClientTracing +import io.opentelemetry.instrumentation.ktor.internal.KtorClientTracingUtil + +class KtorClientTracing internal constructor( + instrumenter: Instrumenter, + propagators: ContextPropagators +) : AbstractKtorClientTracing(instrumenter, propagators) { + + companion object : HttpClientPlugin { + + override val key = AttributeKey("OpenTelemetry") + + override fun prepare(block: KtorClientTracingBuilder.() -> Unit) = KtorClientTracingBuilder().apply(block).build() + + override fun install(plugin: KtorClientTracing, scope: HttpClient) { + KtorClientTracingUtil.install(plugin, scope) + } + } +} diff --git a/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorClientTracingBuilder.kt b/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorClientTracingBuilder.kt new file mode 100644 index 000000000000..6f68939d9f06 --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorClientTracingBuilder.kt @@ -0,0 +1,17 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v3_0.client + +import io.opentelemetry.instrumentation.ktor.client.AbstractKtorClientTracingBuilder +import io.opentelemetry.instrumentation.ktor.v3_0.InstrumentationProperties.INSTRUMENTATION_NAME + +class KtorClientTracingBuilder : AbstractKtorClientTracingBuilder(INSTRUMENTATION_NAME) { + + internal fun build(): KtorClientTracing = KtorClientTracing( + instrumenter = clientBuilder.build(), + propagators = getOpenTelemetry().propagators, + ) +} diff --git a/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/server/KtorServerTracingBuilder.kt b/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/server/KtorServerTracingBuilder.kt new file mode 100644 index 000000000000..a086f7473fd8 --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/server/KtorServerTracingBuilder.kt @@ -0,0 +1,29 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v3_0.server + +import io.ktor.server.application.* +import io.ktor.server.routing.* +import io.opentelemetry.context.Context +import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute +import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource +import io.opentelemetry.instrumentation.ktor.internal.KtorServerTracingUtil +import io.opentelemetry.instrumentation.ktor.server.AbstractKtorServerTracingBuilder +import io.opentelemetry.instrumentation.ktor.v3_0.InstrumentationProperties.INSTRUMENTATION_NAME + +class KtorServerTracingBuilder internal constructor( + instrumentationName: String +) : AbstractKtorServerTracingBuilder(instrumentationName) + +val KtorServerTracing = createRouteScopedPlugin("OpenTelemetry", { KtorServerTracingBuilder(INSTRUMENTATION_NAME) }) { + require(pluginConfig.isOpenTelemetryInitialized()) { "OpenTelemetry must be set" } + + KtorServerTracingUtil.configureTracing(pluginConfig, application) + + application.monitor.subscribe(RoutingRoot.RoutingCallStarted) { call -> + HttpServerRoute.update(Context.current(), HttpServerRouteSource.SERVER, { _, arg -> arg.route.parent.toString() }, call) + } +} diff --git a/instrumentation/ktor/ktor-3.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorHttpClientTest.kt b/instrumentation/ktor/ktor-3.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorHttpClientTest.kt new file mode 100644 index 000000000000..0249949e8ebb --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorHttpClientTest.kt @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v3_0.client + +import io.ktor.client.* +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension +import org.junit.jupiter.api.extension.RegisterExtension + +class KtorHttpClientTest : AbstractKtorHttpClientTest() { + + companion object { + @JvmStatic + @RegisterExtension + private val TESTING = HttpClientInstrumentationExtension.forLibrary() + } + + override fun HttpClientConfig<*>.installTracing() { + install(KtorClientTracing) { + setOpenTelemetry(TESTING.openTelemetry) + capturedRequestHeaders(TEST_REQUEST_HEADER) + capturedResponseHeaders(TEST_RESPONSE_HEADER) + } + } +} diff --git a/instrumentation/ktor/ktor-3.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/server/KtorHttpServerTest.kt b/instrumentation/ktor/ktor-3.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/server/KtorHttpServerTest.kt new file mode 100644 index 000000000000..61caec27af83 --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/library/src/test/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/server/KtorHttpServerTest.kt @@ -0,0 +1,34 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v3_0.server + +import io.ktor.server.application.* +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension +import org.junit.jupiter.api.extension.RegisterExtension + +class KtorHttpServerTest : AbstractKtorHttpServerTest() { + + companion object { + @JvmStatic + @RegisterExtension + val TESTING: InstrumentationExtension = HttpServerInstrumentationExtension.forLibrary() + } + + override fun getTesting(): InstrumentationExtension { + return TESTING + } + + override fun installOpenTelemetry(application: Application) { + application.apply { + install(KtorServerTracing) { + setOpenTelemetry(TESTING.openTelemetry) + capturedRequestHeaders(TEST_REQUEST_HEADER) + capturedResponseHeaders(TEST_RESPONSE_HEADER) + } + } + } +} diff --git a/instrumentation/ktor/ktor-3.0/testing/build.gradle.kts b/instrumentation/ktor/ktor-3.0/testing/build.gradle.kts new file mode 100644 index 000000000000..d3fb3f3d0acc --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/testing/build.gradle.kts @@ -0,0 +1,28 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + id("otel.java-conventions") + + id("org.jetbrains.kotlin.jvm") +} + +val ktorVersion = "3.0.0" + +dependencies { + api(project(":testing-common")) + + implementation("io.ktor:ktor-client-core:$ktorVersion") + implementation("io.ktor:ktor-server-core:$ktorVersion") + + implementation("io.opentelemetry:opentelemetry-extension-kotlin") + + compileOnly("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + compileOnly("io.ktor:ktor-server-netty:$ktorVersion") + compileOnly("io.ktor:ktor-client-cio:$ktorVersion") +} + +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_1_8) + } +} diff --git a/instrumentation/ktor/ktor-3.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/AbstractKtorHttpClientTest.kt b/instrumentation/ktor/ktor-3.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/AbstractKtorHttpClientTest.kt new file mode 100644 index 000000000000..2e698e34e461 --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/AbstractKtorHttpClientTest.kt @@ -0,0 +1,88 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v3_0.client + +import io.ktor.client.* +import io.ktor.client.engine.cio.* +import io.ktor.client.plugins.* +import io.ktor.client.request.* +import io.ktor.http.* +import io.opentelemetry.context.Context +import io.opentelemetry.extension.kotlin.asContextElement +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES +import io.opentelemetry.semconv.NetworkAttributes +import kotlinx.coroutines.* +import org.junit.jupiter.api.AfterAll +import java.net.URI + +abstract class AbstractKtorHttpClientTest : AbstractHttpClientTest() { + + private val client = HttpClient(CIO) { + install(HttpRedirect) + + installTracing() + } + private val singleConnectionClient = HttpClient(CIO) { + engine { + maxConnectionsCount = 1 + } + + installTracing() + } + + @AfterAll + fun tearDown() { + client.close() + singleConnectionClient.close() + } + + abstract fun HttpClientConfig<*>.installTracing() + + override fun buildRequest(requestMethod: String, uri: URI, requestHeaders: MutableMap) = HttpRequestBuilder(uri.toURL()).apply { + method = HttpMethod.parse(requestMethod) + + requestHeaders.forEach { (header, value) -> headers.append(header, value) } + } + + override fun sendRequest(request: HttpRequestBuilder, method: String, uri: URI, headers: MutableMap) = runBlocking { + client.request(request).status.value + } + + override fun sendRequestWithCallback( + request: HttpRequestBuilder, + method: String, + uri: URI, + headers: MutableMap, + httpClientResult: HttpClientResult, + ) { + CoroutineScope(Dispatchers.Default + Context.current().asContextElement()).launch { + try { + val statusCode = client.request(request).status.value + httpClientResult.complete(statusCode) + } catch (e: Throwable) { + httpClientResult.complete(e) + } + } + } + + override fun configure(optionsBuilder: HttpClientTestOptions.Builder) { + with(optionsBuilder) { + disableTestReadTimeout() + markAsLowLevelInstrumentation() + setMaxRedirects(20) + spanEndsAfterBody() + + setHttpAttributes { DEFAULT_HTTP_ATTRIBUTES - setOf(NetworkAttributes.NETWORK_PROTOCOL_VERSION) } + + setSingleConnectionFactory { host, port -> + KtorHttpClientSingleConnection(singleConnectionClient, host, port) + } + } + } +} diff --git a/instrumentation/ktor/ktor-3.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorHttpClientSingleConnection.kt b/instrumentation/ktor/ktor-3.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorHttpClientSingleConnection.kt new file mode 100644 index 000000000000..30290d4f1e0f --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/client/KtorHttpClientSingleConnection.kt @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v3_0.client + +import io.ktor.client.* +import io.ktor.client.engine.cio.* +import io.ktor.client.request.* +import io.opentelemetry.instrumentation.testing.junit.http.SingleConnection +import kotlinx.coroutines.runBlocking + +class KtorHttpClientSingleConnection( + private val client: HttpClient, + private val host: String, + private val port: Int +) : SingleConnection { + + override fun doRequest(path: String, requestHeaders: MutableMap) = runBlocking { + val request = HttpRequestBuilder( + scheme = "http", + host = host, + port = port, + path = path, + ).apply { + requestHeaders.forEach { (name, value) -> headers.append(name, value) } + } + + client.request(request).status.value + } +} diff --git a/instrumentation/ktor/ktor-3.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/server/AbstractKtorHttpServerTest.kt b/instrumentation/ktor/ktor-3.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/server/AbstractKtorHttpServerTest.kt new file mode 100644 index 000000000000..24d4eba8c5e4 --- /dev/null +++ b/instrumentation/ktor/ktor-3.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v3_0/server/AbstractKtorHttpServerTest.kt @@ -0,0 +1,141 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.ktor.v3_0.server + +import io.ktor.http.* +import io.ktor.server.application.* +import io.ktor.server.engine.* +import io.ktor.server.netty.* +import io.ktor.server.request.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import io.opentelemetry.api.trace.Span +import io.opentelemetry.api.trace.SpanKind +import io.opentelemetry.api.trace.StatusCode +import io.opentelemetry.context.Context +import io.opentelemetry.extension.kotlin.asContextElement +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions +import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint +import io.opentelemetry.semconv.ServerAttributes +import kotlinx.coroutines.withContext +import java.util.concurrent.ExecutionException +import java.util.concurrent.TimeUnit + +abstract class AbstractKtorHttpServerTest : AbstractHttpServerTest>() { + + abstract fun getTesting(): InstrumentationExtension + + abstract fun installOpenTelemetry(application: Application) + + override fun setupServer(): EmbeddedServer<*, *> { + return embeddedServer(Netty, port = port) { + installOpenTelemetry(this) + + routing { + get(ServerEndpoint.SUCCESS.path) { + controller(ServerEndpoint.SUCCESS) { + call.respondText(ServerEndpoint.SUCCESS.body, status = HttpStatusCode.fromValue(ServerEndpoint.SUCCESS.status)) + } + } + + get(ServerEndpoint.REDIRECT.path) { + controller(ServerEndpoint.REDIRECT) { + call.respondRedirect(ServerEndpoint.REDIRECT.body) + } + } + + get(ServerEndpoint.ERROR.path) { + controller(ServerEndpoint.ERROR) { + call.respondText(ServerEndpoint.ERROR.body, status = HttpStatusCode.fromValue(ServerEndpoint.ERROR.status)) + } + } + + get(ServerEndpoint.EXCEPTION.path) { + controller(ServerEndpoint.EXCEPTION) { + throw IllegalStateException(ServerEndpoint.EXCEPTION.body) + } + } + + get("/query") { + controller(ServerEndpoint.QUERY_PARAM) { + call.respondText("some=${call.request.queryParameters["some"]}", status = HttpStatusCode.fromValue(ServerEndpoint.QUERY_PARAM.status)) + } + } + + get("/path/{id}/param") { + controller(ServerEndpoint.PATH_PARAM) { + call.respondText( + call.parameters["id"] + ?: "", + status = HttpStatusCode.fromValue(ServerEndpoint.PATH_PARAM.status), + ) + } + } + + get("/child") { + controller(ServerEndpoint.INDEXED_CHILD) { + ServerEndpoint.INDEXED_CHILD.collectSpanAttributes { call.request.queryParameters[it] } + call.respondText(ServerEndpoint.INDEXED_CHILD.body, status = HttpStatusCode.fromValue(ServerEndpoint.INDEXED_CHILD.status)) + } + } + + get("/captureHeaders") { + controller(ServerEndpoint.CAPTURE_HEADERS) { + call.response.header("X-Test-Response", call.request.header("X-Test-Request") ?: "") + call.respondText(ServerEndpoint.CAPTURE_HEADERS.body, status = HttpStatusCode.fromValue(ServerEndpoint.CAPTURE_HEADERS.status)) + } + } + } + }.start() + } + + override fun stopServer(server: EmbeddedServer<*, *>) { + server.stop(0, 10, TimeUnit.SECONDS) + } + + // Copy in HttpServerTest.controller but make it a suspending function + private suspend fun controller(endpoint: ServerEndpoint, wrapped: suspend () -> Unit) { + assert(Span.current().spanContext.isValid, { "Controller should have a parent span. " }) + if (endpoint == ServerEndpoint.NOT_FOUND) { + wrapped() + } + val span = getTesting().openTelemetry.getTracer("test").spanBuilder("controller").setSpanKind(SpanKind.INTERNAL).startSpan() + try { + withContext(Context.current().with(span).asContextElement()) { + wrapped() + } + span.end() + } catch (e: Exception) { + span.setStatus(StatusCode.ERROR) + span.recordException(if (e is ExecutionException) e.cause ?: e else e) + span.end() + throw e + } + } + + override fun configure(options: HttpServerTestOptions) { + options.setTestPathParam(true) + + options.setHttpAttributes { + HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES - ServerAttributes.SERVER_PORT + } + + options.setExpectedHttpRoute { endpoint, method -> + when (endpoint) { + ServerEndpoint.PATH_PARAM -> "/path/{id}/param" + else -> expectedHttpRoute(endpoint, method) + } + } + + // ktor does not have a controller lifecycle so the server span ends immediately when the + // response is sent, which is before the controller span finishes. + options.setVerifyServerSpanEndTime(false) + + options.setResponseCodeOnNonStandardHttpMethod(405) + } +} diff --git a/instrumentation/kubernetes-client-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/KubernetesClientTest.java b/instrumentation/kubernetes-client-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/KubernetesClientTest.java index 61c0919084fd..f8096f955a9f 100644 --- a/instrumentation/kubernetes-client-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/KubernetesClientTest.java +++ b/instrumentation/kubernetes-client-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/KubernetesClientTest.java @@ -7,6 +7,12 @@ import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanName; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static org.assertj.core.api.Assertions.assertThat; import io.kubernetes.client.openapi.ApiCallback; @@ -18,10 +24,6 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ErrorAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import io.opentelemetry.testing.internal.armeria.common.HttpResponse; import io.opentelemetry.testing.internal.armeria.common.HttpStatus; import io.opentelemetry.testing.internal.armeria.common.MediaType; @@ -80,13 +82,13 @@ void synchronousCall() throws ApiException { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - UrlAttributes.URL_FULL, + URL_FULL, mockWebServer.httpUri() + "/api/v1/namespaces/namespace/pods/name/proxy?path=path"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, mockWebServer.httpPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, mockWebServer.httpPort()), equalTo( AttributeKey.stringKey("kubernetes-client.namespace"), "namespace"), equalTo(AttributeKey.stringKey("kubernetes-client.name"), "name")))); @@ -127,14 +129,14 @@ void handleErrorsInSyncCall() { .hasException(apiException) .hasAttributesSatisfyingExactly( equalTo( - UrlAttributes.URL_FULL, + URL_FULL, mockWebServer.httpUri() + "/api/v1/namespaces/namespace/pods/name/proxy?path=path"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 451), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, mockWebServer.httpPort()), - equalTo(ErrorAttributes.ERROR_TYPE, "451"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 451), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, mockWebServer.httpPort()), + equalTo(ERROR_TYPE, "451"), equalTo( AttributeKey.stringKey("kubernetes-client.namespace"), "namespace"), equalTo(AttributeKey.stringKey("kubernetes-client.name"), "name")))); @@ -181,13 +183,13 @@ public void onSuccess( .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - UrlAttributes.URL_FULL, + URL_FULL, mockWebServer.httpUri() + "/api/v1/namespaces/namespace/pods/name/proxy?path=path"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, mockWebServer.httpPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, mockWebServer.httpPort()), equalTo( AttributeKey.stringKey("kubernetes-client.namespace"), "namespace"), equalTo(AttributeKey.stringKey("kubernetes-client.name"), "name")), @@ -242,14 +244,14 @@ public void onFailure( .hasException(exceptionReference.get()) .hasAttributesSatisfyingExactly( equalTo( - UrlAttributes.URL_FULL, + URL_FULL, mockWebServer.httpUri() + "/api/v1/namespaces/namespace/pods/name/proxy?path=path"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 451), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, mockWebServer.httpPort()), - equalTo(ErrorAttributes.ERROR_TYPE, "451"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 451), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, mockWebServer.httpPort()), + equalTo(ERROR_TYPE, "451"), equalTo( AttributeKey.stringKey("kubernetes-client.namespace"), "namespace"), equalTo(AttributeKey.stringKey("kubernetes-client.name"), "name")), diff --git a/instrumentation/kubernetes-client-7.0/javaagent/src/version20Test/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/KubernetesClientVer20Test.java b/instrumentation/kubernetes-client-7.0/javaagent/src/version20Test/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/KubernetesClientVer20Test.java index 00ef9fea1546..40aaad78c44b 100644 --- a/instrumentation/kubernetes-client-7.0/javaagent/src/version20Test/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/KubernetesClientVer20Test.java +++ b/instrumentation/kubernetes-client-7.0/javaagent/src/version20Test/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/KubernetesClientVer20Test.java @@ -7,6 +7,12 @@ import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanName; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static org.assertj.core.api.Assertions.assertThat; import io.kubernetes.client.openapi.ApiCallback; @@ -18,10 +24,6 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ErrorAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import io.opentelemetry.testing.internal.armeria.common.HttpResponse; import io.opentelemetry.testing.internal.armeria.common.HttpStatus; import io.opentelemetry.testing.internal.armeria.common.MediaType; @@ -84,13 +86,13 @@ void synchronousCall() throws ApiException { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - UrlAttributes.URL_FULL, + URL_FULL, mockWebServer.httpUri() + "/api/v1/namespaces/namespace/pods/name/proxy/path"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, mockWebServer.httpPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, mockWebServer.httpPort()), equalTo( AttributeKey.stringKey("kubernetes-client.namespace"), "namespace"), equalTo(AttributeKey.stringKey("kubernetes-client.name"), "name")))); @@ -131,14 +133,14 @@ void handleErrorsInSyncCall() { .hasException(apiException) .hasAttributesSatisfyingExactly( equalTo( - UrlAttributes.URL_FULL, + URL_FULL, mockWebServer.httpUri() + "/api/v1/namespaces/namespace/pods/name/proxy/path"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 451), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, mockWebServer.httpPort()), - equalTo(ErrorAttributes.ERROR_TYPE, "451"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 451), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, mockWebServer.httpPort()), + equalTo(ERROR_TYPE, "451"), equalTo( AttributeKey.stringKey("kubernetes-client.namespace"), "namespace"), equalTo(AttributeKey.stringKey("kubernetes-client.name"), "name")))); @@ -184,13 +186,13 @@ public void onSuccess( .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - UrlAttributes.URL_FULL, + URL_FULL, mockWebServer.httpUri() + "/api/v1/namespaces/namespace/pods/name/proxy/path"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, mockWebServer.httpPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, mockWebServer.httpPort()), equalTo( AttributeKey.stringKey("kubernetes-client.namespace"), "namespace"), equalTo(AttributeKey.stringKey("kubernetes-client.name"), "name")), @@ -244,14 +246,14 @@ public void onFailure( .hasException(exceptionReference.get()) .hasAttributesSatisfyingExactly( equalTo( - UrlAttributes.URL_FULL, + URL_FULL, mockWebServer.httpUri() + "/api/v1/namespaces/namespace/pods/name/proxy/path"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 451), - equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), - equalTo(ServerAttributes.SERVER_PORT, mockWebServer.httpPort()), - equalTo(ErrorAttributes.ERROR_TYPE, "451"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 451), + equalTo(SERVER_ADDRESS, "127.0.0.1"), + equalTo(SERVER_PORT, mockWebServer.httpPort()), + equalTo(ERROR_TYPE, "451"), equalTo( AttributeKey.stringKey("kubernetes-client.namespace"), "namespace"), equalTo(AttributeKey.stringKey("kubernetes-client.name"), "name")), diff --git a/instrumentation/lettuce/README.md b/instrumentation/lettuce/README.md index ed102ec06218..b7d75f4d3b81 100644 --- a/instrumentation/lettuce/README.md +++ b/instrumentation/lettuce/README.md @@ -3,4 +3,4 @@ | System property | Type | Default | Description | |-------------------------------------------------------------|---------|---------|-----------------------------------------------------| | `otel.instrumentation.lettuce.experimental-span-attributes` | Boolean | `false` | Enable the capture of experimental span attributes. | -| `otel.instrumentation.lettuce.connection-telemetry.enabled` | Boolean | `false` | Enable the creation of Connect spans. | +| `otel.instrumentation.lettuce.connection-telemetry.enabled` | Boolean | `false` | Enable the creation of Connect spans. | diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/build.gradle.kts b/instrumentation/lettuce/lettuce-4.0/javaagent/build.gradle.kts index e462a677642f..97a05becb7c4 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/build.gradle.kts +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/build.gradle.kts @@ -17,9 +17,19 @@ dependencies { latestDepTestLibrary("biz.paluch.redis:lettuce:4.+") // see lettuce-5.0 module } -tasks.withType().configureEach { - // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.lettuce.experimental-span-attributes=true") - jvmArgs("-Dotel.instrumentation.lettuce.connection-telemetry.enabled=true") - usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) +tasks { + withType().configureEach { + // TODO run tests both with and without experimental span attributes + jvmArgs("-Dotel.instrumentation.lettuce.experimental-span-attributes=true") + jvmArgs("-Dotel.instrumentation.lettuce.connection-telemetry.enabled=true") + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceConnectAttributesExtractor.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceConnectAttributesExtractor.java index a37014f8373a..89cde6c423a7 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceConnectAttributesExtractor.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceConnectAttributesExtractor.java @@ -26,7 +26,6 @@ public void onStart(AttributesBuilder attributes, Context parentContext, RedisUR if (SemconvStability.emitStableDatabaseSemconv()) { attributes.put(DbIncubatingAttributes.DB_NAMESPACE, String.valueOf(database)); } - if (SemconvStability.emitOldDatabaseSemconv()) { attributes.put(DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX, (long) database); } diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java index 36dfac306235..ca25afe04e56 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java @@ -6,7 +6,12 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v4_0; import static io.opentelemetry.api.common.AttributeKey.booleanKey; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchException; import static org.assertj.core.api.Assertions.catchThrowable; @@ -30,8 +35,6 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Map; import java.util.concurrent.CancellationException; import java.util.concurrent.CompletableFuture; @@ -143,9 +146,9 @@ void testConnectUsingGetOnConnectionFuture() { span.hasName("CONNECT") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis")))); + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis")))); } @Test @@ -171,9 +174,9 @@ void testExceptionInsideTheConnectionFuture() { .hasStatus(StatusData.error()) .hasException(exception) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, incorrectPort), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis")))); + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, incorrectPort), + equalTo(DB_SYSTEM, "redis")))); } @Test @@ -191,8 +194,8 @@ void testSetCommandUsingFutureGetWithTimeout() span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "SET")))); } @Test @@ -221,8 +224,7 @@ void testCommandChainedWithThenAccept() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")), + equalTo(DB_SYSTEM, "redis"), equalTo(maybeStable(DB_OPERATION), "GET")), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) @@ -283,8 +285,7 @@ void getNonExistentKeyCommandWithHandleAsyncAndChainedWithThenApply() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")), + equalTo(DB_SYSTEM, "redis"), equalTo(maybeStable(DB_OPERATION), "GET")), span -> span.hasName("callback1") .hasKind(SpanKind.INTERNAL) @@ -324,8 +325,8 @@ void testCommandWithNoArgumentsUsingBiconsumer() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RANDOMKEY")), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY")), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) @@ -368,16 +369,16 @@ void testHashSetAndThenNestApplyToHashGetall() { span.hasName("HMSET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "HMSET"))), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "HMSET"))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("HGETALL") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "HGETALL")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "HGETALL")))); } @Test @@ -418,8 +419,8 @@ void testCommandCompletesExceptionally() { .hasStatus(StatusData.error()) .hasException(new IllegalStateException("TestException")) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DEL")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "DEL")))); } @Test @@ -455,8 +456,8 @@ void testCommandBeforeItFinished() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SADD"), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "SADD"), equalTo(booleanKey("lettuce.command.cancelled"), true)), span -> span.hasName("callback") @@ -492,8 +493,8 @@ void testDebugSegfaultCommandWithNoArgumentShouldProduceSpan() { span.hasName("DEBUG") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DEBUG")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "DEBUG")))); } @Test @@ -526,7 +527,7 @@ void testShutdownCommandShouldProduceSpan() { span.hasName("SHUTDOWN") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SHUTDOWN")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "SHUTDOWN")))); } } diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java index 84a547851a05..e9d1dc16baf3 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java @@ -5,7 +5,12 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v4_0; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchException; @@ -20,8 +25,6 @@ import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Map; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -121,9 +124,9 @@ void testConnect() { span.hasName("CONNECT") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis")))); + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis")))); } @Test @@ -144,9 +147,9 @@ void testConnectException() { .hasKind(SpanKind.CLIENT) .hasException(exception) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, incorrectPort), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis")))); + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, incorrectPort), + equalTo(DB_SYSTEM, "redis")))); } @Test @@ -161,8 +164,8 @@ void testSetCommand() { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "SET")))); } @Test @@ -177,8 +180,8 @@ void testGetCommand() { span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "GET")))); } @Test @@ -193,8 +196,8 @@ void testGetNonExistentKeyCommand() { span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "GET")))); } @Test @@ -209,8 +212,8 @@ void testCommandWithNoArguments() { span.hasName("RANDOMKEY") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RANDOMKEY")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY")))); } @Test @@ -225,8 +228,8 @@ void testListCommand() { span.hasName("LPUSH") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "LPUSH")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "LPUSH")))); } @Test @@ -241,8 +244,8 @@ void testHashSetCommand() { span.hasName("HMSET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "HMSET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "HMSET")))); } @Test @@ -257,8 +260,8 @@ void testHashGetallCommand() { span.hasName("HGETALL") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "HGETALL")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "HGETALL")))); } @Test @@ -289,8 +292,8 @@ void testDebugSegfaultCommandWithNoArgumentShouldProduceSpan() { span.hasName("DEBUG") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DEBUG")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "DEBUG")))); } @Test @@ -323,7 +326,7 @@ void testShutdownCommandShouldProduceSpan() { span.hasName("SHUTDOWN") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SHUTDOWN")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "SHUTDOWN")))); } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/build.gradle.kts b/instrumentation/lettuce/lettuce-5.0/javaagent/build.gradle.kts index 0ebb0fa515ac..7e2dc0569d51 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/build.gradle.kts +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/build.gradle.kts @@ -22,9 +22,19 @@ dependencies { latestDepTestLibrary("io.lettuce:lettuce-core:5.0.+") // see lettuce-5.1 module } -tasks.withType().configureEach { - // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.lettuce.experimental-span-attributes=true") - jvmArgs("-Dotel.instrumentation.lettuce.connection-telemetry.enabled=true") - usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) +tasks { + withType().configureEach { + // TODO run tests both with and without experimental span attributes + jvmArgs("-Dotel.instrumentation.lettuce.experimental-span-attributes=true") + jvmArgs("-Dotel.instrumentation.lettuce.connection-telemetry.enabled=true") + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectAttributesExtractor.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectAttributesExtractor.java index 3a4f3995bf81..108604a23eec 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectAttributesExtractor.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectAttributesExtractor.java @@ -26,7 +26,6 @@ public void onStart(AttributesBuilder attributes, Context parentContext, RedisUR if (SemconvStability.emitStableDatabaseSemconv()) { attributes.put(DbIncubatingAttributes.DB_NAMESPACE, String.valueOf(database)); } - if (SemconvStability.emitOldDatabaseSemconv()) { attributes.put(DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX, (long) database); } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java index 7a6c8043ea4f..b03ceb0fa556 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java @@ -6,8 +6,14 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; import static io.opentelemetry.api.common.AttributeKey.booleanKey; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchException; import static org.assertj.core.api.Assertions.catchThrowable; @@ -28,8 +34,6 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.test.utils.PortUtils; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Map; @@ -115,9 +119,9 @@ void testConnectUsingGetOnConnectionFuture() throws ExecutionException, Interrup span.hasName("CONNECT") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis")))); + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis")))); } @SuppressWarnings("deprecation") // RedisURI constructor @@ -146,9 +150,9 @@ void testConnectExceptionInsideTheConnectionFuture() { .hasKind(SpanKind.CLIENT) .hasStatus(StatusData.error()) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, incorrectPort), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis")) + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, incorrectPort), + equalTo(DB_SYSTEM, "redis")) .hasEventsSatisfyingExactly( event -> event @@ -185,9 +189,9 @@ void testSetCommandUsingFutureGetWithTimeout() span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET TESTSETKEY ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET TESTSETKEY ?"), + equalTo(maybeStable(DB_OPERATION), "SET")))); } @Test @@ -217,9 +221,9 @@ void testGetCommandChainedWithThenAccept() .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET TESTKEY"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET TESTKEY"), + equalTo(maybeStable(DB_OPERATION), "GET")), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) @@ -274,9 +278,9 @@ void testGetNonExistentKeyCommandWithHandleAsyncAndChainedWithThenApply() .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET NON_EXISTENT_KEY"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET NON_EXISTENT_KEY"), + equalTo(maybeStable(DB_OPERATION), "GET")), span -> span.hasName("callback1") .hasKind(SpanKind.INTERNAL) @@ -317,9 +321,9 @@ void testCommandWithNoArgumentsUsingBiconsumer() .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RANDOMKEY")), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "RANDOMKEY"), + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY")), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) @@ -363,20 +367,20 @@ void testHashSetAndThenNestApplyToHashGetall() span.hasName("HMSET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DB_SYSTEM, "redis"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "HMSET TESTHM firstname ? lastname ? age ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "HMSET"))), + equalTo(maybeStable(DB_OPERATION), "HMSET"))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("HGETALL") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "HGETALL TESTHM"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "HGETALL")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "HGETALL TESTHM"), + equalTo(maybeStable(DB_OPERATION), "HGETALL")))); } @Test @@ -417,9 +421,9 @@ void testCommandCompletesExceptionally() { .hasStatus(StatusData.error()) .hasException(new IllegalStateException("TestException")) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "DEL key1 key2"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DEL")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "DEL key1 key2"), + equalTo(maybeStable(DB_OPERATION), "DEL")))); } @Test @@ -455,9 +459,9 @@ void testCancelCommandBeforeItFinishes() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SADD SKEY ? ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SADD"), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SADD SKEY ? ?"), + equalTo(maybeStable(DB_OPERATION), "SADD"), equalTo(booleanKey("lettuce.command.cancelled"), true)), span -> span.hasName("callback") @@ -480,9 +484,9 @@ void testDebugSegfaultCommandWithNoArgumentShouldProduceSpan() { span.hasName("DEBUG") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "DEBUG SEGFAULT"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DEBUG")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "DEBUG SEGFAULT"), + equalTo(maybeStable(DB_OPERATION), "DEBUG")))); } @Test @@ -500,8 +504,8 @@ void testShutdownCommandShouldProduceSpan() { span.hasName("SHUTDOWN") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SHUTDOWN NOSAVE"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SHUTDOWN")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SHUTDOWN NOSAVE"), + equalTo(maybeStable(DB_OPERATION), "SHUTDOWN")))); } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java index c6da9d791b77..416a963ca048 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java @@ -5,8 +5,12 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.lettuce.core.RedisClient; @@ -16,7 +20,6 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.concurrent.CompletableFuture; @@ -92,9 +95,9 @@ void testSetCommandWithSubscribeOnDefinedConsumer() .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET TESTSETKEY ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET")), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET TESTSETKEY ?"), + equalTo(maybeStable(DB_OPERATION), "SET")), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) @@ -123,9 +126,9 @@ void testGetCommandWithLambdaFunction() span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET TESTKEY"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET TESTKEY"), + equalTo(maybeStable(DB_OPERATION), "GET")))); } // to make sure instrumentation's chained completion stages won't interfere with user's, while @@ -162,9 +165,9 @@ void testGetNonExistentKeyCommand() span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET NON_EXISTENT_KEY"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET NON_EXISTENT_KEY"), + equalTo(maybeStable(DB_OPERATION), "GET")), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) @@ -192,9 +195,9 @@ void testCommandWithNoArguments() span.hasName("RANDOMKEY") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RANDOMKEY")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "RANDOMKEY"), + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY")))); } @Test @@ -208,9 +211,9 @@ void testCommandFluxPublisher() { span.hasName("COMMAND") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "COMMAND"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "COMMAND"), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "COMMAND"), + equalTo(maybeStable(DB_OPERATION), "COMMAND"), satisfies( AttributeKey.longKey("lettuce.command.results.count"), val -> val.isGreaterThan(100))))); @@ -227,9 +230,9 @@ void testCommandCancelAfter2OnFluxPublisher() { span.hasName("COMMAND") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "COMMAND"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "COMMAND"), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "COMMAND"), + equalTo(maybeStable(DB_OPERATION), "COMMAND"), satisfies( AttributeKey.booleanKey("lettuce.command.cancelled"), AbstractBooleanAssert::isTrue), @@ -261,9 +264,9 @@ void testDebugSegfaultCommandReturnsMonoVoidWithNoArgumentShouldProduceSpan() { span.hasName("DEBUG") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "DEBUG SEGFAULT"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DEBUG")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "DEBUG SEGFAULT"), + equalTo(maybeStable(DB_OPERATION), "DEBUG")))); } @Test @@ -281,9 +284,9 @@ void testShutdownCommandShouldProduceSpan() { span.hasName("SHUTDOWN") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SHUTDOWN NOSAVE"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SHUTDOWN")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SHUTDOWN NOSAVE"), + equalTo(maybeStable(DB_OPERATION), "SHUTDOWN")))); } @Test @@ -301,17 +304,17 @@ void testBlockingSubscriber() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET a ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET")), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET a ?"), + equalTo(maybeStable(DB_OPERATION), "SET")), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET a"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET a"), + equalTo(maybeStable(DB_OPERATION), "GET")))); } @Test @@ -329,17 +332,17 @@ void testAsyncSubscriber() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET a ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET")), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET a ?"), + equalTo(maybeStable(DB_OPERATION), "SET")), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET a"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET a"), + equalTo(maybeStable(DB_OPERATION), "GET")))); } @Test @@ -362,16 +365,16 @@ void testAsyncSubscriberWithSpecificThreadPool() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET a ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET")), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET a ?"), + equalTo(maybeStable(DB_OPERATION), "SET")), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET a"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET a"), + equalTo(maybeStable(DB_OPERATION), "GET")))); } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java index d3acc270d681..d84a4bc437a9 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java @@ -5,8 +5,14 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchException; @@ -19,8 +25,6 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.test.utils.PortUtils; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Map; @@ -90,9 +94,9 @@ void testConnect() { span.hasName("CONNECT") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis")))); + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis")))); } @Test @@ -112,9 +116,9 @@ void testConnectException() { .hasKind(SpanKind.CLIENT) .hasStatus(StatusData.error()) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, incorrectPort), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis")) + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, incorrectPort), + equalTo(DB_SYSTEM, "redis")) .hasEventsSatisfyingExactly( event -> event @@ -148,9 +152,9 @@ void testSetCommand() { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET TESTSETKEY ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET TESTSETKEY ?"), + equalTo(maybeStable(DB_OPERATION), "SET")))); } @Test @@ -165,9 +169,9 @@ void testGetCommand() { span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET TESTKEY"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET TESTKEY"), + equalTo(maybeStable(DB_OPERATION), "GET")))); } @Test @@ -182,9 +186,9 @@ void testGetNonExistentKeyCommand() { span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET NON_EXISTENT_KEY"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET NON_EXISTENT_KEY"), + equalTo(maybeStable(DB_OPERATION), "GET")))); } @Test @@ -199,9 +203,9 @@ void testCommandWithNoArguments() { span.hasName("RANDOMKEY") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RANDOMKEY")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "RANDOMKEY"), + equalTo(maybeStable(DB_OPERATION), "RANDOMKEY")))); } @Test @@ -216,9 +220,9 @@ void testListCommand() { span.hasName("LPUSH") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "LPUSH TESTLIST ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "LPUSH")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "LPUSH TESTLIST ?"), + equalTo(maybeStable(DB_OPERATION), "LPUSH")))); } @Test @@ -233,11 +237,11 @@ void testHashSetCommand() { span.hasName("HMSET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DB_SYSTEM, "redis"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "HMSET user firstname ? lastname ? age ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "HMSET")))); + equalTo(maybeStable(DB_OPERATION), "HMSET")))); } @Test @@ -252,9 +256,9 @@ void testHashGetallCommand() { span.hasName("HGETALL") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "HGETALL TESTHM"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "HGETALL")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "HGETALL TESTHM"), + equalTo(maybeStable(DB_OPERATION), "HGETALL")))); } @Test @@ -272,9 +276,9 @@ void testDebugSegfaultCommandWithNoArgumentShouldProduceSpan() { span.hasName("DEBUG") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "DEBUG SEGFAULT"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DEBUG")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "DEBUG SEGFAULT"), + equalTo(maybeStable(DB_OPERATION), "DEBUG")))); } @Test @@ -292,8 +296,8 @@ void testShutdownCommandShouldProduceSpan() { span.hasName("SHUTDOWN") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SHUTDOWN NOSAVE"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SHUTDOWN")))); + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SHUTDOWN NOSAVE"), + equalTo(maybeStable(DB_OPERATION), "SHUTDOWN")))); } } diff --git a/instrumentation/lettuce/lettuce-5.1/javaagent/build.gradle.kts b/instrumentation/lettuce/lettuce-5.1/javaagent/build.gradle.kts index d09af4df3a39..654a6172715d 100644 --- a/instrumentation/lettuce/lettuce-5.1/javaagent/build.gradle.kts +++ b/instrumentation/lettuce/lettuce-5.1/javaagent/build.gradle.kts @@ -24,8 +24,16 @@ dependencies { } tasks { - test { + withType().configureEach { systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceReactiveClientTest.java b/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceReactiveClientTest.java index f9abae4a35c6..4324b7cc1199 100644 --- a/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceReactiveClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceReactiveClientTest.java @@ -5,7 +5,15 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_1; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import io.lettuce.core.RedisClient; import io.opentelemetry.api.common.Attributes; @@ -13,9 +21,6 @@ import io.opentelemetry.instrumentation.lettuce.v5_1.AbstractLettuceReactiveClientTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -54,13 +59,13 @@ void testAsyncSubscriberWithSpecificThreadPool() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET a ?"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET a ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")), @@ -70,13 +75,13 @@ void testAsyncSubscriberWithSpecificThreadPool() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET a"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET a"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); diff --git a/instrumentation/lettuce/lettuce-5.1/library/build.gradle.kts b/instrumentation/lettuce/lettuce-5.1/library/build.gradle.kts index f4e825b1d015..1ea17a553d5d 100644 --- a/instrumentation/lettuce/lettuce-5.1/library/build.gradle.kts +++ b/instrumentation/lettuce/lettuce-5.1/library/build.gradle.kts @@ -13,8 +13,16 @@ dependencies { } tasks { - test { + withType().configureEach { systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/OpenTelemetryTracing.java b/instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/OpenTelemetryTracing.java index 6fb88f269b5e..3b2e06f3b64e 100644 --- a/instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/OpenTelemetryTracing.java +++ b/instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/OpenTelemetryTracing.java @@ -43,6 +43,8 @@ final class OpenTelemetryTracing implements Tracing { private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); private static final AttributeKey DB_STATEMENT = AttributeKey.stringKey("db.statement"); private static final AttributeKey DB_QUERY_TEXT = AttributeKey.stringKey("db.query.text"); + private static final AttributeKey DB_REDIS_DATABASE_INDEX = + AttributeKey.longKey("db.redis.database_index"); // copied from DbIncubatingAttributes.DbSystemIncubatingValues private static final String REDIS = "redis"; @@ -313,6 +315,16 @@ public synchronized Tracer.Span tag(String key, String value) { argsString = value; return this; } + if (key.equals("db.namespace") && SemconvStability.emitOldDatabaseSemconv()) { + // map backwards into db.redis.database.index + long val = Long.parseLong(value); + if (span != null) { + span.setAttribute(DB_REDIS_DATABASE_INDEX, val); + } else { + spanBuilder.setAttribute(DB_REDIS_DATABASE_INDEX, val); + } + return this; + } if (span != null) { span.setAttribute(key, value); } else { diff --git a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceAsyncClientTest.java b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceAsyncClientTest.java index a0189fbbfa67..9a65d02a37f3 100644 --- a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceAsyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceAsyncClientTest.java @@ -5,7 +5,15 @@ package io.opentelemetry.instrumentation.lettuce.v5_1; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; @@ -21,9 +29,6 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.test.utils.PortUtils; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; @@ -156,14 +161,13 @@ void testSetCommandUsingFutureGetWithTimeout() throws Exception { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, "SET TESTSETKEY ?"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET TESTSETKEY ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -203,14 +207,13 @@ void testGetCommandChainedWithThenAccept() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, "GET TESTKEY"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET TESTKEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -283,15 +286,14 @@ void testGetNonExistentKeyCommandWithHandleAsyncAndChainedWithThenApply() throws .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "GET NON_EXISTENT_KEY"))) + maybeStable(DB_STATEMENT), "GET NON_EXISTENT_KEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -351,14 +353,13 @@ void testCommandWithNoArgumentsUsingBiconsumer() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "RANDOMKEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -412,14 +413,14 @@ void testHashSetAndThenNestApplyToHashGetall() throws Exception { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "HMSET TESTHM firstname ? lastname ? age ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), @@ -431,13 +432,13 @@ void testHashSetAndThenNestApplyToHashGetall() throws Exception { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "HGETALL TESTHM"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "HGETALL TESTHM"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); diff --git a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceClientTest.java b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceClientTest.java index 90fe8a884450..56573539a278 100644 --- a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceClientTest.java @@ -6,13 +6,15 @@ package io.opentelemetry.instrumentation.lettuce.v5_1; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAMESPACE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX; import io.lettuce.core.RedisClient; import io.lettuce.core.api.StatefulRedisConnection; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -80,10 +82,15 @@ private ContainerConnection(StatefulRedisConnection connection, } } + @SuppressWarnings("deprecation") // using deprecated semconv protected static List addExtraAttributes(AttributeAssertion... assertions) { List result = new ArrayList<>(Arrays.asList(assertions)); if (Boolean.getBoolean("testLatestDeps")) { - result.add(equalTo(DbIncubatingAttributes.DB_NAMESPACE, "0")); + if (SemconvStability.emitStableDatabaseSemconv()) { + result.add(equalTo(DB_NAMESPACE, "0")); + } else { + result.add(equalTo(DB_REDIS_DATABASE_INDEX, 0)); + } } return result; } diff --git a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceReactiveClientTest.java b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceReactiveClientTest.java index c0f0a4ee18a2..93b20a87be7b 100644 --- a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceReactiveClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceReactiveClientTest.java @@ -5,16 +5,21 @@ package io.opentelemetry.instrumentation.lettuce.v5_1; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.lettuce.core.api.reactive.RedisReactiveCommands; import io.lettuce.core.api.sync.RedisCommands; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Objects; @@ -94,14 +99,13 @@ void testSetCommandWithSubscribeOnDefinedConsumer() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, "SET TESTSETKEY ?"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET TESTSETKEY ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")), @@ -134,13 +138,13 @@ void testGetCommandWithLambdaFunction() throws Exception { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET TESTKEY"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET TESTKEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -184,15 +188,13 @@ void testGetNonExistentKeyCommand() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "GET NON_EXISTENT_KEY"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET NON_EXISTENT_KEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")), @@ -224,13 +226,13 @@ void testCommandWithNoArguments() throws Exception { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "RANDOMKEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -249,13 +251,13 @@ void testCommandFluxPublisher() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "COMMAND"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "COMMAND"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -295,13 +297,13 @@ void testBlockingSubscriber() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET a ?"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET a ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")), @@ -311,13 +313,13 @@ void testBlockingSubscriber() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET a"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET a"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -341,13 +343,13 @@ void testAsyncSubscriber() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET a ?"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET a ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")), @@ -357,13 +359,13 @@ void testAsyncSubscriber() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET a"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET a"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); diff --git a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientAuthTest.java b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientAuthTest.java index c6aa56acc372..76a467798000 100644 --- a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientAuthTest.java +++ b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientAuthTest.java @@ -5,15 +5,20 @@ package io.opentelemetry.instrumentation.lettuce.v5_1; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.lettuce.core.api.sync.RedisCommands; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.InetAddress; import java.net.UnknownHostException; import org.junit.jupiter.api.AfterAll; @@ -71,14 +76,14 @@ void testAuthCommand() throws Exception { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "CLIENT SETINFO lib-name Lettuce")))), trace -> trace.hasSpansSatisfyingExactly( @@ -87,14 +92,14 @@ void testAuthCommand() throws Exception { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), stringAssert -> stringAssert.startsWith("CLIENT SETINFO lib-ver"))))), trace -> @@ -104,13 +109,13 @@ void testAuthCommand() throws Exception { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "AUTH ?"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "AUTH ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -125,13 +130,13 @@ void testAuthCommand() throws Exception { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "AUTH ?"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "AUTH ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); diff --git a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientTest.java index be7806e9a87c..f09ec6b687c2 100644 --- a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientTest.java @@ -5,8 +5,16 @@ package io.opentelemetry.instrumentation.lettuce.v5_1; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; @@ -21,9 +29,6 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.test.utils.PortUtils; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Base64; @@ -120,14 +125,13 @@ void testSetCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, "SET TESTSETKEY ?"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET TESTSETKEY ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -147,13 +151,13 @@ void testGetCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET TESTKEY"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET TESTKEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -173,15 +177,13 @@ void testGetNonExistentKeyCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "GET NON_EXISTENT_KEY"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET NON_EXISTENT_KEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -201,13 +203,13 @@ void testCommandWithNoArguments() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "RANDOMKEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -237,16 +239,13 @@ void testListCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, - containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, "LPUSH TESTLIST ?"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, containerConnection.port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, containerConnection.port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "LPUSH TESTLIST ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -266,14 +265,14 @@ void testHashSetCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "HMSET user firstname ? lastname ? age ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), @@ -294,13 +293,13 @@ void testHashGetallCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "HGETALL TESTHM"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "HGETALL TESTHM"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -327,14 +326,14 @@ void testEvalCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "EVAL " + b64Script + " 1 TESTLIST ? ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), @@ -356,14 +355,13 @@ void testMsetCommand() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, "MSET key1 ? key2 ?"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "MSET key1 ? key2 ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -387,17 +385,14 @@ void testDebugSegfaultCommandWithNoArgumentProducesNoSpan() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, containerConnection.port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, containerConnection.port), + equalTo(DB_SYSTEM, "redis"), equalTo( - NetworkAttributes.NETWORK_PEER_PORT, - containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo( - ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "CLIENT SETINFO lib-name Lettuce")))), trace -> trace.hasSpansSatisfyingExactly( @@ -406,17 +401,14 @@ void testDebugSegfaultCommandWithNoArgumentProducesNoSpan() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, - containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo( - ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, containerConnection.port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, containerConnection.port), + equalTo(DB_SYSTEM, "redis"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), stringAssert -> stringAssert.startsWith("CLIENT SETINFO lib-ver"))))), trace -> @@ -426,18 +418,13 @@ void testDebugSegfaultCommandWithNoArgumentProducesNoSpan() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, - containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo( - ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "DEBUG SEGFAULT"))))); + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, containerConnection.port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, containerConnection.port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "DEBUG SEGFAULT"))))); } else { testing() .waitAndAssertTraces( @@ -448,17 +435,13 @@ void testDebugSegfaultCommandWithNoArgumentProducesNoSpan() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, - containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo( - ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, "DEBUG SEGFAULT"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, containerConnection.port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, containerConnection.port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "DEBUG SEGFAULT"))) // these are no longer recorded since Lettuce 6.1.6 .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), @@ -492,16 +475,13 @@ void testShutdownCommandProducesNoSpan() { .hasException(new RedisException("Connection disconnected")) .hasAttributesSatisfyingExactly( addExtraAttributes( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, - containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, "SHUTDOWN NOSAVE")))); + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, containerConnection.port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, containerConnection.port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SHUTDOWN NOSAVE")))); } else { trace.hasSpansSatisfyingExactly( span -> @@ -511,16 +491,13 @@ void testShutdownCommandProducesNoSpan() { addExtraAttributes( equalTo( AttributeKey.stringKey("error"), "Connection disconnected"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, - containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, "SHUTDOWN NOSAVE"))) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, containerConnection.port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, containerConnection.port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SHUTDOWN NOSAVE"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end"))); diff --git a/instrumentation/log4j/log4j-appender-1.2/javaagent/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v1_2/Log4j1Test.java b/instrumentation/log4j/log4j-appender-1.2/javaagent/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v1_2/Log4j1Test.java index a5b36a9e5ad9..669dbb5053a5 100644 --- a/instrumentation/log4j/log4j-appender-1.2/javaagent/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v1_2/Log4j1Test.java +++ b/instrumentation/log4j/log4j-appender-1.2/javaagent/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v1_2/Log4j1Test.java @@ -8,6 +8,9 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; import static java.util.concurrent.TimeUnit.MILLISECONDS; import io.opentelemetry.api.common.AttributeKey; @@ -18,7 +21,6 @@ import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.ExceptionAttributes; import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; import java.lang.reflect.Field; import java.time.Instant; @@ -128,13 +130,10 @@ private static void test( if (logException) { attributeAsserts.addAll( Arrays.asList( - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - IllegalStateException.class.getName()), - equalTo(ExceptionAttributes.EXCEPTION_MESSAGE, "hello"), + equalTo(EXCEPTION_TYPE, IllegalStateException.class.getName()), + equalTo(EXCEPTION_MESSAGE, "hello"), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, - v -> v.contains(Log4j1Test.class.getName())))); + EXCEPTION_STACKTRACE, v -> v.contains(Log4j1Test.class.getName())))); } logRecord.hasAttributesSatisfyingExactly(attributeAsserts); diff --git a/instrumentation/log4j/log4j-appender-2.17/javaagent/README.md b/instrumentation/log4j/log4j-appender-2.17/javaagent/README.md index a78c4d9c395e..e3bf213d9498 100644 --- a/instrumentation/log4j/log4j-appender-2.17/javaagent/README.md +++ b/instrumentation/log4j/log4j-appender-2.17/javaagent/README.md @@ -1,8 +1,11 @@ # Settings for the Log4j Appender instrumentation -| System property | Type | Default | Description | -|-----------------------------------------------------------------------------------| ------- | ------- |-----------------------------------------------------------------------------------------------------------------------| -| `otel.instrumentation.log4j-appender.experimental-log-attributes` | Boolean | `false` | Enable the capture of experimental log attributes `thread.name` and `thread.id`. | -| `otel.instrumentation.log4j-appender.experimental.capture-map-message-attributes` | Boolean | `false` | Enable the capture of `MapMessage` attributes. | -| `otel.instrumentation.log4j-appender.experimental.capture-marker-attribute` | Boolean | `false` | Enable the capture of Log4j markers as attributes. | -| `otel.instrumentation.log4j-appender.experimental.capture-mdc-attributes` | String | | Comma separated list of context data attributes to capture. Use the wildcard character `*` to capture all attributes. | +| System property | Type | Default | Description | +|-----------------------------------------------------------------------------------|---------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------| +| `otel.instrumentation.log4j-appender.experimental-log-attributes` | Boolean | `false` | Enable the capture of experimental log attributes `thread.name` and `thread.id`. | +| `otel.instrumentation.log4j-appender.experimental.capture-code-attributes` | Boolean | `false` | Enable the capture of [source code attributes]. Note that capturing source code attributes at logging sites might add a performance overhead. | +| `otel.instrumentation.log4j-appender.experimental.capture-map-message-attributes` | Boolean | `false` | Enable the capture of `MapMessage` attributes. | +| `otel.instrumentation.log4j-appender.experimental.capture-marker-attribute` | Boolean | `false` | Enable the capture of Log4j markers as attributes. | +| `otel.instrumentation.log4j-appender.experimental.capture-mdc-attributes` | String | | Comma separated list of context data attributes to capture. Use the wildcard character `*` to capture all attributes. | + +[source code attributes]: https://github.com/open-telemetry/semantic-conventions/blob/main/docs/general/attributes.md#source-code-attributes diff --git a/instrumentation/log4j/log4j-appender-2.17/javaagent/build.gradle.kts b/instrumentation/log4j/log4j-appender-2.17/javaagent/build.gradle.kts index 2594f5da0463..15fee0051d3f 100644 --- a/instrumentation/log4j/log4j-appender-2.17/javaagent/build.gradle.kts +++ b/instrumentation/log4j/log4j-appender-2.17/javaagent/build.gradle.kts @@ -14,7 +14,7 @@ muzzle { val testLatestDeps = findProperty("testLatestDeps") as Boolean dependencies { - library("org.apache.logging.log4j:log4j-core:2.17.0") + library("org.apache.logging.log4j:log4j-core:2.0") compileOnly(project(":javaagent-bootstrap")) @@ -56,9 +56,10 @@ tasks { tasks.withType().configureEach { // TODO run tests both with and without experimental log attributes + jvmArgs("-Dotel.instrumentation.log4j-appender.experimental-log-attributes=true") + jvmArgs("-Dotel.instrumentation.log4j-appender.experimental.capture-code-attributes=true") jvmArgs("-Dotel.instrumentation.log4j-appender.experimental.capture-map-message-attributes=true") jvmArgs("-Dotel.instrumentation.log4j-appender.experimental.capture-mdc-attributes=*") - jvmArgs("-Dotel.instrumentation.log4j-appender.experimental-log-attributes=true") jvmArgs("-Dotel.instrumentation.log4j-appender.experimental.capture-marker-attribute=true") } diff --git a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jAppenderInstrumentation.java b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jAppenderInstrumentation.java index 9e89793aef38..4c026b86cd9a 100644 --- a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jAppenderInstrumentation.java +++ b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jAppenderInstrumentation.java @@ -73,6 +73,8 @@ public static void methodEnter( @Advice.This Logger logger, @Advice.Argument(0) Level level, @Advice.Argument(1) Marker marker, + @Advice.Argument(2) String loggerClassName, + @Advice.Argument(3) StackTraceElement location, @Advice.Argument(4) Message message, @Advice.Argument(5) Throwable t, @Advice.Local("otelCallDepth") CallDepth callDepth) { @@ -80,7 +82,7 @@ public static void methodEnter( // logging framework delegates to another callDepth = CallDepth.forClass(LoggerProvider.class); if (callDepth.getAndIncrement() == 0) { - Log4jHelper.capture(logger, level, marker, message, t); + Log4jHelper.capture(logger, loggerClassName, location, level, marker, message, t); } } @@ -96,6 +98,7 @@ public static class LogMessageAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void methodEnter( @Advice.This Logger logger, + @Advice.Argument(0) String loggerClassName, @Advice.Argument(1) Level level, @Advice.Argument(2) Marker marker, @Advice.Argument(3) Message message, @@ -105,7 +108,7 @@ public static void methodEnter( // logging framework delegates to another callDepth = CallDepth.forClass(LoggerProvider.class); if (callDepth.getAndIncrement() == 0) { - Log4jHelper.capture(logger, level, marker, message, t); + Log4jHelper.capture(logger, loggerClassName, null, level, marker, message, t); } } diff --git a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java index 9ab4d41abf55..6fc308cc1dd9 100644 --- a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java +++ b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java @@ -14,6 +14,9 @@ import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.ContextDataAccessor; import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.LogEventMapper; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.time.Instant; import java.util.List; import java.util.Map; @@ -28,14 +31,17 @@ public final class Log4jHelper { private static final LogEventMapper> mapper; - private static final boolean captureExperimentalAttributes; + private static final MethodHandle stackTraceMethodHandle = getStackTraceMethodHandle(); static { InstrumentationConfig config = AgentInstrumentationConfig.get(); captureExperimentalAttributes = config.getBoolean("otel.instrumentation.log4j-appender.experimental-log-attributes", false); + boolean captureCodeAttributes = + config.getBoolean( + "otel.instrumentation.log4j-appender.experimental.capture-code-attributes", false); boolean captureMapMessageAttributes = config.getBoolean( "otel.instrumentation.log4j-appender.experimental.capture-map-message-attributes", @@ -51,13 +57,20 @@ public final class Log4jHelper { new LogEventMapper<>( ContextDataAccessorImpl.INSTANCE, captureExperimentalAttributes, + captureCodeAttributes, captureMapMessageAttributes, captureMarkerAttribute, captureContextDataAttributes); } public static void capture( - Logger logger, Level level, Marker marker, Message message, Throwable throwable) { + Logger logger, + String loggerClassName, + StackTraceElement location, + Level level, + Marker marker, + Message message, + Throwable throwable) { String instrumentationName = logger.getName(); if (instrumentationName == null || instrumentationName.isEmpty()) { instrumentationName = "ROOT"; @@ -86,11 +99,54 @@ public static void capture( contextData, threadName, threadId, + () -> location != null ? location : getLocation(loggerClassName), Context.current()); builder.setTimestamp(Instant.now()); builder.emit(); } + private static StackTraceElement getLocation(String loggerClassName) { + if (stackTraceMethodHandle == null) { + return null; + } + + try { + return (StackTraceElement) stackTraceMethodHandle.invoke(loggerClassName); + } catch (Throwable exception) { + return null; + } + } + + private static MethodHandle getStackTraceMethodHandle() { + Class stackTraceClass = null; + try { + // since 2.9.0 + stackTraceClass = Class.forName("org.apache.logging.log4j.util.StackLocatorUtil"); + } catch (ClassNotFoundException exception) { + // ignore + } + if (stackTraceClass == null) { + try { + // before 2.9.0 + stackTraceClass = Class.forName("org.apache.logging.log4j.core.impl.Log4jLogEvent"); + } catch (ClassNotFoundException exception) { + // ignore + } + } + if (stackTraceClass == null) { + return null; + } + try { + return MethodHandles.lookup() + .findStatic( + stackTraceClass, + "calcLocation", + MethodType.methodType(StackTraceElement.class, String.class)); + } catch (Exception exception) { + return null; + } + } + private enum ContextDataAccessorImpl implements ContextDataAccessor> { INSTANCE; diff --git a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/Log4j2Test.java b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/Log4j2Test.java index 1187c775ff3c..0ea83e6e95c8 100644 --- a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/Log4j2Test.java +++ b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/Log4j2Test.java @@ -8,6 +8,15 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_FILEPATH; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_FUNCTION; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_LINENO; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_NAMESPACE; +import static io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes.THREAD_ID; +import static io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes.THREAD_NAME; import static java.util.concurrent.TimeUnit.MILLISECONDS; import io.opentelemetry.api.common.AttributeKey; @@ -19,8 +28,6 @@ import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.ExceptionAttributes; -import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; @@ -33,6 +40,7 @@ import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.message.StringMapMessage; import org.apache.logging.log4j.message.StructuredDataMessage; +import org.assertj.core.api.AbstractLongAssert; import org.assertj.core.api.AssertAccess; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -110,21 +118,19 @@ private static void test( List attributeAsserts = new ArrayList<>( Arrays.asList( - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, - Thread.currentThread().getName()), - equalTo( - ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()))); + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(CODE_NAMESPACE, Log4j2Test.class.getName()), + equalTo(CODE_FUNCTION, "performLogging"), + satisfies(CODE_LINENO, AbstractLongAssert::isPositive), + equalTo(CODE_FILEPATH, "Log4j2Test.java"))); if (logException) { attributeAsserts.addAll( Arrays.asList( - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - IllegalStateException.class.getName()), - equalTo(ExceptionAttributes.EXCEPTION_MESSAGE, "hello"), + equalTo(EXCEPTION_TYPE, IllegalStateException.class.getName()), + equalTo(EXCEPTION_MESSAGE, "hello"), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, - v -> v.contains(Log4j2Test.class.getName())))); + EXCEPTION_STACKTRACE, v -> v.contains(Log4j2Test.class.getName())))); } logRecord.hasAttributesSatisfyingExactly(attributeAsserts); @@ -159,9 +165,12 @@ void testContextData() { .hasAttributesSatisfyingExactly( equalTo(AttributeKey.stringKey("key1"), "val1"), equalTo(AttributeKey.stringKey("key2"), "val2"), - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, Thread.currentThread().getName()), - equalTo(ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()))); + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(CODE_NAMESPACE, Log4j2Test.class.getName()), + equalTo(CODE_FUNCTION, "testContextData"), + satisfies(CODE_LINENO, AbstractLongAssert::isPositive), + equalTo(CODE_FILEPATH, "Log4j2Test.java"))); } @Test @@ -181,9 +190,12 @@ void testStringMapMessage() { .hasAttributesSatisfyingExactly( equalTo(AttributeKey.stringKey("log4j.map_message.key1"), "val1"), equalTo(AttributeKey.stringKey("log4j.map_message.key2"), "val2"), - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, Thread.currentThread().getName()), - equalTo(ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()))); + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(CODE_NAMESPACE, Log4j2Test.class.getName()), + equalTo(CODE_FUNCTION, "testStringMapMessage"), + satisfies(CODE_LINENO, AbstractLongAssert::isPositive), + equalTo(CODE_FILEPATH, "Log4j2Test.java"))); } @Test @@ -202,9 +214,12 @@ void testStringMapMessageWithSpecialAttribute() { .hasSeverityText("INFO") .hasAttributesSatisfyingExactly( equalTo(AttributeKey.stringKey("log4j.map_message.key1"), "val1"), - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, Thread.currentThread().getName()), - equalTo(ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()))); + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(CODE_NAMESPACE, Log4j2Test.class.getName()), + equalTo(CODE_FUNCTION, "testStringMapMessageWithSpecialAttribute"), + satisfies(CODE_LINENO, AbstractLongAssert::isPositive), + equalTo(CODE_FILEPATH, "Log4j2Test.java"))); } @Test @@ -224,9 +239,12 @@ void testStructuredDataMapMessage() { .hasAttributesSatisfyingExactly( equalTo(AttributeKey.stringKey("log4j.map_message.key1"), "val1"), equalTo(AttributeKey.stringKey("log4j.map_message.key2"), "val2"), - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, Thread.currentThread().getName()), - equalTo(ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()))); + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(CODE_NAMESPACE, Log4j2Test.class.getName()), + equalTo(CODE_FUNCTION, "testStructuredDataMapMessage"), + satisfies(CODE_LINENO, AbstractLongAssert::isPositive), + equalTo(CODE_FILEPATH, "Log4j2Test.java"))); } @Test @@ -239,8 +257,12 @@ public void testMarker() { testing.waitAndAssertLogRecords( logRecord -> logRecord.hasAttributesSatisfyingExactly( - equalTo(ThreadIncubatingAttributes.THREAD_NAME, Thread.currentThread().getName()), - equalTo(ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()), + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(CODE_NAMESPACE, Log4j2Test.class.getName()), + equalTo(CODE_FUNCTION, "testMarker"), + satisfies(CODE_LINENO, AbstractLongAssert::isPositive), + equalTo(CODE_FILEPATH, "Log4j2Test.java"), equalTo(AttributeKey.stringKey("log4j.marker"), markerName))); } diff --git a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/Slf4jToLog4jTest.java b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/Slf4jToLog4jTest.java index 0a842bbd16cc..c1f5d1b93298 100644 --- a/instrumentation/log4j/log4j-appender-2.17/javaagent/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/Slf4jToLog4jTest.java +++ b/instrumentation/log4j/log4j-appender-2.17/javaagent/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/Slf4jToLog4jTest.java @@ -8,6 +8,15 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_FILEPATH; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_FUNCTION; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_LINENO; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_NAMESPACE; +import static io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes.THREAD_ID; +import static io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes.THREAD_NAME; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.logs.Severity; @@ -16,12 +25,11 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.ExceptionAttributes; -import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; +import org.assertj.core.api.AbstractLongAssert; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.params.ParameterizedTest; @@ -101,20 +109,19 @@ private static void test( List attributeAsserts = new ArrayList<>( Arrays.asList( - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, - Thread.currentThread().getName()), - equalTo( - ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()))); + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(CODE_NAMESPACE, Slf4jToLog4jTest.class.getName()), + equalTo(CODE_FUNCTION, "performLogging"), + satisfies(CODE_LINENO, AbstractLongAssert::isPositive), + equalTo(CODE_FILEPATH, "Slf4jToLog4jTest.java"))); if (logException) { attributeAsserts.addAll( Arrays.asList( - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - IllegalStateException.class.getName()), - equalTo(ExceptionAttributes.EXCEPTION_MESSAGE, "hello"), + equalTo(EXCEPTION_TYPE, IllegalStateException.class.getName()), + equalTo(EXCEPTION_MESSAGE, "hello"), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, + EXCEPTION_STACKTRACE, v -> v.contains(Slf4jToLog4jTest.class.getName())))); } logRecord.hasAttributesSatisfyingExactly(attributeAsserts); @@ -145,14 +152,16 @@ void testMdc() { .hasAttributesSatisfyingExactly( equalTo(AttributeKey.stringKey("key1"), "val1"), equalTo(AttributeKey.stringKey("key2"), "val2"), - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, Thread.currentThread().getName()), - equalTo(ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()))); + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(CODE_NAMESPACE, Slf4jToLog4jTest.class.getName()), + equalTo(CODE_FUNCTION, "testMdc"), + satisfies(CODE_LINENO, AbstractLongAssert::isPositive), + equalTo(CODE_FILEPATH, "Slf4jToLog4jTest.java"))); } @Test public void testMarker() { - String markerName = "aMarker"; Marker marker = MarkerFactory.getMarker(markerName); @@ -161,8 +170,12 @@ public void testMarker() { testing.waitAndAssertLogRecords( logRecord -> logRecord.hasAttributesSatisfyingExactly( - equalTo(ThreadIncubatingAttributes.THREAD_NAME, Thread.currentThread().getName()), - equalTo(ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()), + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(CODE_NAMESPACE, Slf4jToLog4jTest.class.getName()), + equalTo(CODE_FUNCTION, "testMarker"), + satisfies(CODE_LINENO, AbstractLongAssert::isPositive), + equalTo(CODE_FILEPATH, "Slf4jToLog4jTest.java"), equalTo(AttributeKey.stringKey("log4j.marker"), markerName))); } diff --git a/instrumentation/log4j/log4j-appender-2.17/library/README.md b/instrumentation/log4j/log4j-appender-2.17/library/README.md index 4a3d14441a44..9d4a7be38e1f 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/README.md +++ b/instrumentation/log4j/log4j-appender-2.17/library/README.md @@ -95,7 +95,10 @@ The available settings are: | XML Attribute | Type | Default | Description | |------------------------------------|---------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `captureExperimentalAttributes` | Boolean | `false` | Enable the capture of experimental log attributes `thread.name` and `thread.id`. | +| `captureCodeAttributes` | Boolean | `false` | Enable the capture of [source code attributes]. Note that capturing source code attributes at logging sites might add a performance overhead. | | `captureMapMessageAttributes` | Boolean | `false` | Enable the capture of `MapMessage` attributes. | | `captureMarkerAttribute` | Boolean | `false` | Enable the capture of Log4j markers as attributes. | | `captureContextDataAttributes` | String | | Comma separated list of context data attributes to capture. Use the wildcard character `*` to capture all attributes. | | `numLogsCapturedBeforeOtelInstall` | Integer | 1000 | Log telemetry is emitted after the initialization of the OpenTelemetry Log4j appender with an OpenTelemetry object. This setting allows you to modify the size of the cache used to replay the first logs. | + +[source code attributes]: https://github.com/open-telemetry/semantic-conventions/blob/main/docs/general/attributes.md#source-code-attributes diff --git a/instrumentation/log4j/log4j-appender-2.17/library/build.gradle.kts b/instrumentation/log4j/log4j-appender-2.17/library/build.gradle.kts index a0d41b8f78fd..4c80b3a5f2da 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/build.gradle.kts +++ b/instrumentation/log4j/log4j-appender-2.17/library/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { tasks { withType().configureEach { + systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") } diff --git a/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/LogEventToReplay.java b/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/LogEventToReplay.java index e765d42e80f1..a165d0edab93 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/LogEventToReplay.java +++ b/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/LogEventToReplay.java @@ -36,8 +36,9 @@ class LogEventToReplay implements LogEvent { private final ReadOnlyStringMap contextData; private final String threadName; private final long threadId; + private final StackTraceElement source; - LogEventToReplay(LogEvent logEvent) { + LogEventToReplay(LogEvent logEvent, boolean captureCodeAttributes) { this.loggerName = logEvent.getLoggerName(); Message messageOrigin = logEvent.getMessage(); if (messageOrigin instanceof StructuredDataMessage) { @@ -64,6 +65,7 @@ class LogEventToReplay implements LogEvent { this.contextData = new SortedArrayStringMap(logEvent.getContextData()); this.threadName = logEvent.getThreadName(); this.threadId = logEvent.getThreadId(); + this.source = captureCodeAttributes ? logEvent.getSource() : null; } @Override @@ -125,7 +127,7 @@ public Instant getInstant() { @Override public StackTraceElement getSource() { - return null; + return source; } @Override diff --git a/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/OpenTelemetryAppender.java b/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/OpenTelemetryAppender.java index aeeadb3e6bce..ff980b3be35a 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/OpenTelemetryAppender.java +++ b/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/OpenTelemetryAppender.java @@ -62,10 +62,9 @@ public class OpenTelemetryAppender extends AbstractAppender { private volatile OpenTelemetry openTelemetry; private final BlockingQueue eventsToReplay; - private final AtomicBoolean replayLimitWarningLogged = new AtomicBoolean(); - private final ReadWriteLock lock = new ReentrantReadWriteLock(); + private final boolean captureCodeAttributes; /** * Installs the {@code openTelemetry} instance on any {@link OpenTelemetryAppender}s identified in @@ -98,6 +97,7 @@ public static class Builder> extends AbstractAppender.Build implements org.apache.logging.log4j.core.util.Builder { @PluginBuilderAttribute private boolean captureExperimentalAttributes; + @PluginBuilderAttribute private boolean captureCodeAttributes; @PluginBuilderAttribute private boolean captureMapMessageAttributes; @PluginBuilderAttribute private boolean captureMarkerAttribute; @PluginBuilderAttribute private String captureContextDataAttributes; @@ -116,6 +116,20 @@ public B setCaptureExperimentalAttributes(boolean captureExperimentalAttributes) return asBuilder(); } + /** + * Sets whether the code attributes (file name, class name, method name and line number) should + * be set to logs. Enabling these attributes can potentially impact performance (see + * https://logging.apache.org/log4j/2.x/manual/performance.html#layouts-location). + * + * @param captureCodeAttributes To enable or disable the code attributes (file name, class name, + * method name and line number) + */ + @CanIgnoreReturnValue + public B captureCodeAttributes(boolean captureCodeAttributes) { + this.captureCodeAttributes = captureCodeAttributes; + return asBuilder(); + } + /** Sets whether log4j {@link MapMessage} attributes should be copied to logs. */ @CanIgnoreReturnValue public B setCaptureMapMessageAttributes(boolean captureMapMessageAttributes) { @@ -170,6 +184,7 @@ public OpenTelemetryAppender build() { isIgnoreExceptions(), getPropertyArray(), captureExperimentalAttributes, + captureCodeAttributes, captureMapMessageAttributes, captureMarkerAttribute, captureContextDataAttributes, @@ -185,6 +200,7 @@ private OpenTelemetryAppender( boolean ignoreExceptions, Property[] properties, boolean captureExperimentalAttributes, + boolean captureCodeAttributes, boolean captureMapMessageAttributes, boolean captureMarkerAttribute, String captureContextDataAttributes, @@ -196,10 +212,12 @@ private OpenTelemetryAppender( new LogEventMapper<>( ContextDataAccessorImpl.INSTANCE, captureExperimentalAttributes, + captureCodeAttributes, captureMapMessageAttributes, captureMarkerAttribute, splitAndFilterBlanksAndNulls(captureContextDataAttributes)); this.openTelemetry = openTelemetry; + this.captureCodeAttributes = captureCodeAttributes; if (numLogsCapturedBeforeOtelInstall != 0) { this.eventsToReplay = new ArrayBlockingQueue<>(numLogsCapturedBeforeOtelInstall); } else { @@ -257,7 +275,7 @@ public void append(LogEvent event) { return; } - LogEventToReplay logEventToReplay = new LogEventToReplay(event); + LogEventToReplay logEventToReplay = new LogEventToReplay(event, captureCodeAttributes); if (!eventsToReplay.offer(logEventToReplay) && !replayLimitWarningLogged.getAndSet(true)) { String message = @@ -309,6 +327,7 @@ private void emit(OpenTelemetry openTelemetry, LogEvent event) { contextData, event.getThreadName(), event.getThreadId(), + event::getSource, context); Instant timestamp = event.getInstant(); diff --git a/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java b/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java index 1116de609bf7..e26958f5215b 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java +++ b/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java @@ -16,6 +16,7 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.List; +import java.util.function.Supplier; import javax.annotation.Nullable; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Marker; @@ -29,6 +30,12 @@ */ public final class LogEventMapper { + // copied from CodeIncubatingAttributes + private static final AttributeKey CODE_FILEPATH = AttributeKey.stringKey("code.filepath"); + private static final AttributeKey CODE_FUNCTION = AttributeKey.stringKey("code.function"); + private static final AttributeKey CODE_LINENO = AttributeKey.longKey("code.lineno"); + private static final AttributeKey CODE_NAMESPACE = + AttributeKey.stringKey("code.namespace"); // copied from ThreadIncubatingAttributes private static final AttributeKey THREAD_ID = AttributeKey.longKey("thread.id"); private static final AttributeKey THREAD_NAME = AttributeKey.stringKey("thread.name"); @@ -45,6 +52,7 @@ public final class LogEventMapper { private final ContextDataAccessor contextDataAccessor; private final boolean captureExperimentalAttributes; + private final boolean captureCodeAttributes; private final boolean captureMapMessageAttributes; private final boolean captureMarkerAttribute; private final List captureContextDataAttributes; @@ -53,11 +61,13 @@ public final class LogEventMapper { public LogEventMapper( ContextDataAccessor contextDataAccessor, boolean captureExperimentalAttributes, + boolean captureCodeAttributes, boolean captureMapMessageAttributes, boolean captureMarkerAttribute, List captureContextDataAttributes) { this.contextDataAccessor = contextDataAccessor; + this.captureCodeAttributes = captureCodeAttributes; this.captureExperimentalAttributes = captureExperimentalAttributes; this.captureMapMessageAttributes = captureMapMessageAttributes; this.captureMarkerAttribute = captureMarkerAttribute; @@ -71,13 +81,11 @@ public LogEventMapper( * *
    *
  • Fully qualified class name - {@link LogEvent#getLoggerFqcn()} - *
  • Thread name - {@link LogEvent#getThreadName()} - *
  • Thread id - {@link LogEvent#getThreadId()} *
  • Thread priority - {@link LogEvent#getThreadPriority()} - *
  • Marker - {@link LogEvent#getMarker()} *
  • Nested diagnostic context - {@link LogEvent#getContextStack()} *
*/ + @SuppressWarnings("TooManyParameters") public void mapLogEvent( LogRecordBuilder builder, Message message, @@ -87,6 +95,7 @@ public void mapLogEvent( T contextData, String threadName, long threadId, + Supplier sourceSupplier, Context context) { AttributesBuilder attributes = Attributes.builder(); @@ -116,6 +125,22 @@ public void mapLogEvent( attributes.put(THREAD_ID, threadId); } + if (captureCodeAttributes) { + StackTraceElement source = sourceSupplier.get(); + if (source != null) { + String fileName = source.getFileName(); + if (fileName != null) { + attributes.put(CODE_FILEPATH, fileName); + } + attributes.put(CODE_NAMESPACE, source.getClassName()); + attributes.put(CODE_FUNCTION, source.getMethodName()); + int lineNumber = source.getLineNumber(); + if (lineNumber > 0) { + attributes.put(CODE_LINENO, lineNumber); + } + } + } + builder.setAllAttributes(attributes.build()); builder.setContext(context); } diff --git a/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/AbstractOpenTelemetryAppenderTest.java b/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/AbstractOpenTelemetryAppenderTest.java index 55307f4ded15..c7be6426f3cb 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/AbstractOpenTelemetryAppenderTest.java +++ b/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/AbstractOpenTelemetryAppenderTest.java @@ -9,6 +9,15 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_FILEPATH; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_FUNCTION; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_LINENO; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_NAMESPACE; +import static io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes.THREAD_ID; +import static io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes.THREAD_NAME; import static java.util.concurrent.TimeUnit.MILLISECONDS; import io.opentelemetry.api.logs.Severity; @@ -17,9 +26,11 @@ import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.resources.Resource; -import io.opentelemetry.semconv.ExceptionAttributes; -import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; @@ -29,6 +40,7 @@ import org.apache.logging.log4j.message.FormattedMessage; import org.apache.logging.log4j.message.StringMapMessage; import org.apache.logging.log4j.message.StructuredDataMessage; +import org.assertj.core.api.AbstractLongAssert; import org.assertj.core.api.AssertAccess; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -94,11 +106,10 @@ void logNoSpan() { .hasInstrumentationScope(instrumentationScopeInfo) .hasBody("log message 1") .hasAttributesSatisfyingExactly( - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, - Thread.currentThread().getName()), - equalTo( - ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()))); + addLocationAttributes( + "logNoSpan", + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId())))); } @Test @@ -128,16 +139,13 @@ void logWithExtras() { .hasSeverity(Severity.INFO) .hasSeverityText("INFO") .hasAttributesSatisfyingExactly( - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, Thread.currentThread().getName()), - equalTo(ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()), - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - IllegalStateException.class.getName()), - equalTo(ExceptionAttributes.EXCEPTION_MESSAGE, "Error!"), - satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, - v -> v.contains("logWithExtras"))); + addLocationAttributes( + "logWithExtras", + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(EXCEPTION_TYPE, IllegalStateException.class.getName()), + equalTo(EXCEPTION_MESSAGE, "Error!"), + satisfies(EXCEPTION_STACKTRACE, v -> v.contains("logWithExtras")))); LogRecordData logRecordData = AssertAccess.getActual(logRecord); assertThat(logRecordData.getTimestampEpochNanos()) @@ -166,13 +174,12 @@ void logContextData() { .hasInstrumentationScope(instrumentationScopeInfo) .hasBody("log message 1") .hasAttributesSatisfyingExactly( - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, - Thread.currentThread().getName()), - equalTo( - ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()), - equalTo(stringKey("key1"), "val1"), - equalTo(stringKey("key2"), "val2"))); + addLocationAttributes( + "logContextData", + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(stringKey("key1"), "val1"), + equalTo(stringKey("key2"), "val2")))); } @Test @@ -191,13 +198,12 @@ void logStringMapMessage() { .hasResource(resource) .hasInstrumentationScope(instrumentationScopeInfo) .hasAttributesSatisfyingExactly( - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, - Thread.currentThread().getName()), - equalTo( - ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()), - equalTo(stringKey("log4j.map_message.key1"), "val1"), - equalTo(stringKey("log4j.map_message.key2"), "val2"))); + addLocationAttributes( + "logStringMapMessage", + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(stringKey("log4j.map_message.key1"), "val1"), + equalTo(stringKey("log4j.map_message.key2"), "val2")))); } @Test @@ -217,12 +223,11 @@ void logStringMapMessageWithSpecialAttribute() { .hasInstrumentationScope(instrumentationScopeInfo) .hasBody("val2") .hasAttributesSatisfyingExactly( - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, - Thread.currentThread().getName()), - equalTo( - ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()), - equalTo(stringKey("log4j.map_message.key1"), "val1"))); + addLocationAttributes( + "logStringMapMessageWithSpecialAttribute", + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(stringKey("log4j.map_message.key1"), "val1")))); } @Test @@ -257,12 +262,35 @@ void logStructuredDataMessage() { .hasInstrumentationScope(instrumentationScopeInfo) .hasBody("a message") .hasAttributesSatisfyingExactly( - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, - Thread.currentThread().getName()), - equalTo( - ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()), - equalTo(stringKey("log4j.map_message.key1"), "val1"), - equalTo(stringKey("log4j.map_message.key2"), "val2"))); + addLocationAttributes( + "logStructuredDataMessage", + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(stringKey("log4j.map_message.key1"), "val1"), + equalTo(stringKey("log4j.map_message.key2"), "val2")))); + } + + private static List addLocationAttributes( + String methodName, AttributeAssertion... assertions) { + return addLocationAttributes(AbstractOpenTelemetryAppenderTest.class, methodName, assertions); + } + + protected static List addLocationAttributes( + Class testClass, String methodName, AttributeAssertion... assertions) { + String selector = System.getProperty("Log4j2.contextSelector"); + boolean async = selector != null && selector.endsWith("AsyncLoggerContextSelector"); + if (async && !Boolean.getBoolean("testLatestDeps")) { + // source info is not available by default when async logger is used in non latest dep tests + return Arrays.asList(assertions); + } + + List result = new ArrayList<>(Arrays.asList(assertions)); + result.addAll( + Arrays.asList( + equalTo(CODE_NAMESPACE, testClass.getName()), + equalTo(CODE_FUNCTION, methodName), + satisfies(CODE_LINENO, AbstractLongAssert::isPositive), + equalTo(CODE_FILEPATH, testClass.getSimpleName() + ".java"))); + return result; } } diff --git a/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/LogReplayOpenTelemetryAppenderTest.java b/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/LogReplayOpenTelemetryAppenderTest.java index fde9d06511d3..aeccb412fcd9 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/LogReplayOpenTelemetryAppenderTest.java +++ b/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/LogReplayOpenTelemetryAppenderTest.java @@ -7,10 +7,13 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes.THREAD_ID; +import static io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes.THREAD_NAME; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; -import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import java.util.List; import org.apache.logging.log4j.message.StringMapMessage; import org.apache.logging.log4j.message.StructuredDataMessage; import org.junit.jupiter.api.AfterEach; @@ -95,11 +98,12 @@ void twoLogsStringMapMessage() { .hasResource(resource) .hasInstrumentationScope(instrumentationScopeInfo) .hasAttributesSatisfyingExactly( - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, Thread.currentThread().getName()), - equalTo(ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()), - equalTo(stringKey("log4j.map_message.key1"), "val1"), - equalTo(stringKey("log4j.map_message.key2"), "val2"))); + addLocationAttributes( + "twoLogsStringMapMessage", + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(stringKey("log4j.map_message.key1"), "val1"), + equalTo(stringKey("log4j.map_message.key2"), "val2")))); } @Test @@ -128,10 +132,16 @@ void twoLogsStructuredDataMessage() { .hasInstrumentationScope(instrumentationScopeInfo) .hasBody("a message") .hasAttributesSatisfyingExactly( - equalTo( - ThreadIncubatingAttributes.THREAD_NAME, Thread.currentThread().getName()), - equalTo(ThreadIncubatingAttributes.THREAD_ID, Thread.currentThread().getId()), - equalTo(stringKey("log4j.map_message.key1"), "val1"), - equalTo(stringKey("log4j.map_message.key2"), "val2"))); + addLocationAttributes( + "twoLogsStructuredDataMessage", + equalTo(THREAD_NAME, Thread.currentThread().getName()), + equalTo(THREAD_ID, Thread.currentThread().getId()), + equalTo(stringKey("log4j.map_message.key1"), "val1"), + equalTo(stringKey("log4j.map_message.key2"), "val2")))); + } + + private static List addLocationAttributes( + String methodName, AttributeAssertion... assertions) { + return addLocationAttributes(LogReplayOpenTelemetryAppenderTest.class, methodName, assertions); } } diff --git a/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapperTest.java b/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapperTest.java index 535e2c857e35..ce374ff97b9b 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapperTest.java +++ b/instrumentation/log4j/log4j-appender-2.17/library/src/test/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapperTest.java @@ -31,7 +31,8 @@ class LogEventMapperTest { void testDefault() { // given LogEventMapper> mapper = - new LogEventMapper<>(ContextDataAccessorImpl.INSTANCE, false, false, false, emptyList()); + new LogEventMapper<>( + ContextDataAccessorImpl.INSTANCE, false, false, false, false, emptyList()); Map contextData = new HashMap<>(); contextData.put("key1", "value1"); contextData.put("key2", "value2"); @@ -49,7 +50,7 @@ void testSome() { // given LogEventMapper> mapper = new LogEventMapper<>( - ContextDataAccessorImpl.INSTANCE, false, false, false, singletonList("key2")); + ContextDataAccessorImpl.INSTANCE, false, false, false, false, singletonList("key2")); Map contextData = new HashMap<>(); contextData.put("key1", "value1"); contextData.put("key2", "value2"); @@ -67,7 +68,7 @@ void testAll() { // given LogEventMapper> mapper = new LogEventMapper<>( - ContextDataAccessorImpl.INSTANCE, false, false, false, singletonList("*")); + ContextDataAccessorImpl.INSTANCE, false, false, false, false, singletonList("*")); Map contextData = new HashMap<>(); contextData.put("key1", "value1"); contextData.put("key2", "value2"); @@ -86,7 +87,7 @@ void testCaptureMapMessageDisabled() { // given LogEventMapper> mapper = new LogEventMapper<>( - ContextDataAccessorImpl.INSTANCE, false, false, false, singletonList("*")); + ContextDataAccessorImpl.INSTANCE, false, false, false, false, singletonList("*")); StringMapMessage message = new StringMapMessage(); message.put("key1", "value1"); @@ -108,7 +109,7 @@ void testCaptureMapMessageWithSpecialAttribute() { // given LogEventMapper> mapper = new LogEventMapper<>( - ContextDataAccessorImpl.INSTANCE, false, true, false, singletonList("*")); + ContextDataAccessorImpl.INSTANCE, false, false, true, false, singletonList("*")); StringMapMessage message = new StringMapMessage(); message.put("key1", "value1"); @@ -130,7 +131,7 @@ void testCaptureMapMessageWithoutSpecialAttribute() { // given LogEventMapper> mapper = new LogEventMapper<>( - ContextDataAccessorImpl.INSTANCE, false, true, false, singletonList("*")); + ContextDataAccessorImpl.INSTANCE, false, false, true, false, singletonList("*")); StringMapMessage message = new StringMapMessage(); message.put("key1", "value1"); @@ -155,7 +156,7 @@ void testCaptureStructuredDataMessage() { // given LogEventMapper> mapper = new LogEventMapper<>( - ContextDataAccessorImpl.INSTANCE, false, true, false, singletonList("*")); + ContextDataAccessorImpl.INSTANCE, false, false, true, false, singletonList("*")); StructuredDataMessage message = new StructuredDataMessage("an id", "a message", "a type"); message.put("key1", "value1"); diff --git a/instrumentation/log4j/log4j-appender-2.17/library/src/test/resources/log4j2.xml b/instrumentation/log4j/log4j-appender-2.17/library/src/test/resources/log4j2.xml index 39c79fc1c7fd..1953d256c0b7 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/src/test/resources/log4j2.xml +++ b/instrumentation/log4j/log4j-appender-2.17/library/src/test/resources/log4j2.xml @@ -6,7 +6,7 @@ pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} traceId: %X{trace_id} spanId: %X{span_id} flags: %X{trace_flags} - %msg%n"/> - + diff --git a/instrumentation/logback/logback-appender-1.0/javaagent/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/LogbackTest.java b/instrumentation/logback/logback-appender-1.0/javaagent/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/LogbackTest.java index 985915317f9d..8fd7f563fc97 100644 --- a/instrumentation/logback/logback-appender-1.0/javaagent/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/LogbackTest.java +++ b/instrumentation/logback/logback-appender-1.0/javaagent/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/LogbackTest.java @@ -8,6 +8,9 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.logs.Severity; @@ -16,7 +19,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.ExceptionAttributes; import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; import java.util.ArrayList; @@ -169,13 +171,10 @@ private static void test( if (logException) { attributeAsserts.addAll( Arrays.asList( - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - IllegalStateException.class.getName()), - equalTo(ExceptionAttributes.EXCEPTION_MESSAGE, "hello"), + equalTo(EXCEPTION_TYPE, IllegalStateException.class.getName()), + equalTo(EXCEPTION_MESSAGE, "hello"), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, - v -> v.contains(LogbackTest.class.getName())))); + EXCEPTION_STACKTRACE, v -> v.contains(LogbackTest.class.getName())))); } logRecord.hasAttributesSatisfyingExactly(attributeAsserts); }); diff --git a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java index 2383ad12edb0..d5d9d97f0f55 100644 --- a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java +++ b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java @@ -110,16 +110,7 @@ public void emit(LoggerProvider loggerProvider, ILoggingEvent event, long thread builder.emit(); } - /** - * Map the {@link ILoggingEvent} data model onto the {@link LogRecordBuilder}. Unmapped fields - * include: - * - *
    - *
  • Thread name - {@link ILoggingEvent#getThreadName()} - *
  • Marker - {@link ILoggingEvent#getMarker()} - *
  • Mapped diagnostic context - {@link ILoggingEvent#getMDCPropertyMap()} - *
- */ + /** Map the {@link ILoggingEvent} data model onto the {@link LogRecordBuilder}. */ private void mapLoggingEvent( LogRecordBuilder builder, ILoggingEvent loggingEvent, long threadId) { // message diff --git a/instrumentation/logback/logback-appender-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/AbstractOpenTelemetryAppenderTest.java b/instrumentation/logback/logback-appender-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/AbstractOpenTelemetryAppenderTest.java index bd73cdc9dd4c..3dbbb0eb7c62 100644 --- a/instrumentation/logback/logback-appender-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/AbstractOpenTelemetryAppenderTest.java +++ b/instrumentation/logback/logback-appender-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/appender/v1_0/AbstractOpenTelemetryAppenderTest.java @@ -8,6 +8,9 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.core.ContextBase; @@ -17,7 +20,6 @@ import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.resources.Resource; -import io.opentelemetry.semconv.ExceptionAttributes; import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -110,13 +112,10 @@ void logWithExtras() { .hasSeverity(Severity.INFO) .hasSeverityText("INFO") .hasAttributesSatisfyingExactly( - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - IllegalStateException.class.getName()), - equalTo(ExceptionAttributes.EXCEPTION_MESSAGE, "Error!"), + equalTo(EXCEPTION_TYPE, IllegalStateException.class.getName()), + equalTo(EXCEPTION_MESSAGE, "Error!"), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, - stackTrace -> stackTrace.contains("logWithExtras")), + EXCEPTION_STACKTRACE, stackTrace -> stackTrace.contains("logWithExtras")), equalTo( CodeIncubatingAttributes.CODE_FILEPATH, AbstractOpenTelemetryAppenderTest.class.getSimpleName() + ".java"), diff --git a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java index 93768e2f9857..5ff59fcb3f39 100644 --- a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java +++ b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java @@ -22,7 +22,6 @@ import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.util.VirtualField; -import io.opentelemetry.instrumentation.logback.mdc.v1_0.internal.UnionMap; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder; @@ -74,6 +73,9 @@ public static void onExit( } Map spanContextData = new HashMap<>(); + if (contextData != null) { + spanContextData.putAll(contextData); + } SpanContext spanContext = Java8BytecodeBridge.spanFromContext(context).getSpanContext(); @@ -96,11 +98,7 @@ public static void onExit( } } - if (contextData == null) { - contextData = spanContextData; - } else { - contextData = new UnionMap<>(contextData, spanContextData); - } + contextData = spanContextData; } } } diff --git a/instrumentation/logback/logback-mdc-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/OpenTelemetryAppender.java b/instrumentation/logback/logback-mdc-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/OpenTelemetryAppender.java index 99b480efada0..8fdb009f06a3 100644 --- a/instrumentation/logback/logback-mdc-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/OpenTelemetryAppender.java +++ b/instrumentation/logback/logback-mdc-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/OpenTelemetryAppender.java @@ -17,7 +17,6 @@ import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants; -import io.opentelemetry.instrumentation.logback.mdc.v1_0.internal.UnionMap; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Iterator; @@ -83,6 +82,9 @@ private void processEvent(ILoggingEvent event) { } Map contextData = new HashMap<>(); + if (eventContext != null) { + contextData.putAll(eventContext); + } Context context = Context.current(); Span currentSpan = Span.fromContext(context); @@ -102,20 +104,14 @@ private void processEvent(ILoggingEvent event) { "baggage." + key, value.getValue())); } - if (eventContext == null) { - eventContext = contextData; - } else { - eventContext = new UnionMap<>(eventContext, contextData); - } - Map eventContextMap = eventContext; LoggerContextVO oldVo = event.getLoggerContextVO(); LoggerContextVO vo = oldVo != null - ? new LoggerContextVO(oldVo.getName(), eventContextMap, oldVo.getBirthTime()) + ? new LoggerContextVO(oldVo.getName(), contextData, oldVo.getBirthTime()) : null; try { - MDC_MAP_FIELD.set(event, eventContextMap); + MDC_MAP_FIELD.set(event, contextData); } catch (IllegalAccessException ignored) { // setAccessible(true) was called on the field } diff --git a/instrumentation/logback/logback-mdc-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/internal/UnionMap.java b/instrumentation/logback/logback-mdc-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/internal/UnionMap.java deleted file mode 100644 index e84b136d7d0d..000000000000 --- a/instrumentation/logback/logback-mdc-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/internal/UnionMap.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.logback.mdc.v1_0.internal; - -import java.io.Serializable; -import java.util.AbstractMap; -import java.util.AbstractSet; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; - -/** - * An immutable view over two maps, with keys resolving from the first map first, or otherwise the - * second if not present in the first. - * - *

This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - */ -public final class UnionMap extends AbstractMap implements Serializable { - private static final long serialVersionUID = 1L; - - private final Map first; - private final Map second; - private int size = -1; - private Set> entrySet; - - public UnionMap(Map first, Map second) { - this.first = first; - this.second = second; - } - - @Override - public int size() { - if (size >= 0) { - return size; - } - - Map a; - Map b; - if (first.size() >= second.size()) { - a = first; - b = second; - } else { - a = second; - b = first; - } - - int size = a.size(); - if (!b.isEmpty()) { - for (K k : b.keySet()) { - if (!a.containsKey(k)) { - size++; - } - } - } - - return this.size = size; - } - - @Override - public boolean isEmpty() { - return first.isEmpty() && second.isEmpty(); - } - - @Override - public boolean containsKey(Object key) { - return first.containsKey(key) || second.containsKey(key); - } - - @Override - public boolean containsValue(Object value) { - return first.containsValue(value) || second.containsValue(value); - } - - @Override - public V get(Object key) { - V value = first.get(key); - return value != null ? value : second.get(key); - } - - @Override - public V put(K key, V value) { - throw new UnsupportedOperationException(); - } - - @Override - public V remove(Object key) { - throw new UnsupportedOperationException(); - } - - @Override - public void clear() { - throw new UnsupportedOperationException(); - } - - @Override - public Set> entrySet() { - if (entrySet != null) { - return entrySet; - } - - // Check for dupes first to reduce allocations on the vastly more common case where there aren't - // any. - boolean secondHasDupes = false; - for (Entry entry : second.entrySet()) { - if (first.containsKey(entry.getKey())) { - secondHasDupes = true; - break; - } - } - - Set> filteredSecond; - if (!secondHasDupes) { - filteredSecond = second.entrySet(); - } else { - filteredSecond = new LinkedHashSet<>(); - for (Entry entry : second.entrySet()) { - if (!first.containsKey(entry.getKey())) { - filteredSecond.add(entry); - } - } - } - return entrySet = - Collections.unmodifiableSet(new ConcatenatedSet<>(first.entrySet(), filteredSecond)); - } - - private Object writeReplace() { - // serialize this object as HashMap - return new HashMap<>(this); - } - - // Member sets must be deduped by caller. - static final class ConcatenatedSet extends AbstractSet { - - private final Set first; - private final Set second; - - private final int size; - - ConcatenatedSet(Set first, Set second) { - this.first = first; - this.second = second; - - size = first.size() + second.size(); - } - - @Override - public int size() { - return size; - } - - @Override - public boolean add(T t) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean remove(Object o) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean addAll(Collection c) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean retainAll(Collection c) { - throw new UnsupportedOperationException(); - } - - @Override - public void clear() { - throw new UnsupportedOperationException(); - } - - @Override - public Iterator iterator() { - return new ConcatenatedSetIterator(); - } - - class ConcatenatedSetIterator implements Iterator { - final Iterator firstItr = first.iterator(); - final Iterator secondItr = second.iterator(); - - ConcatenatedSetIterator() {} - - @Override - public boolean hasNext() { - return firstItr.hasNext() || secondItr.hasNext(); - } - - @Override - public T next() { - if (firstItr.hasNext()) { - return firstItr.next(); - } - return secondItr.next(); - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - } - } -} diff --git a/instrumentation/logback/logback-mdc-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/LogbackTest.java b/instrumentation/logback/logback-mdc-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/LogbackTest.java index d0de1c10e672..f676e8f3cf4e 100644 --- a/instrumentation/logback/logback-mdc-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/LogbackTest.java +++ b/instrumentation/logback/logback-mdc-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/LogbackTest.java @@ -5,8 +5,12 @@ package io.opentelemetry.instrumentation.logback.mdc.v1_0; +import static org.assertj.core.api.Assertions.assertThat; + import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import java.util.Map; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; class LogbackTest extends AbstractLogbackTest { @@ -18,4 +22,15 @@ class LogbackTest extends AbstractLogbackTest { public InstrumentationExtension getInstrumentationExtension() { return testing; } + + @Test + void testMdcMutable() { + TestAppender testAppender = TestAppender.instance; + runWithSpanAndBaggage("test", baggage, () -> logger.info("log message")); + + assertThat(testAppender.lastEvent.getMessage()).isEqualTo("log message"); + Map map = testAppender.lastEvent.getMDCPropertyMap(); + // verify that mdc map associated with the event is mutable + map.put("test", "test"); + } } diff --git a/instrumentation/logback/logback-mdc-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/TestAppender.java b/instrumentation/logback/logback-mdc-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/TestAppender.java new file mode 100644 index 000000000000..e001771dd6ec --- /dev/null +++ b/instrumentation/logback/logback-mdc-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/TestAppender.java @@ -0,0 +1,70 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.logback.mdc.v1_0; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; +import ch.qos.logback.core.UnsynchronizedAppenderBase; +import ch.qos.logback.core.spi.AppenderAttachable; +import ch.qos.logback.core.spi.AppenderAttachableImpl; +import java.util.Iterator; + +public class TestAppender extends UnsynchronizedAppenderBase + implements AppenderAttachable { + + static TestAppender instance; + private final AppenderAttachableImpl aai = new AppenderAttachableImpl<>(); + ILoggingEvent lastEvent; + + public TestAppender() { + instance = this; + } + + private void processEvent(ILoggingEvent event) { + lastEvent = event; + } + + @Override + protected void append(ILoggingEvent event) { + processEvent(event); + aai.appendLoopOnAppenders(event); + } + + @Override + public void addAppender(Appender appender) { + aai.addAppender(appender); + } + + @Override + public Iterator> iteratorForAppenders() { + return aai.iteratorForAppenders(); + } + + @Override + public Appender getAppender(String name) { + return aai.getAppender(name); + } + + @Override + public boolean isAttached(Appender appender) { + return aai.isAttached(appender); + } + + @Override + public void detachAndStopAllAppenders() { + aai.detachAndStopAllAppenders(); + } + + @Override + public boolean detachAppender(Appender appender) { + return aai.detachAppender(appender); + } + + @Override + public boolean detachAppender(String name) { + return aai.detachAppender(name); + } +} diff --git a/instrumentation/logback/logback-mdc-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/internal/UnionMapTest.java b/instrumentation/logback/logback-mdc-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/internal/UnionMapTest.java deleted file mode 100644 index 1656c55f41c1..000000000000 --- a/instrumentation/logback/logback-mdc-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/internal/UnionMapTest.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.logback.mdc.v1_0.internal; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.google.common.collect.ImmutableMap; -import java.util.Collections; -import java.util.Map; -import java.util.Set; -import java.util.stream.Stream; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -class UnionMapTest { - - @ParameterizedTest - @MethodSource("providesMapsArguments") - void testMaps(Map first, Map second) { - UnionMap union = new UnionMap<>(first, second); - - assertThat(union.get("cat")).isEqualTo("meow"); - assertThat(union.get("dog")).isEqualTo("bark"); - assertThat(union.get("foo")).isEqualTo("bar"); - assertThat(union.get("hello")).isEqualTo("world"); - assertThat(union.get("giraffe")).isNull(); - - assertThat(union.isEmpty()).isFalse(); - assertThat(union.size()).isEqualTo(4); - assertThat(union.containsKey("cat")).isTrue(); - assertThat(union.containsKey("dog")).isTrue(); - assertThat(union.containsKey("foo")).isTrue(); - assertThat(union.containsKey("hello")).isTrue(); - assertThat(union.containsKey("giraffe")).isFalse(); - - Set> set = union.entrySet(); - assertThat(set.isEmpty()).isFalse(); - assertThat(set.size()).isEqualTo(4); - assertThat(set.toArray().length).isEqualTo(4); - } - - private static Stream providesMapsArguments() { - ImmutableMap firstArg = - ImmutableMap.of( - "cat", "meow", - "dog", "bark"); - - return Stream.of( - Arguments.of( - firstArg, - ImmutableMap.of( - "foo", "bar", - "hello", "world")), - Arguments.of( - firstArg, - ImmutableMap.of( - "foo", "bar", - "hello", "world", - "cat", "moo"))); - } - - @Test - void testBothEmpty() { - UnionMap union = new UnionMap<>(Collections.emptyMap(), Collections.emptyMap()); - - assertThat(union.isEmpty()).isTrue(); - assertThat(union.size()).isEqualTo(0); - assertThat(union.get("cat")).isNull(); - - Set> set = union.entrySet(); - assertThat(set.isEmpty()).isTrue(); - assertThat(set.size()).isEqualTo(0); - - assertThat(set.toArray().length).isEqualTo(0); - } - - @ParameterizedTest - @MethodSource("providesOneEmptyArguments") - void testOneEmpty(Map first, Map second) { - UnionMap union = new UnionMap<>(first, second); - - assertThat(union.isEmpty()).isFalse(); - assertThat(union.size()).isEqualTo(1); - assertThat(union.get("cat")).isEqualTo("meow"); - assertThat(union.get("dog")).isNull(); - - Set> set = union.entrySet(); - assertThat(set.isEmpty()).isFalse(); - assertThat(set.size()).isEqualTo(1); - - assertThat(set.toArray().length).isEqualTo(1); - } - - private static Stream providesOneEmptyArguments() { - return Stream.of( - Arguments.of(ImmutableMap.of("cat", "meow"), Collections.emptyMap()), - Arguments.of(Collections.emptyMap(), ImmutableMap.of("cat", "meow"))); - } -} diff --git a/instrumentation/logback/logback-mdc-1.0/library/src/test/resources/logback.xml b/instrumentation/logback/logback-mdc-1.0/library/src/test/resources/logback.xml index b934356e3af4..aed73c5b3f47 100644 --- a/instrumentation/logback/logback-mdc-1.0/library/src/test/resources/logback.xml +++ b/instrumentation/logback/logback-mdc-1.0/library/src/test/resources/logback.xml @@ -17,10 +17,12 @@ + + diff --git a/instrumentation/mongo/mongo-3.1/javaagent/build.gradle.kts b/instrumentation/mongo/mongo-3.1/javaagent/build.gradle.kts index bdc5193e6396..6d5716d02711 100644 --- a/instrumentation/mongo/mongo-3.1/javaagent/build.gradle.kts +++ b/instrumentation/mongo/mongo-3.1/javaagent/build.gradle.kts @@ -24,7 +24,15 @@ dependencies { } tasks { - test { + withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/mongo/mongo-3.1/library/build.gradle.kts b/instrumentation/mongo/mongo-3.1/library/build.gradle.kts index 1504784c794e..c0376f9c0f11 100644 --- a/instrumentation/mongo/mongo-3.1/library/build.gradle.kts +++ b/instrumentation/mongo/mongo-3.1/library/build.gradle.kts @@ -13,7 +13,15 @@ dependencies { } tasks { - test { + withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoAttributesExtractor.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoAttributesExtractor.java index 6890025d5c8a..75254966739e 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoAttributesExtractor.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoAttributesExtractor.java @@ -5,6 +5,8 @@ package io.opentelemetry.instrumentation.mongo.v3_1; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitOldDatabaseSemconv; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; import static java.util.Arrays.asList; import com.mongodb.event.CommandStartedEvent; @@ -19,6 +21,8 @@ class MongoAttributesExtractor implements AttributesExtractor { // copied from DbIncubatingAttributes + private static final AttributeKey DB_COLLECTION_NAME = + AttributeKey.stringKey("db.collection.name"); private static final AttributeKey DB_MONGODB_COLLECTION = AttributeKey.stringKey("db.mongodb.collection"); @@ -27,7 +31,12 @@ public void onStart( AttributesBuilder attributes, Context parentContext, CommandStartedEvent event) { String collectionName = collectionName(event); if (collectionName != null) { - attributes.put(DB_MONGODB_COLLECTION, collectionName); + if (emitStableDatabaseSemconv()) { + attributes.put(DB_COLLECTION_NAME, collectionName); + } + if (emitOldDatabaseSemconv()) { + attributes.put(DB_MONGODB_COLLECTION, collectionName); + } } } diff --git a/instrumentation/mongo/mongo-3.7/javaagent/build.gradle.kts b/instrumentation/mongo/mongo-3.7/javaagent/build.gradle.kts index 3122750cc2a6..f6b3d3495eed 100644 --- a/instrumentation/mongo/mongo-3.7/javaagent/build.gradle.kts +++ b/instrumentation/mongo/mongo-3.7/javaagent/build.gradle.kts @@ -34,7 +34,15 @@ dependencies { } tasks { - test { + withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/mongo/mongo-4.0/javaagent/build.gradle.kts b/instrumentation/mongo/mongo-4.0/javaagent/build.gradle.kts index 9a6e601aa4c0..4bda0767209f 100644 --- a/instrumentation/mongo/mongo-4.0/javaagent/build.gradle.kts +++ b/instrumentation/mongo/mongo-4.0/javaagent/build.gradle.kts @@ -28,7 +28,15 @@ dependencies { } tasks { - test { + withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/mongo/mongo-async-3.3/javaagent/build.gradle.kts b/instrumentation/mongo/mongo-async-3.3/javaagent/build.gradle.kts index 00d4e4ec237b..d33c2ae01465 100644 --- a/instrumentation/mongo/mongo-async-3.3/javaagent/build.gradle.kts +++ b/instrumentation/mongo/mongo-async-3.3/javaagent/build.gradle.kts @@ -25,7 +25,15 @@ dependencies { } tasks { - test { + withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/mongo/mongo-common/testing/src/main/java/io/opentelemetry/instrumentation/mongo/testing/AbstractMongoClientTest.java b/instrumentation/mongo/mongo-common/testing/src/main/java/io/opentelemetry/instrumentation/mongo/testing/AbstractMongoClientTest.java index bda0b04ae63c..f00cb317bc70 100644 --- a/instrumentation/mongo/mongo-common/testing/src/main/java/io/opentelemetry/instrumentation/mongo/testing/AbstractMongoClientTest.java +++ b/instrumentation/mongo/mongo-common/testing/src/main/java/io/opentelemetry/instrumentation/mongo/testing/AbstractMongoClientTest.java @@ -6,8 +6,18 @@ package io.opentelemetry.instrumentation.mongo.testing; import static io.opentelemetry.api.trace.SpanKind.CLIENT; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_MONGODB_COLLECTION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; @@ -18,8 +28,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.Socket; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -503,7 +511,7 @@ protected String createCollectionName() { } @SuppressWarnings("deprecation") - // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + // TODO DB_CONNECTION_STRING deprecation void mongoSpan( SpanDataAssert span, String operation, @@ -519,17 +527,19 @@ void mongoSpan( } span.hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), val -> val.satisfies( statement -> assertThat(statements).contains(statement.replaceAll(" ", "")))), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "mongodb"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "mongodb://localhost:" + port), - equalTo(DbIncubatingAttributes.DB_NAME, dbName), - equalTo(DbIncubatingAttributes.DB_OPERATION, operation), - equalTo(DbIncubatingAttributes.DB_MONGODB_COLLECTION, collection)); + equalTo(DB_SYSTEM, "mongodb"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "mongodb://localhost:" + port), + equalTo(maybeStable(DB_NAME), dbName), + equalTo(maybeStable(DB_OPERATION), operation), + equalTo(maybeStable(DB_MONGODB_COLLECTION), collection)); } } diff --git a/instrumentation/netty/netty-3.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/Netty38ClientTest.java b/instrumentation/netty/netty-3.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/Netty38ClientTest.java index 30cfa49d7377..6b8d10f1309d 100644 --- a/instrumentation/netty/netty-3.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/Netty38ClientTest.java +++ b/instrumentation/netty/netty-3.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/Netty38ClientTest.java @@ -5,6 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.netty.v3_8.client; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static java.util.Collections.emptySet; import com.ning.http.client.AsyncCompletionHandler; @@ -21,7 +23,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.ServerAttributes; import java.lang.reflect.Method; import java.net.ConnectException; import java.net.URI; @@ -170,8 +171,8 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { } Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); return attributes; }); } diff --git a/instrumentation/netty/netty-3.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/server/Netty38ServerTest.java b/instrumentation/netty/netty-3.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/server/Netty38ServerTest.java index a1809bc80c69..9569d178c182 100644 --- a/instrumentation/netty/netty-3.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/server/Netty38ServerTest.java +++ b/instrumentation/netty/netty-3.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/server/Netty38ServerTest.java @@ -14,6 +14,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.forPath; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.CONTENT_LENGTH; import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE; import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.LOCATION; @@ -25,7 +26,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; -import io.opentelemetry.semconv.HttpAttributes; import java.net.InetSocketAddress; import java.net.URI; import java.util.HashSet; @@ -91,7 +91,7 @@ protected void configure(HttpServerTestOptions options) { serverEndpoint -> { Set> attributes = new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(HttpAttributes.HTTP_ROUTE); + attributes.remove(HTTP_ROUTE); return attributes; }); diff --git a/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ClientSslTest.java b/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ClientSslTest.java index 5269eb128e5e..0b197bc2f639 100644 --- a/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ClientSslTest.java +++ b/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ClientSslTest.java @@ -9,6 +9,12 @@ import static io.opentelemetry.api.trace.SpanKind.INTERNAL; import static io.opentelemetry.api.trace.SpanKind.SERVER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TRANSPORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static org.assertj.core.api.Assertions.catchThrowable; import io.netty.bootstrap.Bootstrap; @@ -30,8 +36,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestServer; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; import java.net.URI; import java.util.Arrays; import java.util.Collections; @@ -90,12 +94,12 @@ public void shouldFailSslHandshake() { span -> { span.hasName("CONNECT").hasKind(INTERNAL).hasParent(trace.getSpan(0)); span.hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1")); + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")); }, span -> { span.hasName("SSL handshake") @@ -103,10 +107,10 @@ public void shouldFailSslHandshake() { .hasParent(trace.getSpan(0)) .hasStatus(StatusData.error()); span.hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1")); + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")); })); } @@ -182,20 +186,20 @@ public void shouldSuccessfullyEstablishSslHandshake() throws Exception { span -> { span.hasName("CONNECT").hasKind(INTERNAL).hasParent(trace.getSpan(0)); span.hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1")); + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")); }, span -> { span.hasName("SSL handshake").hasKind(INTERNAL).hasParent(trace.getSpan(0)); span.hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1")); + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")); }, span -> { span.hasName("GET").hasKind(CLIENT).hasParent(trace.getSpan(0)); diff --git a/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ClientTest.java b/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ClientTest.java index 2bdc6fc32d88..55de8c16fc52 100644 --- a/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ClientTest.java +++ b/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ClientTest.java @@ -5,6 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.netty.v4_0.client; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; + import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; @@ -27,7 +30,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.ServerAttributes; import java.net.URI; import java.util.Collections; import java.util.HashSet; @@ -174,8 +176,8 @@ private static Set> httpAttributes(URI uri) { return Collections.emptySet(); } Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); return attributes; } } diff --git a/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ConnectionSpanTest.java b/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ConnectionSpanTest.java index 45c36c980f2f..b049e177db47 100644 --- a/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ConnectionSpanTest.java +++ b/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/Netty40ConnectionSpanTest.java @@ -10,6 +10,12 @@ import static io.opentelemetry.api.trace.SpanKind.SERVER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TRANSPORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; @@ -31,8 +37,6 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestServer; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; import java.net.URI; import java.util.HashMap; import java.util.Map; @@ -102,12 +106,12 @@ void successfulRequest() throws Exception { span -> { span.hasName("CONNECT").hasKind(INTERNAL).hasParent(trace.getSpan(0)); span.hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1")); + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")); }, span -> span.hasName("GET").hasKind(CLIENT).hasParent(trace.getSpan(0)), span -> @@ -130,23 +134,22 @@ void failedRequest() throws Exception { span -> span.hasName("parent").hasKind(INTERNAL).hasNoParent().hasException(thrown), span -> { span.hasName("CONNECT").hasKind(INTERNAL).hasParent(trace.getSpan(0)); - span.hasAttributesSatisfying(equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp")); + span.hasAttributesSatisfying(equalTo(NETWORK_TRANSPORT, "tcp")); satisfies( - NetworkAttributes.NETWORK_TYPE, + NETWORK_TYPE, val -> val.satisfiesAnyOf( v -> assertThat(val).isNull(), v -> assertThat(v).isEqualTo("ipv4"))); span.hasAttributesSatisfying( - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort())); + equalTo(SERVER_ADDRESS, uri.getHost()), equalTo(SERVER_PORT, uri.getPort())); satisfies( - NetworkAttributes.NETWORK_PEER_PORT, + NETWORK_PEER_PORT, val -> val.satisfiesAnyOf( v -> assertThat(val).isNull(), v -> assertThat(v).isEqualTo(uri.getPort()))); satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, + NETWORK_PEER_ADDRESS, val -> val.satisfiesAnyOf( v -> assertThat(val).isNull(), diff --git a/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/server/Netty40ServerTest.java b/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/server/Netty40ServerTest.java index 17cc99260974..874c999010d6 100644 --- a/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/server/Netty40ServerTest.java +++ b/instrumentation/netty/netty-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/server/Netty40ServerTest.java @@ -17,6 +17,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; @@ -46,7 +47,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; -import io.opentelemetry.semconv.HttpAttributes; import java.net.URI; import java.util.HashSet; import java.util.Set; @@ -212,7 +212,7 @@ protected void configure(HttpServerTestOptions options) { serverEndpoint -> { Set> attributes = new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(HttpAttributes.HTTP_ROUTE); + attributes.remove(HTTP_ROUTE); return attributes; }); diff --git a/instrumentation/netty/netty-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/Netty41ClientSslTest.java b/instrumentation/netty/netty-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/Netty41ClientSslTest.java index d19b0de2ee1a..20b0d1a59227 100644 --- a/instrumentation/netty/netty-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/Netty41ClientSslTest.java +++ b/instrumentation/netty/netty-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/Netty41ClientSslTest.java @@ -7,6 +7,12 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TRANSPORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; @@ -34,8 +40,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestServer; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; import java.net.URI; import java.util.Collections; import java.util.List; @@ -138,19 +142,19 @@ public void testFailSslHandshake() throws Exception { .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort())), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort())), span -> span.hasName("CONNECT") .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1")), + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")), span -> span.hasName("SSL handshake") .hasKind(SpanKind.INTERNAL) @@ -158,22 +162,22 @@ public void testFailSslHandshake() throws Exception { .hasStatus(StatusData.error()) .hasException(new SSLHandshakeException(null)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), satisfies( - ServerAttributes.SERVER_ADDRESS, + SERVER_ADDRESS, v -> v.satisfiesAnyOf( k -> assertThat(k).isNull(), k -> assertThat(k).isEqualTo(uri.getHost()))), satisfies( - ServerAttributes.SERVER_PORT, + SERVER_PORT, v -> v.satisfiesAnyOf( k -> assertThat(k).isNull(), k -> assertThat(k).isEqualTo(uri.getPort()))), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1")))); + equalTo(NETWORK_PEER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")))); } @Test @@ -206,28 +210,28 @@ public void testSuccessSslHandshake() throws Exception { .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort())), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort())), span -> span.hasName("CONNECT") .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1")), + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")), span -> span.hasName("SSL handshake") .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1")), + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")), span -> span.hasName("GET").hasKind(SpanKind.CLIENT), span -> span.hasName("test-http-server").hasKind(SpanKind.SERVER))); } diff --git a/instrumentation/netty/netty-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/Netty41ConnectionSpanTest.java b/instrumentation/netty/netty-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/Netty41ConnectionSpanTest.java index 19717b671fcb..c9a9fdeec41a 100644 --- a/instrumentation/netty/netty-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/Netty41ConnectionSpanTest.java +++ b/instrumentation/netty/netty-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/Netty41ConnectionSpanTest.java @@ -7,6 +7,12 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TRANSPORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; @@ -31,8 +37,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestServer; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; import java.net.URI; import java.util.HashMap; import java.util.Map; @@ -121,19 +125,19 @@ void testSuccessfulRequest() throws Exception { .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort())), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort())), span -> span.hasName("CONNECT") .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1")), + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")), span -> span.hasName("GET").hasKind(SpanKind.CLIENT).hasParent(trace.getSpan(0)), span -> span.hasName("test-http-server") @@ -162,8 +166,8 @@ void testFailingRequest() throws Exception { .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort())), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort())), span -> span.hasName("CONNECT") .hasKind(SpanKind.INTERNAL) @@ -171,23 +175,23 @@ void testFailingRequest() throws Exception { .hasStatus(StatusData.error()) .hasException(finalThrownException) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TRANSPORT, "tcp"), satisfies( - NetworkAttributes.NETWORK_TYPE, + NETWORK_TYPE, k -> k.satisfiesAnyOf( v -> assertThat(v).isEqualTo("ipv4"), v -> assertThat(v).isNull())), - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort()), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort()), satisfies( - NetworkAttributes.NETWORK_PEER_PORT, + NETWORK_PEER_PORT, k -> k.satisfiesAnyOf( v -> assertThat(v).isEqualTo(uri.getPort()), v -> assertThat(v).isNull())), satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, + NETWORK_PEER_ADDRESS, k -> k.satisfiesAnyOf( v -> assertThat(v).isEqualTo("127.0.0.1"), diff --git a/instrumentation/netty/netty-4.1/testing/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/AbstractNetty41ClientTest.java b/instrumentation/netty/netty-4.1/testing/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/AbstractNetty41ClientTest.java index cae60c300ecd..a1ab798ab524 100644 --- a/instrumentation/netty/netty-4.1/testing/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/AbstractNetty41ClientTest.java +++ b/instrumentation/netty/netty-4.1/testing/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/AbstractNetty41ClientTest.java @@ -6,6 +6,8 @@ package io.opentelemetry.instrumentation.netty.v4_1; import static io.opentelemetry.instrumentation.test.base.HttpClientTest.getPort; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; @@ -19,7 +21,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.ServerAttributes; import java.net.URI; import java.util.Collections; import java.util.HashSet; @@ -122,8 +123,8 @@ private static Set> getHttpAttributes(URI uri) { return Collections.emptySet(); } Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); return attributes; } diff --git a/instrumentation/netty/netty-4.1/testing/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/AbstractNetty41ServerTest.java b/instrumentation/netty/netty-4.1/testing/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/AbstractNetty41ServerTest.java index 6b4a81db73e3..59b7ee8448e9 100644 --- a/instrumentation/netty/netty-4.1/testing/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/AbstractNetty41ServerTest.java +++ b/instrumentation/netty/netty-4.1/testing/src/main/java/io/opentelemetry/instrumentation/netty/v4_1/AbstractNetty41ServerTest.java @@ -18,6 +18,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import com.google.common.collect.Sets; import io.netty.bootstrap.ServerBootstrap; @@ -44,7 +45,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; -import io.opentelemetry.semconv.HttpAttributes; import java.net.URI; import java.util.Collections; @@ -59,9 +59,7 @@ public abstract class AbstractNetty41ServerTest extends AbstractHttpServerTest - Sets.difference( - DEFAULT_HTTP_ATTRIBUTES, Collections.singleton(HttpAttributes.HTTP_ROUTE))); + unused -> Sets.difference(DEFAULT_HTTP_ATTRIBUTES, Collections.singleton(HTTP_ROUTE))); } @Override diff --git a/instrumentation/okhttp/okhttp-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2Test.java b/instrumentation/okhttp/okhttp-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2Test.java index 2f2c56c8f1af..5272cbbbb025 100644 --- a/instrumentation/okhttp/okhttp-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2Test.java +++ b/instrumentation/okhttp/okhttp-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2Test.java @@ -5,6 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.okhttp.v2_2; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; + import com.squareup.okhttp.Callback; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.OkHttpClient; @@ -18,7 +20,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.NetworkAttributes; import java.io.IOException; import java.net.URI; import java.util.HashSet; @@ -104,7 +105,7 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { if ("http://localhost:61/".equals(uri.toString()) || "https://192.0.2.1/".equals(uri.toString()) || resolveAddress("/read-timeout").toString().equals(uri.toString())) { - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); } return attributes; }); diff --git a/instrumentation/okhttp/okhttp-3.0/testing/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/AbstractOkHttp3Test.java b/instrumentation/okhttp/okhttp-3.0/testing/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/AbstractOkHttp3Test.java index 5f051141f7f5..32afdf6501fc 100644 --- a/instrumentation/okhttp/okhttp-3.0/testing/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/AbstractOkHttp3Test.java +++ b/instrumentation/okhttp/okhttp-3.0/testing/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/AbstractOkHttp3Test.java @@ -5,6 +5,7 @@ package io.opentelemetry.instrumentation.okhttp.v3_0; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; @@ -12,7 +13,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.NetworkAttributes; import java.io.IOException; import java.net.URI; import java.util.Collections; @@ -124,7 +124,7 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { || "https://192.0.2.1/".equals(uri.toString()) || "http://192.0.2.1/".equals(uri.toString()) || resolveAddress("/read-timeout").toString().equals(uri.toString())) { - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); } return attributes; diff --git a/instrumentation/opensearch/opensearch-rest-1.0/javaagent/build.gradle.kts b/instrumentation/opensearch/opensearch-rest-1.0/javaagent/build.gradle.kts index 460f5ec15e60..2d56124348a5 100644 --- a/instrumentation/opensearch/opensearch-rest-1.0/javaagent/build.gradle.kts +++ b/instrumentation/opensearch/opensearch-rest-1.0/javaagent/build.gradle.kts @@ -40,4 +40,12 @@ tasks { test { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/opensearch/opensearch-rest-1.0/javaagent/src/test/java/OpenSearchRestTest.java b/instrumentation/opensearch/opensearch-rest-1.0/javaagent/src/test/java/OpenSearchRestTest.java index 1f562caafca0..993ad7369e6d 100644 --- a/instrumentation/opensearch/opensearch-rest-1.0/javaagent/src/test/java/OpenSearchRestTest.java +++ b/instrumentation/opensearch/opensearch-rest-1.0/javaagent/src/test/java/OpenSearchRestTest.java @@ -3,15 +3,20 @@ * SPDX-License-Identifier: Apache-2.0 */ +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.io.IOException; import java.security.KeyManagementException; import java.security.KeyStoreException; @@ -97,20 +102,20 @@ void shouldGetStatusWithTraces() throws IOException { span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "opensearch"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET _cluster/health")), + equalTo(DB_SYSTEM, "opensearch"), + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(maybeStable(DB_STATEMENT), "GET _cluster/health")), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L)))); + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L)))); } @Test @@ -162,20 +167,20 @@ public void onFailure(Exception e) { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "opensearch"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET _cluster/health")), + equalTo(DB_SYSTEM, "opensearch"), + equalTo(maybeStable(DB_OPERATION), "GET"), + equalTo(maybeStable(DB_STATEMENT), "GET _cluster/health")), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, httpHost.getHostName()), - equalTo(ServerAttributes.SERVER_PORT, httpHost.getPort()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_FULL, httpHost.toURI() + "/_cluster/health"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L)), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L)), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/opentelemetry-api/opentelemetry-api-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/TracerTest.java b/instrumentation/opentelemetry-api/opentelemetry-api-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/TracerTest.java index 404d47131fa6..e954442b338a 100644 --- a/instrumentation/opentelemetry-api/opentelemetry-api-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/TracerTest.java +++ b/instrumentation/opentelemetry-api/opentelemetry-api-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/TracerTest.java @@ -13,6 +13,8 @@ import static io.opentelemetry.api.trace.StatusCode.ERROR; import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanName; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.GlobalOpenTelemetry; @@ -25,7 +27,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ExceptionAttributes; import java.io.PrintWriter; import java.io.StringWriter; import org.junit.jupiter.api.DisplayName; @@ -241,12 +242,8 @@ void captureExceptionWithAttributes() { event .hasName("exception") .hasAttributesSatisfyingExactly( - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - "java.lang.IllegalStateException"), - equalTo( - ExceptionAttributes.EXCEPTION_STACKTRACE, - writer.toString()), + equalTo(EXCEPTION_TYPE, "java.lang.IllegalStateException"), + equalTo(EXCEPTION_STACKTRACE, writer.toString()), equalTo(stringKey("dog"), "bark"))))); } diff --git a/instrumentation/opentelemetry-instrumentation-api/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationapi/ContextBridgeTest.java b/instrumentation/opentelemetry-instrumentation-api/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationapi/ContextBridgeTest.java index 2ebea20102b6..5ec31aa5dc63 100644 --- a/instrumentation/opentelemetry-instrumentation-api/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationapi/ContextBridgeTest.java +++ b/instrumentation/opentelemetry-instrumentation-api/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationapi/ContextBridgeTest.java @@ -6,6 +6,9 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationapi; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -20,8 +23,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.javaagent.instrumentation.testing.AgentSpanTesting; import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.semconv.ErrorAttributes; -import io.opentelemetry.semconv.HttpAttributes; import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.Test; @@ -106,9 +107,9 @@ void testHttpRouteHolder_SameSourceAsServerInstrumentationDoesNotOverrideRoute() .hasKind(SpanKind.SERVER) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_ROUTE, "/test/server/*"), - equalTo(ErrorAttributes.ERROR_TYPE, "_OTHER")))); + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_ROUTE, "/test/server/*"), + equalTo(ERROR_TYPE, "_OTHER")))); } @Test @@ -127,8 +128,8 @@ void testHttpRouteHolder_SourceWithHigherOrderValueOverridesRoute() { .hasKind(SpanKind.SERVER) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_ROUTE, "/test/controller/:id"), - equalTo(ErrorAttributes.ERROR_TYPE, "_OTHER")))); + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_ROUTE, "/test/controller/:id"), + equalTo(ERROR_TYPE, "_OTHER")))); } } diff --git a/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/play24Test/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/client/PlayWsClientTest.java b/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/play24Test/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/client/PlayWsClientTest.java index 191603bb435f..324aff94c794 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/play24Test/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/client/PlayWsClientTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/play24Test/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/client/PlayWsClientTest.java @@ -5,6 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.play.v2_4.client; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; + import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; @@ -12,7 +14,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.NetworkAttributes; import java.net.URI; import java.util.HashSet; import java.util.Map; @@ -86,7 +87,7 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { uri -> { Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); return attributes; }); diff --git a/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/play24Test/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/server/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/play24Test/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/server/PlayServerTest.java index 48a7459c12c2..b4c18d29f6f6 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/play24Test/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/server/PlayServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/play24Test/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/server/PlayServerTest.java @@ -13,6 +13,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; @@ -22,7 +23,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.HttpAttributes; import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -119,7 +119,7 @@ protected void configure(HttpServerTestOptions options) { serverEndpoint -> { Set> attributes = new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(HttpAttributes.HTTP_ROUTE); + attributes.remove(HTTP_ROUTE); return attributes; }); diff --git a/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/server/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/server/PlayServerTest.java index 02ddf42026fd..fe4da606af53 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/server/PlayServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/server/PlayServerTest.java @@ -13,6 +13,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; @@ -22,7 +23,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.HttpAttributes; import java.util.HashSet; import java.util.Set; import org.junit.jupiter.api.extension.RegisterExtension; @@ -104,7 +104,7 @@ protected void configure(HttpServerTestOptions options) { serverEndpoint -> { Set> attributes = new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(HttpAttributes.HTTP_ROUTE); + attributes.remove(HTTP_ROUTE); return attributes; }); diff --git a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWsClientBaseTest.java b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWsClientBaseTest.java index a9288e8be04c..3b028e10beb6 100644 --- a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWsClientBaseTest.java +++ b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWsClientBaseTest.java @@ -5,6 +5,10 @@ package io.opentelemetry.javaagent.instrumentation.playws.v2_1; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; + import akka.actor.ActorSystem; import akka.stream.Materializer; import io.opentelemetry.api.common.AttributeKey; @@ -12,8 +16,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; @@ -78,10 +80,10 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { uri -> { Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); if (uri.toString().endsWith("/circular-redirect")) { - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); } return attributes; }); diff --git a/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayWsClientBaseTest.java b/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayWsClientBaseTest.java index 905e2c44f9e1..58e0b81dd42f 100644 --- a/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayWsClientBaseTest.java +++ b/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayWsClientBaseTest.java @@ -5,6 +5,10 @@ package io.opentelemetry.javaagent.instrumentation.playws; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; + import akka.actor.ActorSystem; import akka.stream.ActorMaterializer; import akka.stream.ActorMaterializerSettings; @@ -13,8 +17,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; @@ -79,10 +81,10 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { uri -> { Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); if (uri.toString().endsWith("/circular-redirect")) { - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); } return attributes; }); diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java index 378638960c63..42ebf260705b 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java @@ -15,6 +15,7 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import io.opentelemetry.api.common.AttributeKey; @@ -24,7 +25,6 @@ import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; @@ -350,7 +350,7 @@ static List sendAttributes( equalTo(SERVER_ADDRESS, brokerHost), equalTo(SERVER_PORT, brokerPort), equalTo(MESSAGING_DESTINATION_NAME, destination), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_OPERATION, "publish"), equalTo(MESSAGING_MESSAGE_ID, messageId), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), equalTo(MESSAGE_TYPE, "normal"))); @@ -388,7 +388,7 @@ static List receiveAttributes( equalTo(SERVER_ADDRESS, brokerHost), equalTo(SERVER_PORT, brokerPort), equalTo(MESSAGING_DESTINATION_NAME, destination), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_OPERATION, "receive"), equalTo(MESSAGING_MESSAGE_ID, messageId), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative))); if (testHeaders) { @@ -415,7 +415,7 @@ static List processAttributes( Arrays.asList( equalTo(MESSAGING_SYSTEM, "pulsar"), equalTo(MESSAGING_DESTINATION_NAME, destination), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_OPERATION, "process"), equalTo(MESSAGING_MESSAGE_ID, messageId), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative))); if (testHeaders) { diff --git a/instrumentation/r2dbc-1.0/javaagent/build.gradle.kts b/instrumentation/r2dbc-1.0/javaagent/build.gradle.kts index 7a652d5bc483..6c80b8f7aa1c 100644 --- a/instrumentation/r2dbc-1.0/javaagent/build.gradle.kts +++ b/instrumentation/r2dbc-1.0/javaagent/build.gradle.kts @@ -30,6 +30,16 @@ dependencies { testInstrumentation(project(":instrumentation:reactor:reactor-3.1:javaagent")) } -tasks.withType().configureEach { - usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) +tasks { + withType().configureEach { + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/r2dbc-1.0/library/build.gradle.kts b/instrumentation/r2dbc-1.0/library/build.gradle.kts index 511b6354abd3..729385252749 100644 --- a/instrumentation/r2dbc-1.0/library/build.gradle.kts +++ b/instrumentation/r2dbc-1.0/library/build.gradle.kts @@ -10,6 +10,16 @@ dependencies { testImplementation(project(":instrumentation:reactor:reactor-3.1:library")) } -tasks.withType().configureEach { - usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) +tasks { + withType().configureEach { + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/r2dbc-1.0/testing/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/AbstractR2dbcStatementTest.java b/instrumentation/r2dbc-1.0/testing/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/AbstractR2dbcStatementTest.java index 465c0e40bef6..16257cb55e95 100644 --- a/instrumentation/r2dbc-1.0/testing/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/AbstractR2dbcStatementTest.java +++ b/instrumentation/r2dbc-1.0/testing/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/AbstractR2dbcStatementTest.java @@ -5,6 +5,8 @@ package io.opentelemetry.instrumentation.r2dbc.v1_0; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; @@ -124,7 +126,7 @@ void startContainer(DbSystemProps props) { } } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @ParameterizedTest(name = "{index}: {0}") @MethodSource("provideParameters") void testQueries(Parameter parameter) { @@ -168,13 +170,15 @@ void testQueries(Parameter parameter) { .hasAttributesSatisfyingExactly( equalTo( DB_CONNECTION_STRING, - parameter.system + "://localhost:" + port), + emitStableDatabaseSemconv() + ? null + : parameter.system + "://localhost:" + port), equalTo(DB_SYSTEM, parameter.system), - equalTo(DB_NAME, DB), - equalTo(DB_USER, USER_DB), - equalTo(DB_STATEMENT, parameter.expectedStatement), - equalTo(DB_OPERATION, parameter.operation), - equalTo(DB_SQL_TABLE, parameter.table), + equalTo(maybeStable(DB_NAME), DB), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB), + equalTo(maybeStable(DB_STATEMENT), parameter.expectedStatement), + equalTo(maybeStable(DB_OPERATION), parameter.operation), + equalTo(maybeStable(DB_SQL_TABLE), parameter.table), equalTo(SERVER_ADDRESS, container.getHost()), equalTo(SERVER_PORT, port)), span -> diff --git a/instrumentation/rabbitmq-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitMqTest.java b/instrumentation/rabbitmq-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitMqTest.java index 79cf7e0e72a9..85f8deafe500 100644 --- a/instrumentation/rabbitmq-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitMqTest.java +++ b/instrumentation/rabbitmq-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/RabbitMqTest.java @@ -8,6 +8,16 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -29,8 +39,6 @@ import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ExceptionAttributes; -import io.opentelemetry.semconv.NetworkAttributes; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.io.FileNotFoundException; import java.io.IOException; @@ -755,9 +763,7 @@ private static void verifySpan( attrs.get(AttributeKey.longKey("rabbitmq.delivery_mode")); assertTrue(deliveryMode == null || deliveryMode == 2); - assertNotNull( - attrs.get( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE)); + assertNotNull(attrs.get(MESSAGING_MESSAGE_BODY_SIZE)); }); }); break; @@ -777,7 +783,7 @@ private static void verifySpan( || queue.equals("some-routing-queue") || queue.startsWith("amq.gen-")); - attrs.get(MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE); + attrs.get(MESSAGING_MESSAGE_BODY_SIZE); }); }); break; @@ -788,7 +794,7 @@ private static void verifySpan( assertThat(attributes) .satisfies( attrs -> { - attrs.get(MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE); + attrs.get(MESSAGING_MESSAGE_BODY_SIZE); }); }); break; @@ -819,14 +825,13 @@ private static void verifySpan( @SuppressWarnings("deprecation") // using deprecated semconv private static void verifyMessagingAttributes( SpanDataAssert span, String exchange, String routingKey, String operation) { - span.hasAttribute(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rabbitmq") + span.hasAttribute(MESSAGING_SYSTEM, "rabbitmq") .hasAttributesSatisfying( attributes -> { assertThat(attributes) .satisfies( attrs -> { - String destinationName = - attrs.get(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME); + String destinationName = attrs.get(MESSAGING_DESTINATION_NAME); assertTrue(destinationName == null || destinationName.equals(exchange)); String routingKeyAttr = attrs.get( @@ -840,7 +845,7 @@ private static void verifyMessagingAttributes( }); if (operation != null && !operation.equals("publish")) { - span.hasAttribute(MessagingIncubatingAttributes.MESSAGING_OPERATION, operation); + span.hasAttribute(MESSAGING_OPERATION, operation); } } @@ -870,13 +875,13 @@ private static void verifyNetAttributes(SpanDataAssert span) { assertThat(attributes) .satisfies( attrs -> { - String peerAddr = attrs.get(NetworkAttributes.NETWORK_PEER_ADDRESS); + String peerAddr = attrs.get(NETWORK_PEER_ADDRESS); assertThat(peerAddr).isIn(rabbitMqIp, null); - String networkType = attrs.get(NetworkAttributes.NETWORK_TYPE); + String networkType = attrs.get(NETWORK_TYPE); assertThat(networkType).isIn("ipv4", "ipv6", null); - assertNotNull(attrs.get(NetworkAttributes.NETWORK_PEER_PORT)); + assertNotNull(attrs.get(NETWORK_PEER_PORT)); }); }); } @@ -888,11 +893,9 @@ private static void verifyException(SpanDataAssert span, Throwable exception, St assertThat(events.get(0)) .hasName("exception") .hasAttributesSatisfying( - equalTo(ExceptionAttributes.EXCEPTION_TYPE, exception.getClass().getName()), - equalTo(ExceptionAttributes.EXCEPTION_MESSAGE, errorMsg), - satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, - val -> val.isInstanceOf(String.class))); + equalTo(EXCEPTION_TYPE, exception.getClass().getName()), + equalTo(EXCEPTION_MESSAGE, errorMsg), + satisfies(EXCEPTION_STACKTRACE, val -> val.isInstanceOf(String.class))); }); } diff --git a/instrumentation/rabbitmq-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/ReactorRabbitMqTest.java b/instrumentation/rabbitmq-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/ReactorRabbitMqTest.java index cf52b5e3a84b..316f9cb23172 100644 --- a/instrumentation/rabbitmq-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/ReactorRabbitMqTest.java +++ b/instrumentation/rabbitmq-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/rabbitmq/ReactorRabbitMqTest.java @@ -6,14 +6,16 @@ package io.opentelemetry.javaagent.instrumentation.rabbitmq; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.junit.jupiter.api.Assertions.assertNotNull; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -43,23 +45,20 @@ void testShouldNotFailDeclaringExchange() { span -> { span.hasName("exchange.declare") .hasKind(SpanKind.CLIENT) - .hasAttribute(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rabbitmq") + .hasAttribute(MESSAGING_SYSTEM, "rabbitmq") .hasAttribute(AttributeKey.stringKey("rabbitmq.command"), "exchange.declare") .hasAttributesSatisfying( attributes -> assertThat(attributes) .satisfies( attrs -> { - String peerAddr = - attrs.get(NetworkAttributes.NETWORK_PEER_ADDRESS); + String peerAddr = attrs.get(NETWORK_PEER_ADDRESS); assertThat(peerAddr).isIn(rabbitMqIp, null); - String networkType = - attrs.get(NetworkAttributes.NETWORK_TYPE); + String networkType = attrs.get(NETWORK_TYPE); assertThat(networkType).isIn("ipv4", "ipv6", null); - assertNotNull( - attrs.get(NetworkAttributes.NETWORK_PEER_PORT)); + assertNotNull(attrs.get(NETWORK_PEER_PORT)); })); })); } diff --git a/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackForkedHttpClientTest.java b/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackForkedHttpClientTest.java index c5e646532ea0..bb5e2be158d7 100644 --- a/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackForkedHttpClientTest.java +++ b/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackForkedHttpClientTest.java @@ -5,11 +5,13 @@ package io.opentelemetry.javaagent.instrumentation.ratpack; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; + import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.ratpack.client.AbstractRatpackForkedHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; -import io.opentelemetry.semconv.ServerAttributes; import java.net.URI; import java.util.HashSet; import java.util.Set; @@ -24,8 +26,8 @@ class RatpackForkedHttpClientTest extends AbstractRatpackForkedHttpClientTest { protected Set> computeHttpAttributes(URI uri) { Set> attributes = new HashSet<>(super.computeHttpAttributes(uri)); // underlying netty instrumentation does not provide these - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); return attributes; } } diff --git a/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackHttpClientTest.java b/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackHttpClientTest.java index c8481f24f7e3..972b2f6676fe 100644 --- a/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackHttpClientTest.java +++ b/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackHttpClientTest.java @@ -5,11 +5,13 @@ package io.opentelemetry.javaagent.instrumentation.ratpack; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; + import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.ratpack.client.AbstractRatpackHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; -import io.opentelemetry.semconv.ServerAttributes; import java.net.URI; import java.util.HashSet; import java.util.Set; @@ -24,8 +26,8 @@ class RatpackHttpClientTest extends AbstractRatpackHttpClientTest { protected Set> computeHttpAttributes(URI uri) { Set> attributes = new HashSet<>(super.computeHttpAttributes(uri)); // underlying netty instrumentation does not provide these - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); return attributes; } } diff --git a/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackPooledHttpClientTest.java b/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackPooledHttpClientTest.java index bfc27b42eb0f..6a5c668b7037 100644 --- a/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackPooledHttpClientTest.java +++ b/instrumentation/ratpack/ratpack-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/ratpack/RatpackPooledHttpClientTest.java @@ -5,11 +5,13 @@ package io.opentelemetry.javaagent.instrumentation.ratpack; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; + import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.ratpack.client.AbstractRatpackPooledHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; -import io.opentelemetry.semconv.ServerAttributes; import java.net.URI; import java.util.HashSet; import java.util.Set; @@ -24,8 +26,8 @@ class RatpackPooledHttpClientTest extends AbstractRatpackPooledHttpClientTest { protected Set> computeHttpAttributes(URI uri) { Set> attributes = new HashSet<>(super.computeHttpAttributes(uri)); // underlying netty instrumentation does not provide these - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); return attributes; } } diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/test/java/io/opentelemetry/instrumentation/ratpack/v1_7/AbstractRatpackHttpClientTest.java b/instrumentation/ratpack/ratpack-1.7/library/src/test/java/io/opentelemetry/instrumentation/ratpack/v1_7/AbstractRatpackHttpClientTest.java index affbe4197c3b..d13cbcc65932 100644 --- a/instrumentation/ratpack/ratpack-1.7/library/src/test/java/io/opentelemetry/instrumentation/ratpack/v1_7/AbstractRatpackHttpClientTest.java +++ b/instrumentation/ratpack/ratpack-1.7/library/src/test/java/io/opentelemetry/instrumentation/ratpack/v1_7/AbstractRatpackHttpClientTest.java @@ -5,6 +5,8 @@ package io.opentelemetry.instrumentation.ratpack.v1_7; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; + import com.google.common.collect.ImmutableList; import io.netty.channel.ConnectTimeoutException; import io.opentelemetry.api.common.AttributeKey; @@ -12,7 +14,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.NetworkAttributes; import java.net.URI; import java.time.Duration; import java.util.HashSet; @@ -158,7 +159,7 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { protected Set> getHttpAttributes(URI uri) { Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); return attributes; } } diff --git a/instrumentation/reactor/reactor-kafka-1.0/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/kafka/v1_0/AbstractReactorKafkaTest.java b/instrumentation/reactor/reactor-kafka-1.0/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/kafka/v1_0/AbstractReactorKafkaTest.java index 246fdaae49dd..e73f8d8d273f 100644 --- a/instrumentation/reactor/reactor-kafka-1.0/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/kafka/v1_0/AbstractReactorKafkaTest.java +++ b/instrumentation/reactor/reactor-kafka-1.0/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/kafka/v1_0/AbstractReactorKafkaTest.java @@ -9,6 +9,15 @@ import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanKind; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static java.util.Arrays.asList; import static java.util.Collections.singleton; @@ -20,7 +29,6 @@ import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.lang.reflect.InvocationTargetException; import java.nio.charset.StandardCharsets; import java.time.Duration; @@ -181,22 +189,17 @@ protected static List sendAttributes(ProducerRecord assertions = new ArrayList<>( asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, record.topic()), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, record.topic()), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("producer")), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), - satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative))); + satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), + satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative))); String messageKey = record.key(); if (messageKey != null) { - assertions.add( - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, messageKey)); + assertions.add(equalTo(MESSAGING_KAFKA_MESSAGE_KEY, messageKey)); } return assertions; } @@ -206,15 +209,15 @@ protected static List receiveAttributes(String topic) { ArrayList assertions = new ArrayList<>( asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, topic), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, topic), + equalTo(MESSAGING_OPERATION, "receive"), satisfies( AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("consumer")), - equalTo(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1))); + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1))); if (Boolean.getBoolean("hasConsumerGroup")) { - assertions.add(equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test")); + assertions.add(equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test")); } return assertions; } @@ -225,20 +228,16 @@ protected static List processAttributes( List assertions = new ArrayList<>( asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, record.topic()), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, record.topic()), + equalTo(MESSAGING_OPERATION, "process"), satisfies( AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("consumer")), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), - satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative))); + satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), + satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative))); if (Boolean.getBoolean("hasConsumerGroup")) { - assertions.add(equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test")); + assertions.add(equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test")); } if (Boolean.getBoolean("otel.instrumentation.kafka.experimental-span-attributes")) { assertions.add( @@ -246,15 +245,13 @@ protected static List processAttributes( } String messageKey = record.key(); if (messageKey != null) { - assertions.add( - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, messageKey)); + assertions.add(equalTo(MESSAGING_KAFKA_MESSAGE_KEY, messageKey)); } String messageValue = record.value(); if (messageValue != null) { assertions.add( equalTo( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - messageValue.getBytes(StandardCharsets.UTF_8).length)); + MESSAGING_MESSAGE_BODY_SIZE, messageValue.getBytes(StandardCharsets.UTF_8).length)); } return assertions; } diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-0.9/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v0_9/AbstractReactorNettyHttpClientTest.java b/instrumentation/reactor/reactor-netty/reactor-netty-0.9/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v0_9/AbstractReactorNettyHttpClientTest.java index bbaf5a20ed73..1285a1c70b59 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-0.9/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v0_9/AbstractReactorNettyHttpClientTest.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-0.9/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v0_9/AbstractReactorNettyHttpClientTest.java @@ -8,6 +8,8 @@ import static io.opentelemetry.api.trace.SpanKind.CLIENT; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; import static io.opentelemetry.api.trace.SpanKind.SERVER; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static java.util.Collections.emptySet; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; @@ -23,7 +25,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ServerAttributes; import java.net.URI; import java.util.HashSet; import java.util.Map; @@ -126,8 +127,8 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); return attributes; }); } diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-0.9/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v0_9/ReactorNettyConnectionSpanTest.java b/instrumentation/reactor/reactor-netty/reactor-netty-0.9/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v0_9/ReactorNettyConnectionSpanTest.java index 4a1bf05b125a..d6789865c1ee 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-0.9/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v0_9/ReactorNettyConnectionSpanTest.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-0.9/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v0_9/ReactorNettyConnectionSpanTest.java @@ -10,6 +10,12 @@ import static io.opentelemetry.api.trace.SpanKind.SERVER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TRANSPORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; @@ -18,8 +24,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestServer; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; import org.assertj.core.api.AbstractLongAssert; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -77,21 +81,19 @@ void testSuccessfulRequest() { .hasKind(INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.httpPort())), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.httpPort())), span -> span.hasName("CONNECT") .hasKind(INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.httpPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative)), + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.httpPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)), span -> span.hasName("GET").hasKind(CLIENT).hasParent(trace.getSpan(0)), span -> span.hasName("test-http-server").hasKind(SERVER).hasParent(trace.getSpan(3)))); @@ -137,8 +139,8 @@ void testFailingRequest() { .hasKind(INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, PortUtils.UNUSABLE_PORT)), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, PortUtils.UNUSABLE_PORT)), span -> span.hasName("CONNECT") .hasKind(INTERNAL) @@ -146,16 +148,13 @@ void testFailingRequest() { .hasStatus(StatusData.error()) .hasException(connectException) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - satisfies( - NetworkAttributes.NETWORK_TYPE, val -> val.isIn(null, "ipv4")), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, PortUtils.UNUSABLE_PORT), - satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, - val -> val.isIn(null, "127.0.0.1")), + equalTo(NETWORK_TRANSPORT, "tcp"), + satisfies(NETWORK_TYPE, val -> val.isIn(null, "ipv4")), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, PortUtils.UNUSABLE_PORT), + satisfies(NETWORK_PEER_ADDRESS, val -> val.isIn(null, "127.0.0.1")), satisfies( - NetworkAttributes.NETWORK_PEER_PORT, + NETWORK_PEER_PORT, val -> val.isIn(null, (long) PortUtils.UNUSABLE_PORT))))); } } diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/AbstractReactorNettyHttpClientTest.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/AbstractReactorNettyHttpClientTest.java index 9b2e4a5c67f5..eeaf01d24c6c 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/AbstractReactorNettyHttpClientTest.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/AbstractReactorNettyHttpClientTest.java @@ -10,6 +10,12 @@ import static io.opentelemetry.api.trace.SpanKind.SERVER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static org.assertj.core.api.Assertions.catchThrowable; import io.netty.handler.codec.http.HttpMethod; @@ -26,11 +32,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ErrorAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import java.net.InetSocketAddress; import java.net.URI; import java.time.Duration; @@ -136,13 +137,13 @@ protected Set> getHttpAttributes(URI uri) { // unopened port or non routable address if ("http://localhost:61/".equals(uri.toString()) || "https://192.0.2.1/".equals(uri.toString())) { - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); } if (uri.toString().contains("/read-timeout")) { - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(NETWORK_PROTOCOL_VERSION); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); } return attributes; } @@ -310,11 +311,11 @@ void shouldEndSpanOnMonoTimeout() { .hasKind(CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_FULL, uri.toString()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort()), - equalTo(ErrorAttributes.ERROR_TYPE, "cancelled")), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_FULL, uri.toString()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, uri.getPort()), + equalTo(ERROR_TYPE, "cancelled")), span -> span.hasName("test-http-server") .hasKind(SpanKind.SERVER) diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyBaseUrlOnlyTest.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyBaseUrlOnlyTest.java index cced686ae905..d3585128b12c 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyBaseUrlOnlyTest.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyBaseUrlOnlyTest.java @@ -11,6 +11,14 @@ import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.AbstractReactorNettyHttpClientTest.USER_AGENT; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.GlobalOpenTelemetry; @@ -19,10 +27,6 @@ import io.opentelemetry.instrumentation.test.server.http.RequestContextGetter; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import io.opentelemetry.testing.internal.armeria.common.HttpData; import io.opentelemetry.testing.internal.armeria.common.HttpResponse; import io.opentelemetry.testing.internal.armeria.common.HttpStatus; @@ -111,16 +115,14 @@ void testSuccessfulRequest() { .hasKind(CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_FULL, uri + "/"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.httpPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative)), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_FULL, uri + "/"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.httpPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)), span -> span.hasName("test-http-server").hasKind(SERVER).hasParent(trace.getSpan(1)))); } diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyClientSslTest.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyClientSslTest.java index 0d89311e213e..1083e860b29a 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyClientSslTest.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyClientSslTest.java @@ -12,6 +12,20 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TRANSPORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static org.assertj.core.api.Assertions.catchThrowable; import io.netty.handler.ssl.SslContextBuilder; @@ -20,12 +34,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestServer; import io.opentelemetry.sdk.trace.data.EventData; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ErrorAttributes; -import io.opentelemetry.semconv.ExceptionAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import java.util.List; import javax.annotation.Nullable; import javax.net.ssl.SSLException; @@ -94,33 +102,29 @@ void shouldFailSslHandshake() throws SSLException { // message .hasEventsSatisfying(ReactorNettyClientSslTest::isSslHandshakeException) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_FULL, uri), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.httpsPort()), - equalTo( - ErrorAttributes.ERROR_TYPE, - SSLHandshakeException.class.getCanonicalName())), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_FULL, uri), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.httpsPort()), + equalTo(ERROR_TYPE, SSLHandshakeException.class.getCanonicalName())), span -> span.hasName("RESOLVE") .hasKind(INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.httpsPort())), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.httpsPort())), span -> span.hasName("CONNECT") .hasKind(INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.httpsPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative)), + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.httpsPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)), span -> span.hasName("SSL handshake") .hasKind(INTERNAL) @@ -130,10 +134,10 @@ void shouldFailSslHandshake() throws SSLException { // message .hasEventsSatisfying(ReactorNettyClientSslTest::isSslHandshakeException) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, server.httpsPort())))); + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + equalTo(NETWORK_PEER_PORT, server.httpsPort())))); } @Test @@ -163,45 +167,41 @@ void shouldSuccessfullyEstablishSslHandshake() throws SSLException { .hasKind(INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.httpsPort())), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.httpsPort())), span -> span.hasName("CONNECT") .hasKind(INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.httpsPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative)), + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.httpsPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)), span -> span.hasName("SSL handshake") .hasKind(INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, server.httpsPort())), + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + equalTo(NETWORK_PEER_PORT, server.httpsPort())), span -> span.hasName("GET") .hasKind(CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_FULL, uri), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.httpsPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative)), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_FULL, uri), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.httpsPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)), span -> span.hasName("test-http-server").hasKind(SERVER).hasParent(trace.getSpan(4)))); } @@ -227,10 +227,8 @@ private static void isSslHandshakeException(List events) { event -> assertThat(event) .hasAttributesSatisfyingExactly( - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - SSLHandshakeException.class.getCanonicalName()), - satisfies(ExceptionAttributes.EXCEPTION_MESSAGE, s -> s.isNotEmpty()), - satisfies(ExceptionAttributes.EXCEPTION_STACKTRACE, s -> s.isNotEmpty()))); + equalTo(EXCEPTION_TYPE, SSLHandshakeException.class.getCanonicalName()), + satisfies(EXCEPTION_MESSAGE, s -> s.isNotEmpty()), + satisfies(EXCEPTION_STACKTRACE, s -> s.isNotEmpty()))); } } diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyConnectionSpanTest.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyConnectionSpanTest.java index ce040d4b50ee..84c9e16ad67e 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyConnectionSpanTest.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyConnectionSpanTest.java @@ -11,6 +11,17 @@ import static io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0.AbstractReactorNettyHttpClientTest.USER_AGENT; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TRANSPORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; @@ -19,11 +30,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestServer; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ErrorAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import org.assertj.core.api.AbstractLongAssert; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -82,36 +88,32 @@ void testSuccessfulRequest() { .hasKind(INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.httpPort())), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.httpPort())), span -> span.hasName("CONNECT") .hasKind(INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.httpPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative)), + equalTo(NETWORK_TRANSPORT, "tcp"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.httpPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)), span -> span.hasName("GET") .hasKind(CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_FULL, uri), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, server.httpPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative)), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_FULL, uri), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.httpPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)), span -> span.hasName("test-http-server").hasKind(SERVER).hasParent(trace.getSpan(3)))); } @@ -158,19 +160,18 @@ void testFailingRequest() { .hasStatus(StatusData.error()) .hasException(connectException) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_FULL, uri), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, PortUtils.UNUSABLE_PORT), - equalTo( - ErrorAttributes.ERROR_TYPE, connectException.getClass().getName())), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_FULL, uri), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, PortUtils.UNUSABLE_PORT), + equalTo(ERROR_TYPE, connectException.getClass().getName())), span -> span.hasName("RESOLVE") .hasKind(INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, PortUtils.UNUSABLE_PORT)), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, PortUtils.UNUSABLE_PORT)), span -> span.hasName("CONNECT") .hasKind(INTERNAL) @@ -178,10 +179,8 @@ void testFailingRequest() { .hasStatus(StatusData.error()) .hasException(connectException) .hasAttributesSatisfyingExactly( - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, PortUtils.UNUSABLE_PORT), - satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, - val -> val.isIn(null, "127.0.0.1"))))); + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, PortUtils.UNUSABLE_PORT), + satisfies(NETWORK_PEER_ADDRESS, val -> val.isIn(null, "127.0.0.1"))))); } } diff --git a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientTest.java b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientTest.java index e4b3a090572c..ea6e5244854c 100644 --- a/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientTest.java +++ b/instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/reactornetty/v1_0/ReactorNettyHttpClientTest.java @@ -5,10 +5,12 @@ package io.opentelemetry.javaagent.instrumentation.reactornetty.v1_0; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; + import io.netty.channel.ChannelOption; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.testing.internal.armeria.common.HttpHeaderNames; import java.net.URI; import java.util.HashSet; @@ -61,8 +63,8 @@ protected Set> getHttpAttributes(URI uri) { // net.peer.sock.* attributes Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); return attributes; } return super.getHttpAttributes(uri); diff --git a/instrumentation/rediscala-1.8/javaagent/build.gradle.kts b/instrumentation/rediscala-1.8/javaagent/build.gradle.kts index 8442cb3dbf1b..f790124dd665 100644 --- a/instrumentation/rediscala-1.8/javaagent/build.gradle.kts +++ b/instrumentation/rediscala-1.8/javaagent/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("otel.javaagent-instrumentation") + id("otel.scala-conventions") } muzzle { diff --git a/instrumentation/rediscala-1.8/javaagent/src/test/groovy/RediscalaClientTest.groovy b/instrumentation/rediscala-1.8/javaagent/src/test/groovy/RediscalaClientTest.groovy deleted file mode 100644 index 5f6e10ab0acc..000000000000 --- a/instrumentation/rediscala-1.8/javaagent/src/test/groovy/RediscalaClientTest.groovy +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes -import org.testcontainers.containers.GenericContainer -import redis.ByteStringDeserializerDefault -import redis.ByteStringSerializerLowPriority -import redis.RedisClient -import redis.RedisDispatcher -import scala.Option -import scala.concurrent.Await -import scala.concurrent.duration.Duration -import spock.lang.Shared - -import static io.opentelemetry.api.trace.SpanKind.CLIENT - -class RediscalaClientTest extends AgentInstrumentationSpecification { - - private static GenericContainer redisServer = new GenericContainer<>("redis:6.2.3-alpine").withExposedPorts(6379) - - @Shared - int port - - @Shared - def system - - @Shared - RedisClient redisClient - - def setupSpec() { - redisServer.start() - String host = redisServer.getHost() - port = redisServer.getMappedPort(6379) - // latest has separate artifacts for akka an pekko, currently latestDepTestLibrary picks the - // pekko one - try { - def clazz = Class.forName("akka.actor.ActorSystem") - system = clazz.getMethod("create").invoke(null) - } catch (ClassNotFoundException exception) { - def clazz = Class.forName("org.apache.pekko.actor.ActorSystem") - system = clazz.getMethod("create").invoke(null) - } - // latest RedisClient constructor takes username as argument - if (RedisClient.metaClass.getMetaMethod("username") != null) { - redisClient = new RedisClient(host, - port, - Option.apply(null), - Option.apply(null), - Option.apply(null), - "RedisClient", - Option.apply(null), - system, - new RedisDispatcher("rediscala.rediscala-client-worker-dispatcher")) - } else { - redisClient = new RedisClient(host, - port, - Option.apply(null), - Option.apply(null), - "RedisClient", - Option.apply(null), - system, - new RedisDispatcher("rediscala.rediscala-client-worker-dispatcher")) - } - } - - def cleanupSpec() { - redisServer.stop() - system?.terminate() - } - - def "set command"() { - when: - def value = redisClient.set("foo", - "bar", - Option.apply(null), - Option.apply(null), - false, - false, - new ByteStringSerializerLowPriority.String$()) - - - then: - Await.result(value, Duration.apply("3 second")) == true - assertTraces(1) { - trace(0, 1) { - span(0) { - name "SET" - kind CLIENT - attributes { - "$DbIncubatingAttributes.DB_SYSTEM" "redis" - "$DbIncubatingAttributes.DB_OPERATION" "SET" - } - } - } - } - } - - def "get command"() { - when: - def (write, value) = runWithSpan("parent") { - def w = redisClient.set("bar", - "baz", - Option.apply(null), - Option.apply(null), - false, - false, - new ByteStringSerializerLowPriority.String$()) - def v = redisClient.get("bar", new ByteStringDeserializerDefault.String$()) - return new Tuple(w, v) - } - - then: - Await.result(write, Duration.apply("3 second")) == true - Await.result(value, Duration.apply("3 second")) == Option.apply("baz") - assertTraces(1) { - trace(0, 3) { - span(0) { - name "parent" - } - span(1) { - name "SET" - kind CLIENT - childOf span(0) - attributes { - "$DbIncubatingAttributes.DB_SYSTEM" "redis" - "$DbIncubatingAttributes.DB_OPERATION" "SET" - } - } - span(2) { - name "GET" - kind CLIENT - childOf span(0) - attributes { - "$DbIncubatingAttributes.DB_SYSTEM" "redis" - "$DbIncubatingAttributes.DB_OPERATION" "GET" - } - } - } - } - } -} diff --git a/instrumentation/rediscala-1.8/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/rediscala/RediscalaClientTest.scala b/instrumentation/rediscala-1.8/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/rediscala/RediscalaClientTest.scala new file mode 100644 index 000000000000..34292a6d60c5 --- /dev/null +++ b/instrumentation/rediscala-1.8/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/rediscala/RediscalaClientTest.scala @@ -0,0 +1,189 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package rediscala + +import io.opentelemetry.api.trace.SpanKind.CLIENT +import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension +import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier +import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo +import io.opentelemetry.sdk.testing.assertj.{SpanDataAssert, TraceAssert} +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DbSystemIncubatingValues.REDIS +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.{AfterAll, BeforeAll, Test, TestInstance} +import org.junit.jupiter.api.extension.RegisterExtension +import org.testcontainers.containers.GenericContainer +import redis.{RedisClient, RedisDispatcher} + +import java.util.function.Consumer +import scala.concurrent.duration.Duration +import scala.concurrent.{Await, Future} + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +class RediscalaClientTest { + + @RegisterExtension val testing = AgentInstrumentationExtension.create + + var system: Object = null + var redisServer: GenericContainer[_] = null + var redisClient: RedisClient = null + + @BeforeAll + def setUp(): Unit = { + redisServer = + new GenericContainer("redis:6.2.3-alpine").withExposedPorts(6379) + redisServer.start() + + val host: String = redisServer.getHost + val port: Integer = redisServer.getMappedPort(6379) + + try { + val clazz = Class.forName("akka.actor.ActorSystem") + system = clazz.getMethod("create").invoke(null) + } catch { + case _: ClassNotFoundException => + val clazz = Class.forName("org.apache.pekko.actor.ActorSystem") + system = clazz.getMethod("create").invoke(null) + } + + try { + // latest RedisClient constructor takes username as argument + classOf[RedisClient].getMethod("username") + redisClient = classOf[RedisClient] + .getConstructors()(0) + .newInstance( + host, + port, + Option.apply(null), + Option.apply(null), + Option.apply(null), + "RedisClient", + Option.apply(null), + system, + RedisDispatcher("rediscala.rediscala-client-worker-dispatcher") + ) + .asInstanceOf[RedisClient] + } catch { + case _: Exception => + redisClient = classOf[RedisClient] + .getConstructors()(0) + .newInstance( + host, + port, + Option.apply(null), + Option.apply(null), + "RedisClient", + Option.apply(null), + system, + RedisDispatcher("rediscala.rediscala-client-worker-dispatcher") + ) + .asInstanceOf[RedisClient] + } + } + + @AfterAll + def tearDown(): Unit = { + if (system != null) { + system.getClass.getMethod("terminate").invoke(system) + } + redisServer.stop() + } + + @Test def testSetCommand(): Unit = { + val value = testing.runWithSpan( + "parent", + new ThrowingSupplier[Future[Boolean], Exception] { + override def get(): Future[Boolean] = { + redisClient.set("foo", "bar") + } + } + ) + + assertThat(Await.result(value, Duration.apply("3 second"))).isTrue + testing.waitAndAssertTraces(new Consumer[TraceAssert] { + override def accept(trace: TraceAssert): Unit = + trace.hasSpansSatisfyingExactly( + new Consumer[SpanDataAssert] { + override def accept(span: SpanDataAssert): Unit = { + span.hasName("parent").hasNoParent + } + }, + new Consumer[SpanDataAssert] { + override def accept(span: SpanDataAssert): Unit = { + span + .hasName("SET") + .hasKind(CLIENT) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly( + equalTo(DB_SYSTEM, REDIS), + equalTo(SemconvStabilityUtil.maybeStable(DB_OPERATION), "SET") + ) + } + } + ) + }) + } + + @Test def testGetCommand(): Unit = { + val (write, value) = testing.runWithSpan( + "parent", + new ThrowingSupplier[ + (Future[Boolean], Future[Option[String]]), + Exception + ] { + override def get(): (Future[Boolean], Future[Option[String]]) = { + val write = redisClient.set("bar", "baz") + val value = redisClient.get[String]("bar") + (write, value) + } + } + ) + + assertThat(Await.result(write, Duration.apply("3 second"))).isTrue + assertThat( + Await + .result(value, Duration.apply("3 second")) + .get + ).isEqualTo("baz") + + testing.waitAndAssertTraces(new Consumer[TraceAssert] { + override def accept(trace: TraceAssert): Unit = + trace.hasSpansSatisfyingExactly( + new Consumer[SpanDataAssert] { + override def accept(span: SpanDataAssert): Unit = { + span.hasName("parent").hasNoParent + } + }, + new Consumer[SpanDataAssert] { + override def accept(span: SpanDataAssert): Unit = { + span + .hasName("SET") + .hasKind(CLIENT) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly( + equalTo(DB_SYSTEM, REDIS), + equalTo(SemconvStabilityUtil.maybeStable(DB_OPERATION), "SET") + ) + } + }, + new Consumer[SpanDataAssert] { + override def accept(span: SpanDataAssert): Unit = { + span + .hasName("GET") + .hasKind(CLIENT) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly( + equalTo(DB_SYSTEM, REDIS), + equalTo(SemconvStabilityUtil.maybeStable(DB_OPERATION), "GET") + ) + } + } + ) + }) + } +} diff --git a/instrumentation/redisson/redisson-3.17/javaagent/build.gradle.kts b/instrumentation/redisson/redisson-3.17/javaagent/build.gradle.kts index 6e255116700d..3eabc34c913b 100644 --- a/instrumentation/redisson/redisson-3.17/javaagent/build.gradle.kts +++ b/instrumentation/redisson/redisson-3.17/javaagent/build.gradle.kts @@ -25,15 +25,15 @@ dependencies { } tasks { - val testStableSemconv by registering(Test::class) { - jvmArgs("-Dotel.semconv-stability.opt-in=database") - } - withType().configureEach { systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + check { dependsOn(testStableSemconv) } diff --git a/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonAsyncClientTest.java b/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonAsyncClientTest.java index 2a0936aee1de..219884a0415f 100644 --- a/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonAsyncClientTest.java +++ b/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonAsyncClientTest.java @@ -7,18 +7,22 @@ import static io.opentelemetry.api.trace.SpanKind.CLIENT; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanKind; import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanName; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.net.InetAddress; @@ -117,18 +121,12 @@ void futureSet() throws ExecutionException, InterruptedException, TimeoutExcepti span.hasName("SET") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "SET foo ?"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "SET")))); + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET foo ?"), + equalTo(maybeStable(DB_OPERATION), "SET")))); } @Test @@ -156,18 +154,12 @@ void futureWhenComplete() throws ExecutionException, InterruptedException, Timeo span.hasName("SADD") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "SADD set1 ?"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "SADD")) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SADD set1 ?"), + equalTo(maybeStable(DB_OPERATION), "SADD")) .hasParent(trace.getSpan(0)), span -> span.hasName("callback").hasKind(INTERNAL).hasParent(trace.getSpan(0)))); } @@ -236,48 +228,33 @@ void atomicBatchCommand() throws ExecutionException, InterruptedException, Timeo span.hasName("DB Query") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "MULTI;SET batch1 ?")) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "MULTI;SET batch1 ?")) .hasParent(trace.getSpan(0)), span -> span.hasName("SET") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "SET batch2 ?"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "SET")) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET batch2 ?"), + equalTo(maybeStable(DB_OPERATION), "SET")) .hasParent(trace.getSpan(0)), span -> span.hasName("EXEC") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "EXEC"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "EXEC")) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "EXEC"), + equalTo(maybeStable(DB_OPERATION), "EXEC")) .hasParent(trace.getSpan(0)), span -> span.hasName("callback").hasKind(INTERNAL).hasParent(trace.getSpan(0)))); } diff --git a/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonClientTest.java b/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonClientTest.java index 0c9278a6cde2..81360d8edb1c 100644 --- a/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonClientTest.java +++ b/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonClientTest.java @@ -7,19 +7,23 @@ import static io.opentelemetry.api.trace.SpanKind.CLIENT; import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanKind; import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanName; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; import io.opentelemetry.sdk.testing.assertj.TraceAssert; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.lang.reflect.InvocationTargetException; import java.net.InetAddress; import java.net.UnknownHostException; @@ -120,36 +124,24 @@ void stringCommand() { span.hasName("SET") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "SET foo ?"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "SET"))), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET foo ?"), + equalTo(maybeStable(DB_OPERATION), "SET"))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("GET") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "GET foo"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "GET")))); + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "GET foo"), + equalTo(maybeStable(DB_OPERATION), "GET")))); } @Test @@ -170,14 +162,11 @@ void batchCommand() span.hasName("DB Query") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "SET batch1 ?;SET batch2 ?")))); + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET batch1 ?;SET batch2 ?")))); } private static void invokeExecute(RBatch batch) @@ -213,48 +202,33 @@ void atomicBatchCommand() { span.hasName("DB Query") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "MULTI;SET batch1 ?")) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "MULTI;SET batch1 ?")) .hasParent(trace.getSpan(0)), span -> span.hasName("SET") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "SET batch2 ?"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "SET")) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SET batch2 ?"), + equalTo(maybeStable(DB_OPERATION), "SET")) .hasParent(trace.getSpan(0)), span -> span.hasName("EXEC") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "EXEC"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "EXEC")) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "EXEC"), + equalTo(maybeStable(DB_OPERATION), "EXEC")) .hasParent(trace.getSpan(0)))); } @@ -271,18 +245,12 @@ void listCommand() { span.hasName("RPUSH") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "RPUSH list1 ?"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "RPUSH")) + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "RPUSH list1 ?"), + equalTo(maybeStable(DB_OPERATION), "RPUSH")) .hasNoParent())); } @@ -302,36 +270,26 @@ void hashCommand() { span.hasName("EVAL") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), + maybeStable(DB_STATEMENT), String.format("EVAL %s 1 map1 ? ?", script)), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "EVAL"))), + equalTo(maybeStable(DB_OPERATION), "EVAL"))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("HGET") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "HGET map1 key1"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "HGET")))); + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "HGET map1 key1"), + equalTo(maybeStable(DB_OPERATION), "HGET")))); } @Test @@ -347,18 +305,12 @@ void setCommand() { span.hasName("SADD") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "SADD set1 ?"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "SADD")))); + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "SADD set1 ?"), + equalTo(maybeStable(DB_OPERATION), "SADD")))); } @Test @@ -381,18 +333,12 @@ void sortedSetCommand() span.hasName("ZADD") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "ZADD sort_set1 ? ? ? ? ? ?"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "ZADD")))); + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "ZADD sort_set1 ? ? ? ? ? ?"), + equalTo(maybeStable(DB_OPERATION), "ZADD")))); } private static void invokeAddAll(RScoredSortedSet object, Map arg) @@ -413,18 +359,12 @@ void atomicLongCommand() { span.hasName("INCR") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), - "INCR AtomicLong"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "INCR")))); + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_STATEMENT), "INCR AtomicLong"), + equalTo(maybeStable(DB_OPERATION), "INCR")))); } @Test @@ -445,17 +385,13 @@ void lockCommand() { span.hasName("EVAL") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "EVAL"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "EVAL"), satisfies( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), + maybeStable(DB_STATEMENT), stringAssert -> stringAssert.startsWith("EVAL"))))); traceAsserts.add( trace -> @@ -464,17 +400,13 @@ void lockCommand() { span.hasName("EVAL") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "EVAL"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "EVAL"), satisfies( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), + maybeStable(DB_STATEMENT), stringAssert -> stringAssert.startsWith("EVAL"))))); if (lockHas3Traces()) { traceAsserts.add( @@ -484,17 +416,13 @@ void lockCommand() { span.hasName("DEL") .hasKind(CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_OPERATION), - "DEL"), + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + equalTo(NETWORK_PEER_PORT, (long) port), + equalTo(DB_SYSTEM, "redis"), + equalTo(maybeStable(DB_OPERATION), "DEL"), satisfies( - SemconvStabilityUtil.getAttributeKey( - DbIncubatingAttributes.DB_STATEMENT), + maybeStable(DB_STATEMENT), stringAssert -> stringAssert.startsWith("DEL"))))); } diff --git a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/MainJarPathFinder.java b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/MainJarPathFinder.java index 8f9b9287ac68..c0c7588698f2 100644 --- a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/MainJarPathFinder.java +++ b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/MainJarPathFinder.java @@ -44,9 +44,14 @@ Path detectJarPath() { @Nullable private Path getJarPathFromProcessHandle() { String[] javaArgs = getProcessHandleArguments.get(); - for (int i = 0; i < javaArgs.length; ++i) { - if ("-jar".equals(javaArgs[i]) && (i < javaArgs.length - 1)) { - return Paths.get(javaArgs[i + 1]); + boolean jarOptionFound = false; + for (String javaArg : javaArgs) { + if ("-jar".equals(javaArg)) { + jarOptionFound = true; + } else if (jarOptionFound + && !javaArg.startsWith( + "-")) { // flags can appear between -jar and the jar path, ignore them + return Paths.get(javaArg); } } return null; diff --git a/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/JarServiceNameDetectorTest.java b/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/JarServiceNameDetectorTest.java index bcb0ff2c631d..36ff088695bb 100644 --- a/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/JarServiceNameDetectorTest.java +++ b/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/JarServiceNameDetectorTest.java @@ -6,11 +6,11 @@ package io.opentelemetry.instrumentation.resources; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; +import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_NAME; import static org.junit.jupiter.params.provider.Arguments.arguments; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.resources.Resource; -import io.opentelemetry.semconv.ServiceAttributes; import java.nio.file.Path; import java.nio.file.Paths; import java.util.function.Function; @@ -68,9 +68,21 @@ void createResource_processHandleJar() { Resource resource = serviceNameProvider.createResource(config); - assertThat(resource.getAttributes()) - .hasSize(1) - .containsEntry(ServiceAttributes.SERVICE_NAME, "my-service"); + assertThat(resource.getAttributes()).hasSize(1).containsEntry(SERVICE_NAME, "my-service"); + } + + @Test + void createResource_processHandleJarExtraFlag() { + String path = Paths.get("path", "to", "app", "my-service.jar").toString(); + JarServiceNameDetector serviceNameProvider = + getDetector( + new String[] {"-Dtest=42", "-jar", "-Xmx512m", path, "abc", "def"}, + prop -> null, + JarServiceNameDetectorTest::failPath); + + Resource resource = serviceNameProvider.createResource(config); + + assertThat(resource.getAttributes()).hasSize(1).containsEntry(SERVICE_NAME, "my-service"); } @Test @@ -80,9 +92,7 @@ void createResource_processHandleJarWithoutExtension() { Resource resource = serviceNameProvider.createResource(config); - assertThat(resource.getAttributes()) - .hasSize(1) - .containsEntry(ServiceAttributes.SERVICE_NAME, "my-service"); + assertThat(resource.getAttributes()).hasSize(1).containsEntry(SERVICE_NAME, "my-service"); } static String[] getArgs(String jarName) { @@ -102,9 +112,7 @@ void createResource_sunCommandLine(String commandLine, Path jarPath) { Resource resource = serviceNameProvider.createResource(config); - assertThat(resource.getAttributes()) - .hasSize(1) - .containsEntry(ServiceAttributes.SERVICE_NAME, "my-service"); + assertThat(resource.getAttributes()).hasSize(1).containsEntry(SERVICE_NAME, "my-service"); } // regression test for diff --git a/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/ManifestResourceProviderTest.java b/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/ManifestResourceProviderTest.java index c617f58a6dbc..e34768d344bc 100644 --- a/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/ManifestResourceProviderTest.java +++ b/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/ManifestResourceProviderTest.java @@ -5,13 +5,14 @@ package io.opentelemetry.instrumentation.resources; +import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_NAME; +import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_VERSION; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; import io.opentelemetry.sdk.resources.Resource; -import io.opentelemetry.semconv.ServiceAttributes; import java.io.InputStream; import java.util.Collection; import java.util.Collections; @@ -68,7 +69,7 @@ Collection createResource() { null, "0.0.1-SNAPSHOT", openClasspathResource("MANIFEST.MF"), - Resource.create(Attributes.of(ServiceAttributes.SERVICE_NAME, "old")))) + Resource.create(Attributes.of(SERVICE_NAME, "old")))) .map( t -> DynamicTest.dynamicTest( @@ -92,9 +93,8 @@ Collection createResource() { provider.shouldApply(config, t.existing); Resource resource = provider.createResource(config); - assertThat(resource.getAttribute(ServiceAttributes.SERVICE_NAME)) - .isEqualTo(t.expectedName); - assertThat(resource.getAttribute(ServiceAttributes.SERVICE_VERSION)) + assertThat(resource.getAttribute(SERVICE_NAME)).isEqualTo(t.expectedName); + assertThat(resource.getAttribute(SERVICE_VERSION)) .isEqualTo(t.expectedVersion); })) .collect(Collectors.toList()); 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 02b4f27a360d..c6dfe036c25b 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 @@ -24,7 +24,7 @@ class DeclarativeConfigTest { @Test void endToEnd() { String yaml = - "file_format: 0.1\n" + "file_format: 0.3\n" + "resource:\n" + " attributes:\n" + " - name: service.name\n" diff --git a/instrumentation/rmi/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/rmi/RmiTest.java b/instrumentation/rmi/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/rmi/RmiTest.java index f604e9df0382..3ea0b017985a 100644 --- a/instrumentation/rmi/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/rmi/RmiTest.java +++ b/instrumentation/rmi/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/rmi/RmiTest.java @@ -8,6 +8,12 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import static org.assertj.core.api.Assertions.catchThrowableOfType; import io.opentelemetry.api.trace.SpanId; @@ -15,8 +21,6 @@ import io.opentelemetry.instrumentation.test.utils.PortUtils; import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; -import io.opentelemetry.semconv.ExceptionAttributes; -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; @@ -82,17 +86,17 @@ void clientCallCreatesSpans() throws Exception { .hasKind(SpanKind.CLIENT) .hasParentSpanId(trace.get(0).getSpanId()) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "java_rmi"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "rmi.app.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "hello")), + equalTo(RPC_SYSTEM, "java_rmi"), + equalTo(RPC_SERVICE, "rmi.app.Greeter"), + equalTo(RPC_METHOD, "hello")), span -> assertThat(span) .hasName("rmi.app.Server/hello") .hasKind(SpanKind.SERVER) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "java_rmi"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "rmi.app.Server"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "hello")))); + equalTo(RPC_SYSTEM, "java_rmi"), + equalTo(RPC_SERVICE, "rmi.app.Server"), + equalTo(RPC_METHOD, "hello")))); } @Test @@ -149,18 +153,16 @@ void serviceThrownException() throws Exception { .hasName("exception") .hasAttributesSatisfyingExactly( equalTo( - ExceptionAttributes.EXCEPTION_TYPE, + EXCEPTION_TYPE, thrown.getClass().getCanonicalName()), - equalTo( - ExceptionAttributes.EXCEPTION_MESSAGE, - thrown.getMessage()), + equalTo(EXCEPTION_MESSAGE, thrown.getMessage()), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, + EXCEPTION_STACKTRACE, AbstractAssert::isNotNull))) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "java_rmi"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "rmi.app.Greeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "exceptional")), + equalTo(RPC_SYSTEM, "java_rmi"), + equalTo(RPC_SERVICE, "rmi.app.Greeter"), + equalTo(RPC_METHOD, "exceptional")), span -> assertThat(span) .hasName("rmi.app.Server/exceptional") @@ -171,17 +173,15 @@ void serviceThrownException() throws Exception { .hasName("exception") .hasAttributesSatisfyingExactly( equalTo( - ExceptionAttributes.EXCEPTION_TYPE, + EXCEPTION_TYPE, thrown.getClass().getCanonicalName()), - equalTo( - ExceptionAttributes.EXCEPTION_MESSAGE, - thrown.getMessage()), + equalTo(EXCEPTION_MESSAGE, thrown.getMessage()), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, + EXCEPTION_STACKTRACE, AbstractAssert::isNotNull))) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "java_rmi"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "rmi.app.Server"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "exceptional")))); + equalTo(RPC_SYSTEM, "java_rmi"), + equalTo(RPC_SERVICE, "rmi.app.Server"), + equalTo(RPC_METHOD, "exceptional")))); } } diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v4_8/AbstractRocketMqClientTest.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v4_8/AbstractRocketMqClientTest.java index a2307762cca2..8530f54adba7 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v4_8/AbstractRocketMqClientTest.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v4_8/AbstractRocketMqClientTest.java @@ -7,6 +7,12 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TAG; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -17,7 +23,6 @@ import io.opentelemetry.instrumentation.rocketmqclient.v4_8.base.BaseConf; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.trace.data.LinkData; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; @@ -139,18 +144,12 @@ public void onException(Throwable throwable) { span.hasName(sharedTopic + " publish") .hasKind(SpanKind.PRODUCER) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rocketmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - sharedTopic), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "rocketmq"), + equalTo(MESSAGING_DESTINATION_NAME, sharedTopic), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TAG, - "TagA"), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, "TagA"), satisfies( AttributeKey.stringKey("messaging.rocketmq.broker_address"), val -> val.isInstanceOf(String.class)), @@ -162,21 +161,15 @@ public void onException(Throwable throwable) { .hasKind(SpanKind.CONSUMER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rocketmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - sharedTopic), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "rocketmq"), + equalTo(MESSAGING_DESTINATION_NAME, sharedTopic), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, + MESSAGING_MESSAGE_BODY_SIZE, val -> val.isInstanceOf(Long.class)), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TAG, - "TagA"), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, "TagA"), satisfies( AttributeKey.stringKey("messaging.rocketmq.broker_address"), val -> val.isInstanceOf(String.class)), @@ -215,18 +208,12 @@ void testRocketmqProduceAndConsume() throws Exception { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rocketmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - sharedTopic), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "rocketmq"), + equalTo(MESSAGING_DESTINATION_NAME, sharedTopic), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TAG, - "TagA"), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, "TagA"), satisfies( AttributeKey.stringKey("messaging.rocketmq.broker_address"), val -> val.isInstanceOf(String.class)), @@ -238,21 +225,15 @@ void testRocketmqProduceAndConsume() throws Exception { .hasKind(SpanKind.CONSUMER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rocketmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - sharedTopic), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "rocketmq"), + equalTo(MESSAGING_DESTINATION_NAME, sharedTopic), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, + MESSAGING_MESSAGE_BODY_SIZE, val -> val.isInstanceOf(Long.class)), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TAG, - "TagA"), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, "TagA"), satisfies( AttributeKey.stringKey("messaging.rocketmq.broker_address"), val -> val.isInstanceOf(String.class)), @@ -304,14 +285,11 @@ void testRocketmqProduceAndBatchConsume() throws Exception { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rocketmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - sharedTopic), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "rocketmq"), + equalTo(MESSAGING_DESTINATION_NAME, sharedTopic), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), satisfies( AttributeKey.stringKey("messaging.rocketmq.broker_address"), val -> val.isInstanceOf(String.class)), @@ -333,30 +311,23 @@ void testRocketmqProduceAndBatchConsume() throws Exception { span.hasName("multiple_sources receive") .hasKind(SpanKind.CONSUMER) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rocketmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive")), + equalTo(MESSAGING_SYSTEM, "rocketmq"), + equalTo(MESSAGING_OPERATION, "receive")), span -> span.hasName(sharedTopic + " process") .hasKind(SpanKind.CONSUMER) .hasParent(trace.getSpan(0)) .hasLinksSatisfying(links(producerSpanContext.get())) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rocketmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - sharedTopic), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "rocketmq"), + equalTo(MESSAGING_DESTINATION_NAME, sharedTopic), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, + MESSAGING_MESSAGE_BODY_SIZE, val -> val.isInstanceOf(Long.class)), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TAG, - "TagA"), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, "TagA"), satisfies( AttributeKey.stringKey("messaging.rocketmq.broker_address"), val -> val.isNotEmpty()), @@ -372,21 +343,15 @@ void testRocketmqProduceAndBatchConsume() throws Exception { .hasParent(trace.getSpan(0)) .hasLinksSatisfying(links(producerSpanContext.get())) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rocketmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - sharedTopic), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "rocketmq"), + equalTo(MESSAGING_DESTINATION_NAME, sharedTopic), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, + MESSAGING_MESSAGE_BODY_SIZE, val -> val.isInstanceOf(Long.class)), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TAG, - "TagB"), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, "TagB"), satisfies( AttributeKey.stringKey("messaging.rocketmq.broker_address"), val -> val.isNotEmpty()), @@ -430,18 +395,12 @@ void captureMessageHeaderAsSpanAttributes() throws Exception { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rocketmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - sharedTopic), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "rocketmq"), + equalTo(MESSAGING_DESTINATION_NAME, sharedTopic), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TAG, - "TagA"), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, "TagA"), satisfies( AttributeKey.stringKey("messaging.rocketmq.broker_address"), val -> val.isInstanceOf(String.class)), @@ -457,21 +416,15 @@ void captureMessageHeaderAsSpanAttributes() throws Exception { .hasKind(SpanKind.CONSUMER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rocketmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - sharedTopic), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "rocketmq"), + equalTo(MESSAGING_DESTINATION_NAME, sharedTopic), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, + MESSAGING_MESSAGE_BODY_SIZE, val -> val.isInstanceOf(Long.class)), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)), - equalTo( - MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TAG, - "TagA"), + MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)), + equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, "TagA"), satisfies( AttributeKey.stringKey("messaging.rocketmq.broker_address"), val -> val.isInstanceOf(String.class)), diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientSuppressReceiveSpanTest.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientSuppressReceiveSpanTest.java index 5f2fcb31d631..1bd7a04dfa40 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientSuppressReceiveSpanTest.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientSuppressReceiveSpanTest.java @@ -9,6 +9,7 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_KEYS; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TAG; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TYPE; @@ -123,9 +124,7 @@ void testSendAndConsumeMessage() throws Throwable { MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, - "publish")), + equalTo(MESSAGING_OPERATION, "publish")), span -> span.hasKind(SpanKind.CONSUMER) .hasName(topic + " process") @@ -145,9 +144,7 @@ void testSendAndConsumeMessage() throws Throwable { MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, - "process")), + equalTo(MESSAGING_OPERATION, "process")), span -> span.hasName("child") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientTest.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientTest.java index 1acb96f61268..541f042aecc9 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientTest.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientTest.java @@ -11,6 +11,8 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_CLIENT_GROUP; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_DELIVERY_TIMESTAMP; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_GROUP; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_KEYS; @@ -421,7 +423,7 @@ private static SpanDataAssert assertProducerSpan( equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"))); + equalTo(MESSAGING_OPERATION, "publish"))); attributeAssertions.addAll(Arrays.asList(extraAttributes)); return span.hasKind(SpanKind.PRODUCER) @@ -453,7 +455,7 @@ private static SpanDataAssert assertProducerSpanWithFifoMessage( equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"))); + equalTo(MESSAGING_OPERATION, "publish"))); attributeAssertions.addAll(Arrays.asList(extraAttributes)); return span.hasKind(SpanKind.PRODUCER) @@ -485,7 +487,7 @@ private static SpanDataAssert assertProducerSpanWithDelayMessage( equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"))); + equalTo(MESSAGING_OPERATION, "publish"))); attributeAssertions.addAll(Arrays.asList(extraAttributes)); return span.hasKind(SpanKind.PRODUCER) @@ -500,10 +502,10 @@ private static SpanDataAssert assertReceiveSpan( .hasName(topic + " receive") .hasStatus(StatusData.unset()) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), + equalTo(MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_OPERATION, "receive"), equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1)); } @@ -520,15 +522,14 @@ private static SpanDataAssert assertProcessSpan( List attributeAssertions = new ArrayList<>( Arrays.asList( - equalTo( - MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), + equalTo(MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, tag), equalTo(MESSAGING_ROCKETMQ_MESSAGE_KEYS, Arrays.asList(keys)), equalTo(MESSAGING_MESSAGE_BODY_SIZE, (long) body.length), equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"))); + equalTo(MESSAGING_OPERATION, "process"))); attributeAssertions.addAll(Arrays.asList(extraAttributes)); return span.hasKind(SpanKind.CONSUMER) @@ -553,8 +554,7 @@ private static SpanDataAssert assertProcessSpanWithFifoMessage( List attributeAssertions = new ArrayList<>( Arrays.asList( - equalTo( - MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), + equalTo(MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, tag), equalTo(MESSAGING_ROCKETMQ_MESSAGE_KEYS, Arrays.asList(keys)), equalTo(MESSAGING_ROCKETMQ_MESSAGE_GROUP, messageGroup), @@ -562,7 +562,7 @@ private static SpanDataAssert assertProcessSpanWithFifoMessage( equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"))); + equalTo(MESSAGING_OPERATION, "process"))); attributeAssertions.addAll(Arrays.asList(extraAttributes)); return span.hasKind(SpanKind.CONSUMER) @@ -587,8 +587,7 @@ private static SpanDataAssert assertProcessSpanWithDelayMessage( List attributeAssertions = new ArrayList<>( Arrays.asList( - equalTo( - MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), + equalTo(MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, tag), equalTo(MESSAGING_ROCKETMQ_MESSAGE_KEYS, Arrays.asList(keys)), equalTo(MESSAGING_ROCKETMQ_MESSAGE_DELIVERY_TIMESTAMP, deliveryTimestamp), @@ -596,7 +595,7 @@ private static SpanDataAssert assertProcessSpanWithDelayMessage( equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"))); + equalTo(MESSAGING_OPERATION, "process"))); attributeAssertions.addAll(Arrays.asList(extraAttributes)); return span.hasKind(SpanKind.CONSUMER) diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/Threads.java b/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/Threads.java index 238c15e37a74..d3af5bf00ea9 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/Threads.java +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/Threads.java @@ -25,6 +25,8 @@ import java.util.Locale; import java.util.Map; import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; import javax.annotation.Nullable; /** @@ -55,11 +57,34 @@ public final class Threads { /** Register observers for java runtime class metrics. */ public static List registerObservers(OpenTelemetry openTelemetry) { - return INSTANCE.registerObservers(openTelemetry, ManagementFactory.getThreadMXBean()); + return INSTANCE.registerObservers(openTelemetry, !isJava9OrNewer()); + } + + private List registerObservers(OpenTelemetry openTelemetry, boolean useThread) { + if (useThread) { + return registerObservers(openTelemetry, Threads::getThreads); + } + return registerObservers(openTelemetry, ManagementFactory.getThreadMXBean()); } // Visible for testing List registerObservers(OpenTelemetry openTelemetry, ThreadMXBean threadBean) { + return registerObservers( + openTelemetry, + isJava9OrNewer() ? Threads::java9AndNewerCallback : Threads::java8Callback, + threadBean); + } + + // Visible for testing + List registerObservers( + OpenTelemetry openTelemetry, Supplier threadSupplier) { + return registerObservers(openTelemetry, Threads::java8ThreadCallback, threadSupplier); + } + + private static List registerObservers( + OpenTelemetry openTelemetry, + Function> callbackProvider, + T threadInfo) { Meter meter = JmxRuntimeMetricsUtil.getMeter(openTelemetry); List observables = new ArrayList<>(); @@ -68,8 +93,7 @@ List registerObservers(OpenTelemetry openTelemetry, ThreadMXBean .upDownCounterBuilder("jvm.thread.count") .setDescription("Number of executing platform threads.") .setUnit("{thread}") - .buildWithCallback( - isJava9OrNewer() ? java9AndNewerCallback(threadBean) : java8Callback(threadBean))); + .buildWithCallback(callbackProvider.apply(threadInfo))); return observables; } @@ -104,6 +128,36 @@ private static Consumer java8Callback(ThreadMXBean th }; } + private static Consumer java8ThreadCallback( + Supplier supplier) { + return measurement -> { + Map counts = new HashMap<>(); + for (Thread thread : supplier.get()) { + Attributes threadAttributes = threadAttributes(thread); + counts.compute(threadAttributes, (k, value) -> value == null ? 1 : value + 1); + } + counts.forEach((threadAttributes, count) -> measurement.record(count, threadAttributes)); + }; + } + + // Visible for testing + static Thread[] getThreads() { + ThreadGroup threadGroup = Thread.currentThread().getThreadGroup(); + while (threadGroup.getParent() != null) { + threadGroup = threadGroup.getParent(); + } + // use a slightly larger array in case new threads are created + int count = threadGroup.activeCount() + 10; + Thread[] threads = new Thread[count]; + int resultSize = threadGroup.enumerate(threads); + if (resultSize == threads.length) { + return threads; + } + Thread[] result = new Thread[resultSize]; + System.arraycopy(threads, 0, result, 0, resultSize); + return result; + } + private static Consumer java9AndNewerCallback( ThreadMXBean threadBean) { return measurement -> { @@ -132,5 +186,12 @@ private static Attributes threadAttributes(ThreadInfo threadInfo) { JvmAttributes.JVM_THREAD_DAEMON, isDaemon, JvmAttributes.JVM_THREAD_STATE, threadState); } + private static Attributes threadAttributes(Thread thread) { + boolean isDaemon = thread.isDaemon(); + String threadState = thread.getState().name().toLowerCase(Locale.ROOT); + return Attributes.of( + JvmAttributes.JVM_THREAD_DAEMON, isDaemon, JvmAttributes.JVM_THREAD_STATE, threadState); + } + private Threads() {} } diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/test/java/io/opentelemetry/instrumentation/runtimemetrics/java8/ThreadsStableSemconvTest.java b/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/test/java/io/opentelemetry/instrumentation/runtimemetrics/java8/ThreadsStableSemconvTest.java index 5e2364b394f0..7d9eb8aa994e 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/test/java/io/opentelemetry/instrumentation/runtimemetrics/java8/ThreadsStableSemconvTest.java +++ b/instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/test/java/io/opentelemetry/instrumentation/runtimemetrics/java8/ThreadsStableSemconvTest.java @@ -8,15 +8,19 @@ import static io.opentelemetry.instrumentation.runtimemetrics.java8.ScopeUtil.EXPECTED_SCOPE; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.JvmAttributes.JVM_THREAD_DAEMON; +import static io.opentelemetry.semconv.JvmAttributes.JVM_THREAD_STATE; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; -import io.opentelemetry.semconv.JvmAttributes; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledForJreRange; import org.junit.jupiter.api.condition.EnabledOnJre; @@ -40,7 +44,7 @@ class ThreadsStableSemconvTest { @Test @EnabledOnJre(JRE.JAVA_8) - void registerObservers_Java8() { + void registerObservers_Java8Jmx() { when(threadBean.getThreadCount()).thenReturn(7); when(threadBean.getDaemonThreadCount()).thenReturn(2); @@ -66,14 +70,51 @@ void registerObservers_Java8() { point .hasValue(2) .hasAttributesSatisfying( - equalTo(JvmAttributes.JVM_THREAD_DAEMON, true)), + equalTo(JVM_THREAD_DAEMON, true)), point -> point .hasValue(5) .hasAttributesSatisfying( - equalTo( - JvmAttributes.JVM_THREAD_DAEMON, - false)))))); + equalTo(JVM_THREAD_DAEMON, false)))))); + } + + @Test + void registerObservers_Java8Thread() { + Thread threadInfo1 = mock(Thread.class, new ThreadInfoAnswer(false, Thread.State.RUNNABLE)); + Thread threadInfo2 = mock(Thread.class, new ThreadInfoAnswer(true, Thread.State.WAITING)); + + Thread[] threads = new Thread[] {threadInfo1, threadInfo2}; + + Threads.INSTANCE + .registerObservers(testing.getOpenTelemetry(), () -> threads) + .forEach(cleanup::deferCleanup); + + testing.waitAndAssertMetrics( + "io.opentelemetry.runtime-telemetry-java8", + "jvm.thread.count", + metrics -> + metrics.anySatisfy( + metricData -> + assertThat(metricData) + .hasInstrumentationScope(EXPECTED_SCOPE) + .hasDescription("Number of executing platform threads.") + .hasUnit("{thread}") + .hasLongSumSatisfying( + sum -> + sum.isNotMonotonic() + .hasPointsSatisfying( + point -> + point + .hasValue(1) + .hasAttributesSatisfying( + equalTo(JVM_THREAD_DAEMON, false), + equalTo(JVM_THREAD_STATE, "runnable")), + point -> + point + .hasValue(1) + .hasAttributesSatisfying( + equalTo(JVM_THREAD_DAEMON, true), + equalTo(JVM_THREAD_STATE, "waiting")))))); } @Test @@ -111,18 +152,21 @@ void registerObservers_Java9AndNewer() { point .hasValue(1) .hasAttributesSatisfying( - equalTo(JvmAttributes.JVM_THREAD_DAEMON, false), - equalTo( - JvmAttributes.JVM_THREAD_STATE, - "runnable")), + equalTo(JVM_THREAD_DAEMON, false), + equalTo(JVM_THREAD_STATE, "runnable")), point -> point .hasValue(1) .hasAttributesSatisfying( - equalTo(JvmAttributes.JVM_THREAD_DAEMON, true), - equalTo( - JvmAttributes.JVM_THREAD_STATE, - "waiting")))))); + equalTo(JVM_THREAD_DAEMON, true), + equalTo(JVM_THREAD_STATE, "waiting")))))); + } + + @Test + void getThreads() { + Thread[] threads = Threads.getThreads(); + Set set = new HashSet<>(Arrays.asList(threads)); + assertThat(set).contains(Thread.currentThread()); } static final class ThreadInfoAnswer implements Answer { @@ -140,7 +184,7 @@ public Object answer(InvocationOnMock invocation) { String methodName = invocation.getMethod().getName(); if (methodName.equals("isDaemon")) { return isDaemon; - } else if (methodName.equals("getThreadState")) { + } else if (methodName.equals("getThreadState") || methodName.equals("getState")) { return state; } return null; diff --git a/instrumentation/servlet/servlet-3.0/testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/jetty/JettyServletHandlerTest.java b/instrumentation/servlet/servlet-3.0/testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/jetty/JettyServletHandlerTest.java index 7c1632b100d3..529793e48da2 100644 --- a/instrumentation/servlet/servlet-3.0/testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/jetty/JettyServletHandlerTest.java +++ b/instrumentation/servlet/servlet-3.0/testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/jetty/JettyServletHandlerTest.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.servlet.v3_0.jetty; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; @@ -18,7 +19,6 @@ import io.opentelemetry.javaagent.instrumentation.servlet.v3_0.TestServlet3; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.HttpAttributes; import java.io.IOException; import java.io.Writer; import java.util.HashSet; @@ -45,7 +45,7 @@ protected void configure(HttpServerTestOptions options) { serverEndpoint -> { Set> attributes = new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(HttpAttributes.HTTP_ROUTE); + attributes.remove(HTTP_ROUTE); return attributes; }); } diff --git a/instrumentation/servlet/servlet-5.0/jetty11-testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v5_0/jetty/JettyServletHandlerTest.java b/instrumentation/servlet/servlet-5.0/jetty11-testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v5_0/jetty/JettyServletHandlerTest.java index 6383de5093a1..814e328a5392 100644 --- a/instrumentation/servlet/servlet-5.0/jetty11-testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v5_0/jetty/JettyServletHandlerTest.java +++ b/instrumentation/servlet/servlet-5.0/jetty11-testing/src/test/java/io/opentelemetry/javaagent/instrumentation/servlet/v5_0/jetty/JettyServletHandlerTest.java @@ -5,13 +5,14 @@ package io.opentelemetry.javaagent.instrumentation.servlet.v5_0.jetty; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; + import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.javaagent.instrumentation.servlet.v5_0.AbstractServlet5Test; import io.opentelemetry.javaagent.instrumentation.servlet.v5_0.TestServlet5; -import io.opentelemetry.semconv.HttpAttributes; import jakarta.servlet.Servlet; import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; @@ -38,7 +39,7 @@ protected void configure(HttpServerTestOptions options) { serverEndpoint -> { Set> attributes = new HashSet<>(HttpServerTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(HttpAttributes.HTTP_ROUTE); + attributes.remove(HTTP_ROUTE); return attributes; }); } diff --git a/instrumentation/spark-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/sparkjava/SparkJavaBasedTest.java b/instrumentation/spark-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/sparkjava/SparkJavaBasedTest.java index e47834f18872..95e3a5b75e17 100644 --- a/instrumentation/spark-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/sparkjava/SparkJavaBasedTest.java +++ b/instrumentation/spark-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/sparkjava/SparkJavaBasedTest.java @@ -7,6 +7,18 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ClientAttributes.CLIENT_ADDRESS; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_PATH; +import static io.opentelemetry.semconv.UrlAttributes.URL_SCHEME; +import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -14,12 +26,6 @@ import io.opentelemetry.instrumentation.test.utils.PortUtils; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.ClientAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.UserAgentAttributes; import io.opentelemetry.testing.internal.armeria.client.WebClient; import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse; import org.junit.jupiter.api.AfterAll; @@ -62,21 +68,17 @@ void generatesSpans() { .hasKind(SpanKind.SERVER) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(UrlAttributes.URL_SCHEME, "http"), - equalTo(UrlAttributes.URL_PATH, "/param/asdf1234"), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - satisfies( - UserAgentAttributes.USER_AGENT_ORIGINAL, - val -> val.isInstanceOf(String.class)), - equalTo(HttpAttributes.HTTP_ROUTE, "/param/:param"), - equalTo(NetworkAttributes.NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(ClientAttributes.CLIENT_ADDRESS, "127.0.0.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class))))); + equalTo(URL_SCHEME, "http"), + equalTo(URL_PATH, "/param/asdf1234"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), + equalTo(HTTP_ROUTE, "/param/:param"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, port), + equalTo(CLIENT_ADDRESS, "127.0.0.1"), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class))))); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index 79c30b7ff7f3..d15feefdcd05 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -180,10 +180,6 @@ configurations.configureEach { } tasks { - check { - dependsOn(testing.suites) - } - compileTestJava { options.compilerArgs.add("-parameters") } @@ -215,4 +211,13 @@ tasks { withType(Jar::class) { from(sourceSets["javaSpring3"].output) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testing.suites) + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java index a0fba64cf1f6..ffdd3c7d0181 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java @@ -5,11 +5,13 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.r2dbc; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; + import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Collections; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -51,14 +53,13 @@ void statementSanitizerEnabledByDefault() { trace.hasSpansSatisfyingExactly( span -> span.hasAttribute( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "CREATE TABLE IF NOT EXISTS player(id INT NOT NULL AUTO_INCREMENT, name VARCHAR(?), age INT, PRIMARY KEY (id))")), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasAttribute( - DbIncubatingAttributes.DB_STATEMENT, - "SELECT * FROM player WHERE id = ?"))); + maybeStable(DB_STATEMENT), "SELECT * FROM player WHERE id = ?"))); }); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/SpringResourceProviderTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/SpringResourceProviderTest.java index 0298b26d868a..5de21d9bcc9d 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/SpringResourceProviderTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/SpringResourceProviderTest.java @@ -6,6 +6,8 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; +import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_NAME; +import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_VERSION; import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.OtelResourceProperties; @@ -15,7 +17,6 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; import io.opentelemetry.sdk.testing.assertj.AttributesAssert; -import io.opentelemetry.semconv.ServiceAttributes; import java.util.Collections; import java.util.Properties; import org.junit.jupiter.api.DisplayName; @@ -42,8 +43,7 @@ void shouldDetermineServiceNameBySpringApplicationName() { .withPropertyValues("spring.application.name=myapp-backend") .run( context -> - assertResourceAttributes(context) - .containsEntry(ServiceAttributes.SERVICE_NAME, "myapp-backend")); + assertResourceAttributes(context).containsEntry(SERVICE_NAME, "myapp-backend")); } @Test @@ -58,8 +58,8 @@ void shouldDetermineServiceNameAndVersionBySpringApplicationVersion() { .run( context -> assertResourceAttributes(context) - .containsEntry(ServiceAttributes.SERVICE_NAME, "demo") - .containsEntry(ServiceAttributes.SERVICE_VERSION, "0.3")); + .containsEntry(SERVICE_NAME, "demo") + .containsEntry(SERVICE_VERSION, "0.3")); } private static AttributesAssert assertResourceAttributes(AssertableApplicationContext context) { diff --git a/instrumentation/spring/spring-boot-resources/javaagent/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetectorTest.java b/instrumentation/spring/spring-boot-resources/javaagent/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetectorTest.java index d8abfe890de8..d202e508abed 100644 --- a/instrumentation/spring/spring-boot-resources/javaagent/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetectorTest.java +++ b/instrumentation/spring/spring-boot-resources/javaagent/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetectorTest.java @@ -5,6 +5,7 @@ package io.opentelemetry.instrumentation.spring.resources; +import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_NAME; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.assertThat; @@ -13,7 +14,6 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.resources.Resource; -import io.opentelemetry.semconv.ServiceAttributes; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; @@ -173,8 +173,7 @@ void shouldApply() { void shouldNotApplyWhenResourceHasServiceName() { SpringBootServiceNameDetector guesser = new SpringBootServiceNameDetector(system); Resource resource = - Resource.getDefault() - .merge(Resource.create(Attributes.of(ServiceAttributes.SERVICE_NAME, "test-service"))); + Resource.getDefault().merge(Resource.create(Attributes.of(SERVICE_NAME, "test-service"))); assertThat(guesser.shouldApply(config, resource)).isFalse(); } @@ -189,12 +188,12 @@ void shouldNotApplyIfConfigHasServiceName() { void shouldNotApplyIfConfigHasServiceNameResourceAttribute() { SpringBootServiceNameDetector guesser = new SpringBootServiceNameDetector(system); when(config.getMap("otel.resource.attributes")) - .thenReturn(singletonMap(ServiceAttributes.SERVICE_NAME.getKey(), "test-service")); + .thenReturn(singletonMap(SERVICE_NAME.getKey(), "test-service")); assertThat(guesser.shouldApply(config, Resource.getDefault())).isFalse(); } private static void expectServiceName(Resource result, String expected) { - assertThat(result.getAttribute(ServiceAttributes.SERVICE_NAME)).isEqualTo(expected); + assertThat(result.getAttribute(SERVICE_NAME)).isEqualTo(expected); } private static void writeString(Path path, String value) throws Exception { diff --git a/instrumentation/spring/spring-boot-resources/javaagent/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java b/instrumentation/spring/spring-boot-resources/javaagent/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java index 8482af0f08ee..6c027e3ff4b8 100644 --- a/instrumentation/spring/spring-boot-resources/javaagent/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java +++ b/instrumentation/spring/spring-boot-resources/javaagent/src/test/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetectorTest.java @@ -5,12 +5,12 @@ package io.opentelemetry.instrumentation.spring.resources; +import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_VERSION; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.resources.Resource; -import io.opentelemetry.semconv.ServiceAttributes; import java.io.InputStream; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -33,7 +33,7 @@ void givenBuildVersionIsPresentInBuildInfProperties_thenReturnBuildVersion() { SpringBootServiceVersionDetector guesser = new SpringBootServiceVersionDetector(system); Resource result = guesser.createResource(config); - assertThat(result.getAttribute(ServiceAttributes.SERVICE_VERSION)).isEqualTo("0.0.2"); + assertThat(result.getAttribute(SERVICE_VERSION)).isEqualTo("0.0.2"); } @Test diff --git a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/build.gradle.kts b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/build.gradle.kts index 2e1aac948038..67ceebcfbfd4 100644 --- a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/build.gradle.kts @@ -12,15 +12,22 @@ muzzle { } dependencies { - library("io.awspring.cloud:spring-cloud-aws-starter-sqs:3.0.0") + // current latest release 3.3.0-M1 has parent that is from central because of that we can't use + // library here and have to use compileOnly + testImplementation to avoid resolving the broken + // version + compileOnly("io.awspring.cloud:spring-cloud-aws-starter-sqs:3.0.0") implementation(project(":instrumentation:aws-sdk:aws-sdk-2.2:library")) testInstrumentation(project(":instrumentation:aws-sdk:aws-sdk-2.2:javaagent")) testImplementation("org.elasticmq:elasticmq-rest-sqs_2.13") + testImplementation("io.awspring.cloud:spring-cloud-aws-starter-sqs:3.0.0") testLibrary("org.springframework.boot:spring-boot-starter-test:3.0.0") testLibrary("org.springframework.boot:spring-boot-starter-web:3.0.0") + + // current latest release 3.3.0-M1 has parent that is from central + latestDepTestLibrary("io.awspring.cloud:spring-cloud-aws-starter-sqs:3.2.1") } otelJava { diff --git a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/aws/AwsSqsTest.java b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/aws/AwsSqsTest.java index 9a50ab4a49a3..4c35dc6776dd 100644 --- a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/aws/AwsSqsTest.java +++ b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/aws/AwsSqsTest.java @@ -8,6 +8,18 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.awspring.cloud.sqs.operations.SqsTemplate; @@ -16,11 +28,8 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -83,17 +92,16 @@ void sqsListener() throws InterruptedException, ExecutionException, TimeoutExcep .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "GetQueueUrl"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "Sqs"), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_METHOD, "GetQueueUrl"), + equalTo(RPC_SERVICE, "Sqs"), equalTo( - HttpAttributes.HTTP_REQUEST_METHOD, - HttpAttributes.HttpRequestMethodValues.POST), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, AwsSqsTestApplication.sqsPort), + HTTP_REQUEST_METHOD, HttpAttributes.HttpRequestMethodValues.POST), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, AwsSqsTestApplication.sqsPort), satisfies( - UrlAttributes.URL_FULL, + URL_FULL, v -> v.startsWith( "http://localhost:" + AwsSqsTestApplication.sqsPort)), @@ -106,31 +114,26 @@ void sqsListener() throws InterruptedException, ExecutionException, TimeoutExcep .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "SendMessage"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "Sqs"), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_METHOD, "SendMessage"), + equalTo(RPC_SERVICE, "Sqs"), equalTo( - HttpAttributes.HTTP_REQUEST_METHOD, - HttpAttributes.HttpRequestMethodValues.POST), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, AwsSqsTestApplication.sqsPort), + HTTP_REQUEST_METHOD, HttpAttributes.HttpRequestMethodValues.POST), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, AwsSqsTestApplication.sqsPort), satisfies( - UrlAttributes.URL_FULL, + URL_FULL, v -> v.startsWith( "http://localhost:" + AwsSqsTestApplication.sqsPort)), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - AbstractStringAssert::isNotBlank), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "test-queue"), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotBlank), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_DESTINATION_NAME, "test-queue"), equalTo( stringKey("aws.queue.url"), "http://localhost:" @@ -144,31 +147,26 @@ void sqsListener() throws InterruptedException, ExecutionException, TimeoutExcep .hasKind(SpanKind.CONSUMER) .hasParent(trace.getSpan(2)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "Sqs"), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_METHOD, "ReceiveMessage"), + equalTo(RPC_SERVICE, "Sqs"), equalTo( - HttpAttributes.HTTP_REQUEST_METHOD, - HttpAttributes.HttpRequestMethodValues.POST), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, AwsSqsTestApplication.sqsPort), + HTTP_REQUEST_METHOD, HttpAttributes.HttpRequestMethodValues.POST), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, AwsSqsTestApplication.sqsPort), satisfies( - UrlAttributes.URL_FULL, + URL_FULL, v -> v.startsWith( "http://localhost:" + AwsSqsTestApplication.sqsPort)), equalTo( - MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MESSAGING_SYSTEM, MessagingIncubatingAttributes.MessagingSystemIncubatingValues .AWS_SQS), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - AbstractStringAssert::isNotBlank), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "test-queue")), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotBlank), + equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_DESTINATION_NAME, "test-queue")), span -> span.hasName("callback").hasKind(SpanKind.INTERNAL).hasParent(trace.getSpan(3)), span -> @@ -176,17 +174,16 @@ void sqsListener() throws InterruptedException, ExecutionException, TimeoutExcep .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(2)) .hasAttributesSatisfyingExactly( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "DeleteMessageBatch"), - equalTo(RpcIncubatingAttributes.RPC_SERVICE, "Sqs"), + equalTo(RPC_SYSTEM, "aws-api"), + equalTo(RPC_METHOD, "DeleteMessageBatch"), + equalTo(RPC_SERVICE, "Sqs"), equalTo( - HttpAttributes.HTTP_REQUEST_METHOD, - HttpAttributes.HttpRequestMethodValues.POST), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, AwsSqsTestApplication.sqsPort), + HTTP_REQUEST_METHOD, HttpAttributes.HttpRequestMethodValues.POST), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, AwsSqsTestApplication.sqsPort), satisfies( - UrlAttributes.URL_FULL, + URL_FULL, v -> v.startsWith( "http://localhost:" + AwsSqsTestApplication.sqsPort)), diff --git a/instrumentation/spring/spring-data/spring-data-1.8/javaagent/build.gradle.kts b/instrumentation/spring/spring-data/spring-data-1.8/javaagent/build.gradle.kts index d5d7900af243..666568cfcc12 100644 --- a/instrumentation/spring/spring-data/spring-data-1.8/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-data/spring-data-1.8/javaagent/build.gradle.kts @@ -46,10 +46,18 @@ dependencies { } tasks { - test { + withType().configureEach { jvmArgs("--add-opens=java.base/java.lang.invoke=ALL-UNNAMED") jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/spring/spring-data/spring-data-3.0/testing/build.gradle.kts b/instrumentation/spring/spring-data/spring-data-3.0/testing/build.gradle.kts index d1cdb1a3b60a..ea8f4549deb6 100644 --- a/instrumentation/spring/spring-data/spring-data-3.0/testing/build.gradle.kts +++ b/instrumentation/spring/spring-data/spring-data-3.0/testing/build.gradle.kts @@ -42,14 +42,19 @@ testing { } tasks { - test { + withType().configureEach { jvmArgs("--add-opens=java.base/java.lang.invoke=ALL-UNNAMED") jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") } + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + check { dependsOn(testing.suites) + dependsOn(testStableSemconv) } } diff --git a/instrumentation/spring/spring-data/spring-data-3.0/testing/src/reactiveTest/java/io/opentelemetry/javaagent/instrumentation/spring/data/v3_0/ReactiveSpringDataTest.java b/instrumentation/spring/spring-data/spring-data-3.0/testing/src/reactiveTest/java/io/opentelemetry/javaagent/instrumentation/spring/data/v3_0/ReactiveSpringDataTest.java index 826bf0877497..06f7cc67309d 100644 --- a/instrumentation/spring/spring-data/spring-data-3.0/testing/src/reactiveTest/java/io/opentelemetry/javaagent/instrumentation/spring/data/v3_0/ReactiveSpringDataTest.java +++ b/instrumentation/spring/spring-data/spring-data-3.0/testing/src/reactiveTest/java/io/opentelemetry/javaagent/instrumentation/spring/data/v3_0/ReactiveSpringDataTest.java @@ -5,6 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.spring.data.v3_0; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; @@ -49,7 +51,7 @@ static void cleanUp() { applicationContext.close(); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @Test void testFindAll() { long count = @@ -82,12 +84,14 @@ void testFindAll() { .isLessThanOrEqualTo(trace.getSpan(1).getEndEpochNanos())) .hasAttributesSatisfyingExactly( equalTo(DB_SYSTEM, "h2"), - equalTo(DB_NAME, "db"), - equalTo(DB_USER, "sa"), - equalTo(DB_STATEMENT, "SELECT CUSTOMER.* FROM CUSTOMER"), - equalTo(DB_OPERATION, "SELECT"), - equalTo(DB_SQL_TABLE, "CUSTOMER"), - equalTo(DB_CONNECTION_STRING, "h2:mem://localhost"), + equalTo(maybeStable(DB_NAME), "db"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo(maybeStable(DB_STATEMENT), "SELECT CUSTOMER.* FROM CUSTOMER"), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "CUSTOMER"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "h2:mem://localhost"), equalTo(SERVER_ADDRESS, "localhost")))); } } diff --git a/instrumentation/spring/spring-data/spring-data-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/AbstractSpringJpaTest.java b/instrumentation/spring/spring-data/spring-data-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/AbstractSpringJpaTest.java index 730fc05da074..ec329846d155 100644 --- a/instrumentation/spring/spring-data/spring-data-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/AbstractSpringJpaTest.java +++ b/instrumentation/spring/spring-data/spring-data-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/data/AbstractSpringJpaTest.java @@ -5,8 +5,17 @@ package io.opentelemetry.javaagent.instrumentation.spring.data; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static org.assertj.core.api.Assertions.catchThrowableOfType; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -20,7 +29,6 @@ import io.opentelemetry.sdk.testing.assertj.TraceAssert; import io.opentelemetry.sdk.trace.data.StatusData; import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.List; import java.util.Optional; import org.hibernate.Version; @@ -68,7 +76,7 @@ void testObjectMethod() { span -> span.hasName("toString test").hasTotalAttributeCount(0))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation static void assertHibernate4Trace(TraceAssert trace, String repoClassName) { trace.hasSpansSatisfyingExactly( span -> @@ -82,17 +90,17 @@ static void assertHibernate4Trace(TraceAssert trace, String repoClassName) { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, val -> val.startsWith("insert ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "INSERT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "JpaCustomer"))); + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.startsWith("insert ")), + equalTo(maybeStable(DB_OPERATION), "INSERT"), + equalTo(maybeStable(DB_SQL_TABLE), "JpaCustomer"))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation static void assertHibernateTrace(TraceAssert trace, String repoClassName) { trace.hasSpansSatisfyingExactly( span -> @@ -105,30 +113,30 @@ static void assertHibernateTrace(TraceAssert trace, String repoClassName) { span.hasName("CALL test") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.startsWith("call next value for ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "CALL")), + maybeStable(DB_STATEMENT), val -> val.startsWith("call next value for ")), + equalTo(maybeStable(DB_OPERATION), "CALL")), span -> span.hasName("INSERT test.JpaCustomer") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, val -> val.startsWith("insert ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "INSERT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "JpaCustomer"))); + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.startsWith("insert ")), + equalTo(maybeStable(DB_OPERATION), "INSERT"), + equalTo(maybeStable(DB_SQL_TABLE), "JpaCustomer"))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @Test void testCrud() { boolean isHibernate4 = Version.getVersionString().startsWith("4."); @@ -154,15 +162,15 @@ void testCrud() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.startsWith("select ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "JpaCustomer")))); + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.startsWith("select ")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "JpaCustomer")))); clearData(); repo.save(customer); @@ -192,29 +200,29 @@ void testCrud() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.startsWith("select ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "JpaCustomer")), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.startsWith("select ")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "JpaCustomer")), span -> span.hasName("UPDATE test.JpaCustomer") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.startsWith("update ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "UPDATE"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "JpaCustomer")))); + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.startsWith("update ")), + equalTo(maybeStable(DB_OPERATION), "UPDATE"), + equalTo(maybeStable(DB_SQL_TABLE), "JpaCustomer")))); clearData(); customer = findByLastName(repo, "Anonymous").get(0); @@ -232,15 +240,15 @@ void testCrud() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.startsWith("select ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "JpaCustomer")))); + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.startsWith("select ")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "JpaCustomer")))); clearData(); repo.delete(customer); @@ -258,32 +266,32 @@ void testCrud() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.startsWith("select ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "JpaCustomer")), + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.startsWith("select ")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "JpaCustomer")), span -> span.hasName("DELETE test.JpaCustomer") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.startsWith("delete ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DELETE"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "JpaCustomer")))); + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.startsWith("delete ")), + equalTo(maybeStable(DB_OPERATION), "DELETE"), + equalTo(maybeStable(DB_SQL_TABLE), "JpaCustomer")))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @Test void testCustomRepositoryMethod() { REPOSITORY repo = repository(); @@ -307,18 +315,18 @@ void testCustomRepositoryMethod() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.startsWith("select ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "JpaCustomer")))); + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.startsWith("select ")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "JpaCustomer")))); } - @SuppressWarnings("deprecation") // TODO DbIncubatingAttributes.DB_CONNECTION_STRING deprecation + @SuppressWarnings("deprecation") // TODO DB_CONNECTION_STRING deprecation @Test void testFailedRepositoryMethod() { // given @@ -354,14 +362,14 @@ void testFailedRepositoryMethod() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_SYSTEM, "hsqldb"), - equalTo(DbIncubatingAttributes.DB_NAME, "test"), - equalTo(DbIncubatingAttributes.DB_USER, "sa"), - equalTo(DbIncubatingAttributes.DB_CONNECTION_STRING, "hsqldb:mem:"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, - val -> val.startsWith("select ")), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "JpaCustomer")))); + equalTo(DB_SYSTEM, "hsqldb"), + equalTo(maybeStable(DB_NAME), "test"), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : "sa"), + equalTo( + DB_CONNECTION_STRING, + emitStableDatabaseSemconv() ? null : "hsqldb:mem:"), + satisfies(maybeStable(DB_STATEMENT), val -> val.startsWith("select ")), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "JpaCustomer")))); } } diff --git a/instrumentation/spring/spring-integration-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationAndRabbitTest.java b/instrumentation/spring/spring-integration-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationAndRabbitTest.java index 2960c927ab5b..6f1bbba173b4 100644 --- a/instrumentation/spring/spring-integration-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationAndRabbitTest.java +++ b/instrumentation/spring/spring-integration-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationAndRabbitTest.java @@ -8,12 +8,19 @@ import static io.opentelemetry.instrumentation.testing.GlobalTraceUtil.runWithSpan; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.NetworkAttributes; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -50,14 +57,11 @@ void shouldCooperateWithExistingRabbitMqInstrumentation() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, + NETWORK_PEER_ADDRESS, s -> s.isIn("127.0.0.1", "0:0:0:0:0:0:0:1", null)), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - l -> l.isInstanceOf(Long.class)), - satisfies( - NetworkAttributes.NETWORK_TYPE, s -> s.isIn("ipv4", "ipv6", null)), - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rabbitmq")), + satisfies(NETWORK_PEER_PORT, l -> l.isInstanceOf(Long.class)), + satisfies(NETWORK_TYPE, s -> s.isIn("ipv4", "ipv6", null)), + equalTo(MESSAGING_SYSTEM, "rabbitmq")), span -> span.hasName("queue.declare"), span -> span.hasName("queue.bind"), span -> @@ -66,21 +70,14 @@ void shouldCooperateWithExistingRabbitMqInstrumentation() { .hasKind(SpanKind.PRODUCER) .hasAttributesSatisfyingExactly( satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, + NETWORK_PEER_ADDRESS, s -> s.isIn("127.0.0.1", "0:0:0:0:0:0:0:1", null)), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - l -> l.isInstanceOf(Long.class)), - satisfies( - NetworkAttributes.NETWORK_TYPE, s -> s.isIn("ipv4", "ipv6", null)), - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rabbitmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - l -> l.isInstanceOf(Long.class)), + satisfies(NETWORK_PEER_PORT, l -> l.isInstanceOf(Long.class)), + satisfies(NETWORK_TYPE, s -> s.isIn("ipv4", "ipv6", null)), + equalTo(MESSAGING_SYSTEM, "rabbitmq"), + equalTo(MESSAGING_DESTINATION_NAME, "testTopic"), + equalTo(MESSAGING_OPERATION, "publish"), + satisfies(MESSAGING_MESSAGE_BODY_SIZE, l -> l.isInstanceOf(Long.class)), satisfies( MessagingIncubatingAttributes .MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY, @@ -98,21 +95,14 @@ void shouldCooperateWithExistingRabbitMqInstrumentation() { .hasKind(SpanKind.CONSUMER) .hasAttributesSatisfyingExactly( satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, + NETWORK_PEER_ADDRESS, s -> s.isIn("127.0.0.1", "0:0:0:0:0:0:0:1", null)), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - l -> l.isInstanceOf(Long.class)), - satisfies( - NetworkAttributes.NETWORK_TYPE, s -> s.isIn("ipv4", "ipv6", null)), - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rabbitmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - l -> l.isInstanceOf(Long.class)), + satisfies(NETWORK_PEER_PORT, l -> l.isInstanceOf(Long.class)), + satisfies(NETWORK_TYPE, s -> s.isIn("ipv4", "ipv6", null)), + equalTo(MESSAGING_SYSTEM, "rabbitmq"), + equalTo(MESSAGING_DESTINATION_NAME, "testTopic"), + equalTo(MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_MESSAGE_BODY_SIZE, l -> l.isInstanceOf(Long.class)), satisfies( MessagingIncubatingAttributes .MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY, @@ -124,17 +114,12 @@ void shouldCooperateWithExistingRabbitMqInstrumentation() { .hasParent(trace.getSpan(6)) .hasKind(SpanKind.CONSUMER) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rabbitmq"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - s -> s.isInstanceOf(String.class)), + equalTo(MESSAGING_SYSTEM, "rabbitmq"), + equalTo(MESSAGING_DESTINATION_NAME, "testTopic"), + equalTo(MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_MESSAGE_ID, s -> s.isInstanceOf(String.class)), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - l -> l.isInstanceOf(Long.class))), + MESSAGING_MESSAGE_BODY_SIZE, l -> l.isInstanceOf(Long.class))), span -> span.hasName("consumer").hasParent(trace.getSpan(8)).hasTotalAttributeCount(0)), trace -> @@ -144,13 +129,10 @@ void shouldCooperateWithExistingRabbitMqInstrumentation() { .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( satisfies( - NetworkAttributes.NETWORK_PEER_ADDRESS, + NETWORK_PEER_ADDRESS, s -> s.isIn("127.0.0.1", "0:0:0:0:0:0:0:1", null)), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - l -> l.isInstanceOf(Long.class)), - satisfies( - NetworkAttributes.NETWORK_TYPE, s -> s.isIn("ipv4", "ipv6", null)), - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rabbitmq")))); + satisfies(NETWORK_PEER_PORT, l -> l.isInstanceOf(Long.class)), + satisfies(NETWORK_TYPE, s -> s.isIn("ipv4", "ipv6", null)), + equalTo(MESSAGING_SYSTEM, "rabbitmq")))); } } diff --git a/instrumentation/spring/spring-jms/spring-jms-2.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/jms/v2_0/AbstractJmsTest.java b/instrumentation/spring/spring-jms/spring-jms-2.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/jms/v2_0/AbstractJmsTest.java index 8db2a8d26fae..8db8726f79dd 100644 --- a/instrumentation/spring/spring-jms/spring-jms-2.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/jms/v2_0/AbstractJmsTest.java +++ b/instrumentation/spring/spring-jms/spring-jms-2.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/jms/v2_0/AbstractJmsTest.java @@ -10,13 +10,17 @@ import static io.opentelemetry.api.trace.SpanKind.PRODUCER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_TEMPORARY; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static java.util.Arrays.asList; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -39,15 +43,12 @@ protected List producerAttributeAssertions( List attributeAssertions = new ArrayList<>( asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class)))); + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, "publish"), + satisfies(MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class)))); if (destinationName.equals("(temporary)")) { - attributeAssertions.add( - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_TEMPORARY, true)); + attributeAssertions.add(equalTo(MESSAGING_DESTINATION_TEMPORARY, true)); } if (testHeaders) { attributeAssertions.add( @@ -89,20 +90,17 @@ protected List consumerAttributeAssertions( List attributeAssertions = new ArrayList<>( asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, destinationName), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, operation))); + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, destinationName), + equalTo(MESSAGING_OPERATION, operation))); if (msgId != null) { - attributeAssertions.add(equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, msgId)); + attributeAssertions.add(equalTo(MESSAGING_MESSAGE_ID, msgId)); } else { attributeAssertions.add( - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - val -> val.isInstanceOf(String.class))); + satisfies(MESSAGING_MESSAGE_ID, val -> val.isInstanceOf(String.class))); } if (destinationName.equals("(temporary)")) { - attributeAssertions.add( - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_TEMPORARY, true)); + attributeAssertions.add(equalTo(MESSAGING_DESTINATION_TEMPORARY, true)); } if (testHeaders) { attributeAssertions.add( diff --git a/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringJmsListenerTest.java b/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringJmsListenerTest.java index 366f9514cc51..2daf9a2b0cec 100644 --- a/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringJmsListenerTest.java +++ b/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringJmsListenerTest.java @@ -12,12 +12,15 @@ import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanKind; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import jakarta.jms.ConnectionFactory; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -47,14 +50,10 @@ void assertSpringJmsListener() { .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "spring-jms-listener"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - AbstractStringAssert::isNotBlank))); + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, "spring-jms-listener"), + equalTo(MESSAGING_OPERATION, "publish"), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotBlank))); producerSpan.set(trace.getSpan(1)); }, @@ -66,28 +65,20 @@ void assertSpringJmsListener() { .hasNoParent() .hasLinks(LinkData.create(producerSpan.get().getSpanContext())) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "spring-jms-listener"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - AbstractStringAssert::isNotBlank)), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, "spring-jms-listener"), + equalTo(MESSAGING_OPERATION, "receive"), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotBlank)), span -> span.hasName("spring-jms-listener process") .hasKind(CONSUMER) .hasParent(trace.getSpan(0)) .hasLinks(LinkData.create(producerSpan.get().getSpanContext())) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "spring-jms-listener"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - AbstractStringAssert::isNotBlank)), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, "spring-jms-listener"), + equalTo(MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotBlank)), span -> span.hasName("consumer").hasParent(trace.getSpan(1)))); } @@ -133,14 +124,10 @@ void shouldCaptureHeaders(Class configClass) .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "spring-jms-listener"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - AbstractStringAssert::isNotBlank), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, "spring-jms-listener"), + equalTo(MESSAGING_OPERATION, "publish"), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotBlank), equalTo( stringArrayKey("messaging.header.test_message_header"), singletonList("test")), @@ -154,14 +141,10 @@ void shouldCaptureHeaders(Class configClass) .hasKind(CONSUMER) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "spring-jms-listener"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - AbstractStringAssert::isNotBlank), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, "spring-jms-listener"), + equalTo(MESSAGING_OPERATION, "receive"), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotBlank), equalTo( stringArrayKey("messaging.header.test_message_header"), singletonList("test")), @@ -173,14 +156,10 @@ void shouldCaptureHeaders(Class configClass) .hasKind(CONSUMER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "spring-jms-listener"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - AbstractStringAssert::isNotBlank), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, "spring-jms-listener"), + equalTo(MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotBlank), equalTo( stringArrayKey("messaging.header.test_message_header"), singletonList("test")), diff --git a/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringListenerSuppressReceiveSpansTest.java b/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringListenerSuppressReceiveSpansTest.java index 6e8677579779..2c84d93cd638 100644 --- a/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringListenerSuppressReceiveSpansTest.java +++ b/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringListenerSuppressReceiveSpansTest.java @@ -9,8 +9,11 @@ import static io.opentelemetry.api.trace.SpanKind.PRODUCER; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import org.assertj.core.api.AbstractStringAssert; class SpringListenerSuppressReceiveSpansTest extends AbstractSpringJmsListenerTest { @@ -27,28 +30,20 @@ void assertSpringJmsListener() { .hasKind(PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "spring-jms-listener"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - AbstractStringAssert::isNotBlank)), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, "spring-jms-listener"), + equalTo(MESSAGING_OPERATION, "publish"), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotBlank)), span -> span.hasName("spring-jms-listener process") .hasKind(CONSUMER) .hasParent(trace.getSpan(1)) .hasTotalRecordedLinks(0) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "jms"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "spring-jms-listener"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, - AbstractStringAssert::isNotBlank)), + equalTo(MESSAGING_SYSTEM, "jms"), + equalTo(MESSAGING_DESTINATION_NAME, "spring-jms-listener"), + equalTo(MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotBlank)), span -> span.hasName("consumer").hasParent(trace.getSpan(2)))); } } diff --git a/instrumentation/spring/spring-kafka-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/kafka/v2_7/SpringKafkaTest.java b/instrumentation/spring/spring-kafka-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/kafka/v2_7/SpringKafkaTest.java index b43f479cab0e..6818653482ef 100644 --- a/instrumentation/spring/spring-kafka-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/kafka/v2_7/SpringKafkaTest.java +++ b/instrumentation/spring/spring-kafka-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/kafka/v2_7/SpringKafkaTest.java @@ -9,6 +9,15 @@ import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanKind; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static java.util.Collections.emptyList; import io.opentelemetry.api.trace.SpanKind; @@ -20,7 +29,6 @@ import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import io.opentelemetry.testing.AbstractSpringKafkaTest; import java.util.ArrayList; import java.util.Arrays; @@ -74,18 +82,14 @@ void shouldCreateSpansForSingleRecordProcess() { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSingleTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testSingleTopic"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), + MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")))); @@ -99,44 +103,32 @@ void shouldCreateSpansForSingleRecordProcess() { .hasKind(SpanKind.CONSUMER) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSingleTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "testSingleListener"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testSingleTopic"), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), - equalTo( - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1)), + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1)), span -> span.hasName("testSingleTopic process") .hasKind(SpanKind.CONSUMER) .hasParent(trace.getSpan(0)) .hasLinks(LinkData.create(producer.get().getSpanContext())) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSingleTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testSingleTopic"), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - AbstractLongAssert::isNotNegative), + MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "testSingleListener"), + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), @@ -164,34 +156,23 @@ void shouldHandleFailureInKafkaListener() { .hasKind(SpanKind.CONSUMER) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSingleTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "testSingleListener"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testSingleTopic"), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), - equalTo(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1)); + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1)); List processAttributes = Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSingleTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - AbstractLongAssert::isNotNegative), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), - satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testSingleTopic"), + equalTo(MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), + satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), + satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), satisfies(longKey("kafka.record.queue_time_ms"), AbstractLongAssert::isNotNegative)); @@ -206,18 +187,14 @@ void shouldHandleFailureInKafkaListener() { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSingleTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testSingleTopic"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), + MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")))); @@ -280,18 +257,14 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testBatchTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testBatchTopic"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), + MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer"))), @@ -300,18 +273,14 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testBatchTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testBatchTopic"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), + MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "20"), + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "20"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")))); @@ -326,19 +295,14 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { .hasKind(SpanKind.CONSUMER) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testBatchTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "testBatchListener"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testBatchTopic"), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), - equalTo( - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 2)), + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 2)), span -> span.hasName("testBatchTopic process") .hasKind(SpanKind.CONSUMER) @@ -347,19 +311,14 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { LinkData.create(producer1.get().getSpanContext()), LinkData.create(producer2.get().getSpanContext())) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testBatchTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "testBatchListener"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testBatchTopic"), + equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), - equalTo( - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 2)), + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 2)), span -> span.hasName("consumer").hasParent(trace.getSpan(1)))); } @@ -387,18 +346,14 @@ void shouldHandleFailureInKafkaBatchListener() { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testBatchTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testBatchTopic"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), + MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")))); @@ -447,13 +402,12 @@ private static void assertReceiveSpan(SpanDataAssert span) { .hasKind(SpanKind.CONSUMER) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testBatchTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testBatchTopic"), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), - equalTo(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1)); + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1)); } private static void assertProcessSpan( @@ -463,13 +417,12 @@ private static void assertProcessSpan( .hasParent(trace.getSpan(0)) .hasLinks(LinkData.create(producer.getSpanContext())) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testBatchTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testBatchTopic"), + equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), - equalTo(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1)); + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1)); if (failed) { span.hasStatus(StatusData.error()).hasException(new IllegalArgumentException("boom")); } diff --git a/instrumentation/spring/spring-kafka-2.7/testing/src/main/java/io/opentelemetry/testing/AbstractSpringKafkaNoReceiveTelemetryTest.java b/instrumentation/spring/spring-kafka-2.7/testing/src/main/java/io/opentelemetry/testing/AbstractSpringKafkaNoReceiveTelemetryTest.java index 97dc95a800e0..bcb57ad88c69 100644 --- a/instrumentation/spring/spring-kafka-2.7/testing/src/main/java/io/opentelemetry/testing/AbstractSpringKafkaNoReceiveTelemetryTest.java +++ b/instrumentation/spring/spring-kafka-2.7/testing/src/main/java/io/opentelemetry/testing/AbstractSpringKafkaNoReceiveTelemetryTest.java @@ -9,6 +9,15 @@ import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanName; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; @@ -52,12 +61,9 @@ void shouldCreateSpansForSingleRecordProcess() { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSingleTopic"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testSingleTopic"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), @@ -66,38 +72,28 @@ void shouldCreateSpansForSingleRecordProcess() { .MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, - "10")), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10")), span -> span.hasName("testSingleTopic process") .hasKind(SpanKind.CONSUMER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSingleTopic"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testSingleTopic"), + equalTo(MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - AbstractLongAssert::isNotNegative), + MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), satisfies( MessagingIncubatingAttributes .MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, - "10"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "testSingleListener"), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer"))), @@ -119,21 +115,14 @@ void shouldHandleFailureInKafkaListener() { List processAttributes = Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSingleTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - AbstractLongAssert::isNotNegative), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), - satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative), - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testSingleTopic"), + equalTo(MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), + satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), + satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer"))); testing() @@ -146,12 +135,9 @@ void shouldHandleFailureInKafkaListener() { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testSingleTopic"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testSingleTopic"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), @@ -160,11 +146,9 @@ void shouldHandleFailureInKafkaListener() { .MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, - "10")), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10")), span -> span.hasName("testSingleTopic process") .hasKind(SpanKind.CONSUMER) @@ -211,44 +195,37 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testBatchTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testBatchTopic"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10")), + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10")), span -> span.hasName("testBatchTopic publish") .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testBatchTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testBatchTopic"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, - "20"))); + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "20"))); producer1.set(trace.getSpan(1)); producer2.set(trace.getSpan(2)); @@ -264,21 +241,14 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { producer1.get().getSpanContext(), producer2.get().getSpanContext())) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testBatchTopic"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, - "testBatchListener"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testBatchTopic"), + equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), - equalTo( - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, - 2)), + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 2)), span -> span.hasName("consumer").hasParent(trace.getSpan(0)))); } @@ -299,13 +269,12 @@ void shouldHandleFailureInKafkaBatchListener() { List processAttributes = Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testBatchTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testBatchTopic"), + equalTo(MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), - equalTo(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1)); + equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1)); testing() .waitAndAssertSortedTraces( @@ -318,23 +287,19 @@ void shouldHandleFailureInKafkaBatchListener() { .hasKind(SpanKind.PRODUCER) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, - "testBatchTopic"), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, "testBatchTopic"), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, + MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), - equalTo( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, - "10"))); + equalTo(MESSAGING_KAFKA_MESSAGE_KEY, "10"))); producer.set(trace.getSpan(1)); }, diff --git a/instrumentation/spring/spring-rabbit-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitMqTest.java b/instrumentation/spring/spring-rabbit-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitMqTest.java index 98b41f0b698a..38b05dcb9be0 100644 --- a/instrumentation/spring/spring-rabbit-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitMqTest.java +++ b/instrumentation/spring/spring-rabbit-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitMqTest.java @@ -7,6 +7,14 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; @@ -18,7 +26,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.semconv.NetworkAttributes; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.net.InetAddress; import java.net.UnknownHostException; @@ -105,25 +112,20 @@ private static List getAssertions( List assertions = new ArrayList<>( Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rabbitmq"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, destination), - satisfies( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - AbstractLongAssert::isNotNegative))); + equalTo(MESSAGING_SYSTEM, "rabbitmq"), + equalTo(MESSAGING_DESTINATION_NAME, destination), + satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative))); if (operation != null) { - assertions.add(equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, operation)); + assertions.add(equalTo(MESSAGING_OPERATION, operation)); } if (peerAddress != null) { - assertions.add(equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4")); - assertions.add(equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, peerAddress)); - assertions.add( - satisfies(NetworkAttributes.NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)); + assertions.add(equalTo(NETWORK_TYPE, "ipv4")); + assertions.add(equalTo(NETWORK_PEER_ADDRESS, peerAddress)); + assertions.add(satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)); } if (routingKey) { assertions.add( - satisfies( - MessagingIncubatingAttributes.MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY, - AbstractStringAssert::isNotBlank)); + satisfies(MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY, AbstractStringAssert::isNotBlank)); } if (testHeaders) { assertions.add( @@ -213,12 +215,10 @@ public void testContextPropagation(boolean testHeaders) throws Exception { span.hasName("basic.ack") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - AbstractLongAssert::isNotNegative), - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "rabbitmq"))); + equalTo(NETWORK_TYPE, "ipv4"), + equalTo(NETWORK_PEER_ADDRESS, ip), + satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative), + equalTo(MESSAGING_SYSTEM, "rabbitmq"))); }); } } diff --git a/instrumentation/spring/spring-rmi-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rmi/v4_0/SpringRmiTest.java b/instrumentation/spring/spring-rmi-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rmi/v4_0/SpringRmiTest.java index 2009d762b4d7..4d1570932d02 100644 --- a/instrumentation/spring/spring-rmi-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rmi/v4_0/SpringRmiTest.java +++ b/instrumentation/spring/spring-rmi-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rmi/v4_0/SpringRmiTest.java @@ -7,6 +7,12 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -16,8 +22,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ExceptionAttributes; -import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.HashMap; @@ -156,11 +160,9 @@ void clientCallCreatesSpans(TestSource testSource) throws RemoteException { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfying( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "spring_rmi"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "springrmi.app.SpringRmiGreeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "hello"))); + equalTo(RPC_SYSTEM, "spring_rmi"), + equalTo(RPC_SERVICE, "springrmi.app.SpringRmiGreeter"), + equalTo(RPC_METHOD, "hello"))); if (testSource == TestSource.RMI) { assertions.add( span -> @@ -168,10 +170,9 @@ void clientCallCreatesSpans(TestSource testSource) throws RemoteException { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfying( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, testSource.serverSystem), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, testSource.remoteClassName), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "hello"))); + equalTo(RPC_SYSTEM, testSource.serverSystem), + equalTo(RPC_SERVICE, testSource.remoteClassName), + equalTo(RPC_METHOD, "hello"))); } trace.hasSpansSatisfyingExactly(assertions); @@ -199,14 +200,10 @@ void throwsException(TestSource testSource) { event .hasName("exception") .hasAttributesSatisfying( - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - error.getClass().getCanonicalName()), - equalTo( - ExceptionAttributes.EXCEPTION_MESSAGE, - error.getMessage()), + equalTo(EXCEPTION_TYPE, error.getClass().getCanonicalName()), + equalTo(EXCEPTION_MESSAGE, error.getMessage()), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, + EXCEPTION_STACKTRACE, val -> val.isInstanceOf(String.class))))); assertions.add( span -> @@ -219,21 +216,15 @@ void throwsException(TestSource testSource) { event .hasName("exception") .hasAttributesSatisfying( - equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - error.getClass().getCanonicalName()), - equalTo( - ExceptionAttributes.EXCEPTION_MESSAGE, - error.getMessage()), + equalTo(EXCEPTION_TYPE, error.getClass().getCanonicalName()), + equalTo(EXCEPTION_MESSAGE, error.getMessage()), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, + EXCEPTION_STACKTRACE, val -> val.isInstanceOf(String.class)))) .hasAttributesSatisfying( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "spring_rmi"), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, - "springrmi.app.SpringRmiGreeter"), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "exceptional"))); + equalTo(RPC_SYSTEM, "spring_rmi"), + equalTo(RPC_SERVICE, "springrmi.app.SpringRmiGreeter"), + equalTo(RPC_METHOD, "exceptional"))); if (testSource == TestSource.RMI) { assertions.add( span -> @@ -247,19 +238,15 @@ void throwsException(TestSource testSource) { .hasName("exception") .hasAttributesSatisfying( equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - error.getClass().getCanonicalName()), - equalTo( - ExceptionAttributes.EXCEPTION_MESSAGE, - error.getMessage()), + EXCEPTION_TYPE, error.getClass().getCanonicalName()), + equalTo(EXCEPTION_MESSAGE, error.getMessage()), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, + EXCEPTION_STACKTRACE, val -> val.isInstanceOf(String.class)))) .hasAttributesSatisfying( - equalTo(RpcIncubatingAttributes.RPC_SYSTEM, testSource.serverSystem), - equalTo( - RpcIncubatingAttributes.RPC_SERVICE, testSource.remoteClassName), - equalTo(RpcIncubatingAttributes.RPC_METHOD, "exceptional"))); + equalTo(RPC_SYSTEM, testSource.serverSystem), + equalTo(RPC_SERVICE, testSource.remoteClassName), + equalTo(RPC_METHOD, "exceptional"))); } trace.hasSpansSatisfyingExactly(assertions); diff --git a/instrumentation/spring/spring-scheduling-3.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingTest.java b/instrumentation/spring/spring-scheduling-3.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingTest.java index eea1a23a4498..5061c0cf378c 100644 --- a/instrumentation/spring/spring-scheduling-3.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingTest.java +++ b/instrumentation/spring/spring-scheduling-3.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/scheduling/v3_1/SpringSchedulingTest.java @@ -8,6 +8,9 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_FUNCTION; import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_NAMESPACE; @@ -26,7 +29,6 @@ import io.opentelemetry.javaagent.instrumentation.spring.scheduling.v3_1.spring.config.TriggerTaskConfig; import io.opentelemetry.javaagent.instrumentation.spring.scheduling.v3_1.spring.service.LambdaTaskConfigurer; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ExceptionAttributes; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; @@ -166,11 +168,11 @@ void taskWithErrorTest() throws InterruptedException { .hasName("exception") .hasAttributesSatisfying( equalTo( - ExceptionAttributes.EXCEPTION_TYPE, + EXCEPTION_TYPE, IllegalStateException.class.getName()), - equalTo(ExceptionAttributes.EXCEPTION_MESSAGE, "failure"), + equalTo(EXCEPTION_MESSAGE, "failure"), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, + EXCEPTION_STACKTRACE, value -> value.isInstanceOf(String.class)))), span -> span.hasName("error-handler").hasParent(trace.getSpan(0)))); } diff --git a/instrumentation/spring/spring-web/spring-web-3.1/library/src/test/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebInstrumentationTest.java b/instrumentation/spring/spring-web/spring-web-3.1/library/src/test/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebInstrumentationTest.java index 6b40a8745475..1f6631c55d24 100644 --- a/instrumentation/spring/spring-web/spring-web-3.1/library/src/test/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebInstrumentationTest.java +++ b/instrumentation/spring/spring-web/spring-web-3.1/library/src/test/java/io/opentelemetry/instrumentation/spring/web/v3_1/SpringWebInstrumentationTest.java @@ -5,6 +5,7 @@ package io.opentelemetry.instrumentation.spring.web.v3_1; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; import static java.util.Collections.singletonList; import io.opentelemetry.api.common.AttributeKey; @@ -13,7 +14,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; -import io.opentelemetry.semconv.NetworkAttributes; import java.net.URI; import java.util.Collections; import java.util.HashSet; @@ -105,7 +105,7 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { uri -> { Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); return attributes; }); } diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/SpringWebfluxTest.java b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/SpringWebfluxTest.java index 2748191b7e83..ed267f43e832 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/SpringWebfluxTest.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/SpringWebfluxTest.java @@ -17,9 +17,13 @@ import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_PATH; +import static io.opentelemetry.semconv.UrlAttributes.URL_SCHEME; import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL; import static org.junit.jupiter.api.Named.named; @@ -29,8 +33,6 @@ import io.opentelemetry.sdk.testing.assertj.EventDataAssert; import io.opentelemetry.sdk.testing.assertj.TraceAssert; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.UrlAttributes; import io.opentelemetry.testing.internal.armeria.client.WebClient; import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse; import io.opentelemetry.testing.internal.armeria.common.HttpStatus; @@ -112,17 +114,15 @@ void basicGetTest(Parameter parameter) { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class)), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(SERVER_ADDRESS, "localhost"), satisfies(SERVER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(CLIENT_ADDRESS, "127.0.0.1"), - equalTo(UrlAttributes.URL_PATH, parameter.urlPath), + equalTo(URL_PATH, parameter.urlPath), equalTo(HTTP_REQUEST_METHOD, "GET"), equalTo(HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_SCHEME, "http"), + equalTo(URL_SCHEME, "http"), satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, parameter.urlPathWithVariables)), span -> { @@ -233,17 +233,15 @@ void getAsyncResponseTest(Parameter parameter) { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class)), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(SERVER_ADDRESS, "localhost"), satisfies(SERVER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(CLIENT_ADDRESS, "127.0.0.1"), - equalTo(UrlAttributes.URL_PATH, parameter.urlPath), + equalTo(URL_PATH, parameter.urlPath), equalTo(HTTP_REQUEST_METHOD, "GET"), equalTo(HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_SCHEME, "http"), + equalTo(URL_SCHEME, "http"), satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, parameter.urlPathWithVariables)), span -> { @@ -341,17 +339,15 @@ void createSpanDuringHandlerFunctionTest(Parameter parameter) { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class)), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(SERVER_ADDRESS, "localhost"), satisfies(SERVER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(CLIENT_ADDRESS, "127.0.0.1"), - equalTo(UrlAttributes.URL_PATH, parameter.urlPath), + equalTo(URL_PATH, parameter.urlPath), equalTo(HTTP_REQUEST_METHOD, "GET"), equalTo(HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_SCHEME, "http"), + equalTo(URL_SCHEME, "http"), satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, parameter.urlPathWithVariables)), span -> { @@ -414,17 +410,15 @@ void get404Test() { .hasStatus(StatusData.unset()) .hasAttributesSatisfyingExactly( equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class)), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(SERVER_ADDRESS, "localhost"), satisfies(SERVER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(CLIENT_ADDRESS, "127.0.0.1"), - equalTo(UrlAttributes.URL_PATH, "/notfoundgreet"), + equalTo(URL_PATH, "/notfoundgreet"), equalTo(HTTP_REQUEST_METHOD, "GET"), equalTo(HTTP_RESPONSE_STATUS_CODE, 404), - equalTo(UrlAttributes.URL_SCHEME, "http"), + equalTo(URL_SCHEME, "http"), satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, "/**")), span -> @@ -475,17 +469,15 @@ void basicPostTest() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class)), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(SERVER_ADDRESS, "localhost"), satisfies(SERVER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(CLIENT_ADDRESS, "127.0.0.1"), - equalTo(UrlAttributes.URL_PATH, "/echo"), + equalTo(URL_PATH, "/echo"), equalTo(HTTP_REQUEST_METHOD, "POST"), equalTo(HTTP_RESPONSE_STATUS_CODE, 202), - equalTo(UrlAttributes.URL_SCHEME, "http"), + equalTo(URL_SCHEME, "http"), satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, "/echo")), span -> @@ -516,17 +508,15 @@ void getToBadEndpointTest(Parameter parameter) { .hasStatus(StatusData.error()) .hasAttributesSatisfyingExactly( equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class)), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(SERVER_ADDRESS, "localhost"), satisfies(SERVER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(CLIENT_ADDRESS, "127.0.0.1"), - equalTo(UrlAttributes.URL_PATH, parameter.urlPath), + equalTo(URL_PATH, parameter.urlPath), equalTo(HTTP_REQUEST_METHOD, "GET"), equalTo(HTTP_RESPONSE_STATUS_CODE, 500), - equalTo(UrlAttributes.URL_SCHEME, "http"), + equalTo(URL_SCHEME, "http"), satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, parameter.urlPathWithVariables), equalTo(ERROR_TYPE, "500")), @@ -597,17 +587,15 @@ void redirectTest() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class)), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(SERVER_ADDRESS, "localhost"), satisfies(SERVER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(CLIENT_ADDRESS, "127.0.0.1"), - equalTo(UrlAttributes.URL_PATH, "/double-greet-redirect"), + equalTo(URL_PATH, "/double-greet-redirect"), equalTo(HTTP_REQUEST_METHOD, "GET"), equalTo(HTTP_RESPONSE_STATUS_CODE, 307), - equalTo(UrlAttributes.URL_SCHEME, "http"), + equalTo(URL_SCHEME, "http"), satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, "/double-greet-redirect")), span -> @@ -626,17 +614,15 @@ void redirectTest() { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class)), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(SERVER_ADDRESS, "localhost"), satisfies(SERVER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(CLIENT_ADDRESS, "127.0.0.1"), - equalTo(UrlAttributes.URL_PATH, "/double-greet"), + equalTo(URL_PATH, "/double-greet"), equalTo(HTTP_REQUEST_METHOD, "GET"), equalTo(HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_SCHEME, "http"), + equalTo(URL_SCHEME, "http"), satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, "/double-greet")), span -> { @@ -678,17 +664,15 @@ void multipleGetsToDelayingRoute(Parameter parameter) { .hasNoParent() .hasAttributesSatisfyingExactly( equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class)), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(SERVER_ADDRESS, "localhost"), satisfies(SERVER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(CLIENT_ADDRESS, "127.0.0.1"), - equalTo(UrlAttributes.URL_PATH, parameter.urlPath), + equalTo(URL_PATH, parameter.urlPath), equalTo(HTTP_REQUEST_METHOD, "GET"), equalTo(HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UrlAttributes.URL_SCHEME, "http"), + equalTo(URL_SCHEME, "http"), satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, parameter.urlPathWithVariables)), span -> { @@ -760,16 +744,14 @@ void cancelRequestTest() throws Exception { .hasStatus(StatusData.unset()) .hasAttributesSatisfyingExactly( equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - val -> val.isInstanceOf(Long.class)), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(SERVER_ADDRESS, "localhost"), satisfies(SERVER_PORT, val -> val.isInstanceOf(Long.class)), equalTo(CLIENT_ADDRESS, "127.0.0.1"), - equalTo(UrlAttributes.URL_PATH, "/slow"), + equalTo(URL_PATH, "/slow"), equalTo(HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_SCHEME, "http"), + equalTo(URL_SCHEME, "http"), satisfies(USER_AGENT_ORIGINAL, val -> val.isInstanceOf(String.class)), equalTo(HTTP_ROUTE, "/slow"), equalTo(ERROR_TYPE, "_OTHER")), diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/testing/src/main/java/io/opentelemetry/instrumentation/spring/webflux/client/AbstractSpringWebfluxClientInstrumentationTest.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/testing/src/main/java/io/opentelemetry/instrumentation/spring/webflux/client/AbstractSpringWebfluxClientInstrumentationTest.java index d7794f3e4469..671fd96996f8 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/testing/src/main/java/io/opentelemetry/instrumentation/spring/webflux/client/AbstractSpringWebfluxClientInstrumentationTest.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.3/testing/src/main/java/io/opentelemetry/instrumentation/spring/webflux/client/AbstractSpringWebfluxClientInstrumentationTest.java @@ -7,6 +7,12 @@ import static io.opentelemetry.api.trace.SpanKind.CLIENT; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static java.util.Collections.emptyMap; import static java.util.Objects.requireNonNull; import static org.assertj.core.api.Assertions.catchThrowable; @@ -17,11 +23,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.ErrorAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; @@ -89,7 +90,7 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { uri -> { Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + attributes.remove(NETWORK_PROTOCOL_VERSION); return attributes; }); @@ -184,11 +185,11 @@ void shouldEndSpanOnMonoTimeout() { .hasKind(CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(UrlAttributes.URL_FULL, uri.toString()), - equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort()), - equalTo(ErrorAttributes.ERROR_TYPE, "cancelled")), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(URL_FULL, uri.toString()), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, uri.getPort()), + equalTo(ERROR_TYPE, "cancelled")), span -> span.hasName("test-http-server") .hasKind(SpanKind.SERVER) diff --git a/instrumentation/spymemcached-2.12/javaagent/build.gradle.kts b/instrumentation/spymemcached-2.12/javaagent/build.gradle.kts index 3618eb930772..0f3c5a4ff953 100644 --- a/instrumentation/spymemcached-2.12/javaagent/build.gradle.kts +++ b/instrumentation/spymemcached-2.12/javaagent/build.gradle.kts @@ -20,8 +20,18 @@ dependencies { testImplementation("com.google.guava:guava") } -tasks.withType().configureEach { - // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.spymemcached.experimental-span-attributes=true") - usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) +tasks { + withType().configureEach { + // TODO run tests both with and without experimental span attributes + jvmArgs("-Dotel.instrumentation.spymemcached.experimental-span-attributes=true") + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/spymemcached-2.12/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedTest.java b/instrumentation/spymemcached-2.12/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedTest.java index c3206e60b68c..3847c23c7b3e 100644 --- a/instrumentation/spymemcached-2.12/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedTest.java +++ b/instrumentation/spymemcached-2.12/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedTest.java @@ -7,11 +7,14 @@ import static io.opentelemetry.api.common.AttributeKey.booleanKey; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; import static net.spy.memcached.ConnectionFactoryBuilder.Protocol.BINARY; @@ -144,9 +147,9 @@ void getHit() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), + equalTo(maybeStable(DB_OPERATION), "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -166,9 +169,9 @@ void getMiss() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), + equalTo(maybeStable(DB_OPERATION), "get"), equalTo(stringKey("spymemcached.result"), "miss")))); } @@ -201,9 +204,9 @@ void getCancel() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), + equalTo(maybeStable(DB_OPERATION), "get"), equalTo(booleanKey("spymemcached.command.cancelled"), true)))); } @@ -256,9 +259,9 @@ void getTimeout() throws InterruptedException { val -> val.isInstanceOf(String.class)))) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "get")))); + equalTo(maybeStable(DB_OPERATION), "get")))); } @Test @@ -284,9 +287,9 @@ void bulkGet() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "getBulk")))); + equalTo(maybeStable(DB_OPERATION), "getBulk")))); } @Test @@ -308,9 +311,9 @@ void set() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "set")))); + equalTo(maybeStable(DB_OPERATION), "set")))); } @Test @@ -344,9 +347,9 @@ void setCancel() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "set"), + equalTo(maybeStable(DB_OPERATION), "set"), equalTo(booleanKey("spymemcached.command.cancelled"), true)))); } @@ -370,18 +373,18 @@ void add() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "add")), + equalTo(maybeStable(DB_OPERATION), "add")), span -> span.hasName("get") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), + equalTo(maybeStable(DB_OPERATION), "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -406,18 +409,18 @@ void secondAdd() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "add")), + equalTo(maybeStable(DB_OPERATION), "add")), span -> span.hasName("add") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "add")))); + equalTo(maybeStable(DB_OPERATION), "add")))); } @Test @@ -440,18 +443,18 @@ void delete() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "delete")), + equalTo(maybeStable(DB_OPERATION), "delete")), span -> span.hasName("get") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), + equalTo(maybeStable(DB_OPERATION), "get"), equalTo(stringKey("spymemcached.result"), "miss")))); } @@ -474,9 +477,9 @@ void deleteNonExistent() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "delete")))); + equalTo(maybeStable(DB_OPERATION), "delete")))); } @Test @@ -500,18 +503,18 @@ void replace() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "replace")), + equalTo(maybeStable(DB_OPERATION), "replace")), span -> span.hasName("get") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), + equalTo(maybeStable(DB_OPERATION), "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -538,9 +541,9 @@ void replaceNonExistent() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "replace")))); + equalTo(maybeStable(DB_OPERATION), "replace")))); } @Test @@ -565,27 +568,27 @@ void append() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "gets")), + equalTo(maybeStable(DB_OPERATION), "gets")), span -> span.hasName("append") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "append")), + equalTo(maybeStable(DB_OPERATION), "append")), span -> span.hasName("get") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), + equalTo(maybeStable(DB_OPERATION), "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -611,27 +614,27 @@ void prepend() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "gets")), + equalTo(maybeStable(DB_OPERATION), "gets")), span -> span.hasName("prepend") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "prepend")), + equalTo(maybeStable(DB_OPERATION), "prepend")), span -> span.hasName("get") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), + equalTo(maybeStable(DB_OPERATION), "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -657,18 +660,18 @@ void cas() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "gets")), + equalTo(maybeStable(DB_OPERATION), "gets")), span -> span.hasName("cas") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "cas")))); + equalTo(maybeStable(DB_OPERATION), "cas")))); } @Test @@ -692,9 +695,9 @@ void casNotFound() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "cas")))); + equalTo(maybeStable(DB_OPERATION), "cas")))); } @Test @@ -716,9 +719,9 @@ void touch() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "touch")))); + equalTo(maybeStable(DB_OPERATION), "touch")))); } @Test @@ -741,9 +744,9 @@ void touchNonExistent() throws Exception { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "touch")))); + equalTo(maybeStable(DB_OPERATION), "touch")))); } @Test @@ -766,9 +769,9 @@ void getAndTouch() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "getAndTouch")))); + equalTo(maybeStable(DB_OPERATION), "getAndTouch")))); } @Test @@ -791,9 +794,9 @@ void getAndTouchNonExistent() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "getAndTouch")))); + equalTo(maybeStable(DB_OPERATION), "getAndTouch")))); } @Test @@ -820,18 +823,18 @@ it needs values to be strings (with digits in them) and it returns actual long f .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "decr")), + equalTo(maybeStable(DB_OPERATION), "decr")), span -> span.hasName("get") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), + equalTo(maybeStable(DB_OPERATION), "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -854,9 +857,9 @@ void decrNonExistent() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "decr")))); + equalTo(maybeStable(DB_OPERATION), "decr")))); } @Test @@ -877,9 +880,9 @@ void decrException() { new IllegalArgumentException("Key is too long (maxlen = 250)")) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "decr")))); + equalTo(maybeStable(DB_OPERATION), "decr")))); } @Test @@ -906,18 +909,18 @@ it needs values to be strings (with digits in them) and it returns actual long f .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "incr")), + equalTo(maybeStable(DB_OPERATION), "incr")), span -> span.hasName("get") .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), + equalTo(maybeStable(DB_OPERATION), "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -940,9 +943,9 @@ void incrNonExistent() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "incr")))); + equalTo(maybeStable(DB_OPERATION), "incr")))); } @Test @@ -963,9 +966,9 @@ void incrException() { new IllegalArgumentException("Key is too long (maxlen = 250)")) .hasAttributesSatisfyingExactly( equalTo( - DbIncubatingAttributes.DB_SYSTEM, + DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), - equalTo(DbIncubatingAttributes.DB_OPERATION, "incr")))); + equalTo(maybeStable(DB_OPERATION), "incr")))); } private static String key(String k) { diff --git a/instrumentation/undertow-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowServerDispatchTest.java b/instrumentation/undertow-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowServerDispatchTest.java index 3bc1df859e5b..79267290fd50 100644 --- a/instrumentation/undertow-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowServerDispatchTest.java +++ b/instrumentation/undertow-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowServerDispatchTest.java @@ -11,13 +11,13 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; import com.google.common.collect.ImmutableSet; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; -import io.opentelemetry.semconv.NetworkAttributes; import io.undertow.Handlers; import io.undertow.Undertow; import io.undertow.util.Headers; @@ -130,6 +130,6 @@ protected void configure(HttpServerTestOptions options) { options.setTestException(false); options.setHasResponseCustomizer(endpoint -> true); - options.setHttpAttributes(endpoint -> ImmutableSet.of(NetworkAttributes.NETWORK_PEER_PORT)); + options.setHttpAttributes(endpoint -> ImmutableSet.of(NETWORK_PEER_PORT)); } } diff --git a/instrumentation/undertow-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowServerTest.java b/instrumentation/undertow-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowServerTest.java index 442a2d0418de..c9bd2e31a7e5 100644 --- a/instrumentation/undertow-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowServerTest.java +++ b/instrumentation/undertow-1.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowServerTest.java @@ -14,6 +14,20 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ClientAttributes.CLIENT_ADDRESS; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE; +import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; +import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.UrlAttributes.URL_PATH; +import static io.opentelemetry.semconv.UrlAttributes.URL_SCHEME; +import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL; import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.ImmutableSet; @@ -23,13 +37,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; -import io.opentelemetry.semconv.ClientAttributes; -import io.opentelemetry.semconv.ExceptionAttributes; -import io.opentelemetry.semconv.HttpAttributes; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.UrlAttributes; -import io.opentelemetry.semconv.UserAgentAttributes; import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse; import io.undertow.Handlers; import io.undertow.Undertow; @@ -161,7 +168,7 @@ public void stopServer(Undertow undertow) { @Override protected void configure(HttpServerTestOptions options) { super.configure(options); - options.setHttpAttributes(endpoint -> ImmutableSet.of(NetworkAttributes.NETWORK_PEER_PORT)); + options.setHttpAttributes(endpoint -> ImmutableSet.of(NETWORK_PEER_PORT)); options.setHasResponseCustomizer(serverEndpoint -> true); options.setUseHttp2(useHttp2()); } @@ -192,21 +199,17 @@ void testSendResponse() { event -> event.hasName("before-event"), event -> event.hasName("after-event")) .hasAttributesSatisfyingExactly( - equalTo(ClientAttributes.CLIENT_ADDRESS, TEST_CLIENT_IP), - equalTo(UrlAttributes.URL_SCHEME, uri.getScheme()), - equalTo(UrlAttributes.URL_PATH, uri.getPath()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UserAgentAttributes.USER_AGENT_ORIGINAL, TEST_USER_AGENT), - equalTo( - NetworkAttributes.NETWORK_PROTOCOL_VERSION, - useHttp2() ? "2" : "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - k -> k.isInstanceOf(Long.class))), + equalTo(CLIENT_ADDRESS, TEST_CLIENT_IP), + equalTo(URL_SCHEME, uri.getScheme()), + equalTo(URL_PATH, uri.getPath()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(USER_AGENT_ORIGINAL, TEST_USER_AGENT), + equalTo(NETWORK_PROTOCOL_VERSION, useHttp2() ? "2" : "1.1"), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class))), span -> span.hasName("sendResponse") .hasKind(SpanKind.INTERNAL) @@ -236,31 +239,24 @@ void testSendResponseWithException() { event .hasName("exception") .hasAttributesSatisfyingExactly( + equalTo(EXCEPTION_TYPE, Exception.class.getName()), equalTo( - ExceptionAttributes.EXCEPTION_TYPE, - Exception.class.getName()), - equalTo( - ExceptionAttributes.EXCEPTION_MESSAGE, - "exception after sending response"), + EXCEPTION_MESSAGE, "exception after sending response"), satisfies( - ExceptionAttributes.EXCEPTION_STACKTRACE, + EXCEPTION_STACKTRACE, val -> val.isInstanceOf(String.class)))) .hasAttributesSatisfyingExactly( - equalTo(ClientAttributes.CLIENT_ADDRESS, TEST_CLIENT_IP), - equalTo(UrlAttributes.URL_SCHEME, uri.getScheme()), - equalTo(UrlAttributes.URL_PATH, uri.getPath()), - equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"), - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), - equalTo(UserAgentAttributes.USER_AGENT_ORIGINAL, TEST_USER_AGENT), - equalTo( - NetworkAttributes.NETWORK_PROTOCOL_VERSION, - useHttp2() ? "2" : "1.1"), - equalTo(ServerAttributes.SERVER_ADDRESS, uri.getHost()), - equalTo(ServerAttributes.SERVER_PORT, uri.getPort()), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies( - NetworkAttributes.NETWORK_PEER_PORT, - k -> k.isInstanceOf(Long.class))), + equalTo(CLIENT_ADDRESS, TEST_CLIENT_IP), + equalTo(URL_SCHEME, uri.getScheme()), + equalTo(URL_PATH, uri.getPath()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200), + equalTo(USER_AGENT_ORIGINAL, TEST_USER_AGENT), + equalTo(NETWORK_PROTOCOL_VERSION, useHttp2() ? "2" : "1.1"), + equalTo(SERVER_ADDRESS, uri.getHost()), + equalTo(SERVER_PORT, uri.getPort()), + equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1"), + satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class))), span -> span.hasName("sendResponseWithException") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxHttpClientTest.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxHttpClientTest.java index 6699579bb757..c012b3996da8 100644 --- a/instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxHttpClientTest.java +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxHttpClientTest.java @@ -5,6 +5,10 @@ package io.opentelemetry.javaagent.instrumentation.vertx.v3_0.client; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; + import client.VertxSingleConnection; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; @@ -13,8 +17,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.SingleConnection; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; import io.vertx.core.Vertx; import io.vertx.core.VertxOptions; import io.vertx.core.http.HttpClient; @@ -90,9 +92,9 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) { uri -> { Set> attributes = new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); - attributes.remove(ServerAttributes.SERVER_ADDRESS); - attributes.remove(ServerAttributes.SERVER_PORT); + attributes.remove(NETWORK_PROTOCOL_VERSION); + attributes.remove(SERVER_ADDRESS); + attributes.remove(SERVER_PORT); return attributes; }); diff --git a/instrumentation/vertx/vertx-kafka-client-3.6/javaagent/build.gradle.kts b/instrumentation/vertx/vertx-kafka-client-3.6/javaagent/build.gradle.kts index 7bb1ac162fbc..5d0909919feb 100644 --- a/instrumentation/vertx/vertx-kafka-client-3.6/javaagent/build.gradle.kts +++ b/instrumentation/vertx/vertx-kafka-client-3.6/javaagent/build.gradle.kts @@ -34,8 +34,8 @@ testing { // the "library" configuration is not recognized by the test suite plugin if (latestDepTest) { - implementation("io.vertx:vertx-kafka-client:+") - implementation("io.vertx:vertx-codegen:+") + implementation("io.vertx:vertx-kafka-client:latest.release") + implementation("io.vertx:vertx-codegen:latest.release") } else { implementation("io.vertx:vertx-kafka-client:3.6.0") implementation("io.vertx:vertx-codegen:3.6.0") diff --git a/instrumentation/vertx/vertx-kafka-client-3.6/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/kafka/v3_6/AbstractVertxKafkaTest.java b/instrumentation/vertx/vertx-kafka-client-3.6/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/kafka/v3_6/AbstractVertxKafkaTest.java index ecc5c91d0b76..986b6e964b96 100644 --- a/instrumentation/vertx/vertx-kafka-client-3.6/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/kafka/v3_6/AbstractVertxKafkaTest.java +++ b/instrumentation/vertx/vertx-kafka-client-3.6/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/kafka/v3_6/AbstractVertxKafkaTest.java @@ -7,13 +7,21 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import static org.junit.jupiter.api.Assertions.assertTrue; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import io.vertx.core.AsyncResult; import io.vertx.core.Handler; import io.vertx.core.Vertx; @@ -201,22 +209,17 @@ protected static List sendAttributes( List assertions = new ArrayList<>( Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, record.topic()), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, record.topic()), + equalTo(MESSAGING_OPERATION, "publish"), satisfies( AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("producer")), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), - satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative))); + satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), + satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative))); String messageKey = record.key(); if (messageKey != null) { - assertions.add( - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, messageKey)); + assertions.add(equalTo(MESSAGING_KAFKA_MESSAGE_KEY, messageKey)); } return assertions; } @@ -234,18 +237,16 @@ private static List batchConsumerAttributes(String topic, St List assertions = new ArrayList<>( Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, topic), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, operation), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, topic), + equalTo(MESSAGING_OPERATION, operation), satisfies( AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("consumer")), - satisfies( - MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, - AbstractLongAssert::isPositive))); + satisfies(MESSAGING_BATCH_MESSAGE_COUNT, AbstractLongAssert::isPositive))); // consumer group is not available in version 0.11 if (Boolean.getBoolean("testLatestDeps")) { - assertions.add(equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test")); + assertions.add(equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test")); } return assertions; } @@ -256,18 +257,14 @@ protected static List processAttributes( List assertions = new ArrayList<>( Arrays.asList( - equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), - equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, record.topic()), - equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + equalTo(MESSAGING_SYSTEM, "kafka"), + equalTo(MESSAGING_DESTINATION_NAME, record.topic()), + equalTo(MESSAGING_OPERATION, "process"), satisfies( AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("consumer")), - satisfies( - MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, - AbstractStringAssert::isNotEmpty), - satisfies( - MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, - AbstractLongAssert::isNotNegative))); + satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), + satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative))); if (Boolean.getBoolean("otel.instrumentation.kafka.experimental-span-attributes")) { assertions.add( satisfies( @@ -276,19 +273,17 @@ protected static List processAttributes( } // consumer group is not available in version 0.11 if (Boolean.getBoolean("testLatestDeps")) { - assertions.add(equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test")); + assertions.add(equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test")); } String messageKey = record.key(); if (messageKey != null) { - assertions.add( - equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, messageKey)); + assertions.add(equalTo(MESSAGING_KAFKA_MESSAGE_KEY, messageKey)); } String messageValue = record.value(); if (messageValue != null) { assertions.add( equalTo( - MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, - messageValue.getBytes(StandardCharsets.UTF_8).length)); + MESSAGING_MESSAGE_BODY_SIZE, messageValue.getBytes(StandardCharsets.UTF_8).length)); } return assertions; } diff --git a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientTest.java b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientTest.java index 5df51cf79108..b9fe12edad39 100644 --- a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientTest.java +++ b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientTest.java @@ -5,18 +5,23 @@ package io.opentelemetry.javaagent.instrumentation.vertx.v4_0.redis; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; +import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.NetworkAttributes; -import io.opentelemetry.semconv.ServerAttributes; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import io.vertx.core.Vertx; import io.vertx.redis.client.Redis; import io.vertx.redis.client.RedisAPI; @@ -204,27 +209,27 @@ void commandWithNoArguments() throws Exception { @SuppressWarnings("deprecation") // using deprecated semconv private static AttributeAssertion[] redisSpanAttributes(String operation, String statement) { // not testing database/dup - if (SemconvStability.emitStableDatabaseSemconv()) { + if (emitStableDatabaseSemconv()) { return new AttributeAssertion[] { - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DB_SYSTEM, "redis"), equalTo(AttributeKey.stringKey("db.query.text"), statement), equalTo(AttributeKey.stringKey("db.operation.name"), operation), equalTo(AttributeKey.stringKey("db.namespace"), "1"), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip) + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(NETWORK_PEER_PORT, port), + equalTo(NETWORK_PEER_ADDRESS, ip) }; } else { return new AttributeAssertion[] { - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, statement), - equalTo(DbIncubatingAttributes.DB_OPERATION, operation), - equalTo(DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX, 1), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip) + equalTo(DB_SYSTEM, "redis"), + equalTo(DB_STATEMENT, statement), + equalTo(DB_OPERATION, operation), + equalTo(DB_REDIS_DATABASE_INDEX, 1), + equalTo(SERVER_ADDRESS, host), + equalTo(SERVER_PORT, port), + equalTo(NETWORK_PEER_PORT, port), + equalTo(NETWORK_PEER_ADDRESS, ip) }; } } diff --git a/instrumentation/vertx/vertx-rx-java-3.5/javaagent/build.gradle.kts b/instrumentation/vertx/vertx-rx-java-3.5/javaagent/build.gradle.kts index 4637b180ed07..b6f3ce7536d6 100644 --- a/instrumentation/vertx/vertx-rx-java-3.5/javaagent/build.gradle.kts +++ b/instrumentation/vertx/vertx-rx-java-3.5/javaagent/build.gradle.kts @@ -44,11 +44,11 @@ testing { dependencies { implementation("org.hsqldb:hsqldb:2.3.4") - implementation("io.vertx:vertx-web:+") - implementation("io.vertx:vertx-rx-java2:+") - implementation("io.vertx:vertx-web-client:+") - implementation("io.vertx:vertx-jdbc-client:+") - implementation("io.vertx:vertx-circuit-breaker:+") + implementation("io.vertx:vertx-web:latest.release") + implementation("io.vertx:vertx-rx-java2:latest.release") + implementation("io.vertx:vertx-web-client:latest.release") + implementation("io.vertx:vertx-jdbc-client:latest.release") + implementation("io.vertx:vertx-circuit-breaker:latest.release") } } } diff --git a/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/latestDepTest/groovy/VertxReactivePropagationTest.groovy b/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/latestDepTest/groovy/VertxReactivePropagationTest.groovy index 7e776c9ab177..bcb75491eefc 100644 --- a/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/latestDepTest/groovy/VertxReactivePropagationTest.groovy +++ b/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/latestDepTest/groovy/VertxReactivePropagationTest.groovy @@ -9,13 +9,13 @@ import io.opentelemetry.api.trace.SpanKind import io.opentelemetry.context.Context import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification import io.opentelemetry.instrumentation.test.utils.PortUtils -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes -import io.opentelemetry.semconv.ServerAttributes import io.opentelemetry.semconv.ClientAttributes -import io.opentelemetry.semconv.UserAgentAttributes import io.opentelemetry.semconv.HttpAttributes import io.opentelemetry.semconv.NetworkAttributes +import io.opentelemetry.semconv.ServerAttributes import io.opentelemetry.semconv.UrlAttributes +import io.opentelemetry.semconv.UserAgentAttributes +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes import io.opentelemetry.testing.internal.armeria.client.WebClient import io.opentelemetry.testing.internal.armeria.common.HttpRequest import io.opentelemetry.testing.internal.armeria.common.HttpRequestBuilder @@ -29,6 +29,8 @@ import static VertxReactiveWebServer.TEST_REQUEST_ID_ATTRIBUTE import static VertxReactiveWebServer.TEST_REQUEST_ID_PARAMETER import static io.opentelemetry.api.trace.SpanKind.CLIENT import static io.opentelemetry.api.trace.SpanKind.SERVER +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS class VertxReactivePropagationTest extends AgentInstrumentationSpecification { @@ -99,12 +101,12 @@ class VertxReactivePropagationTest extends AgentInstrumentationSpecification { childOf span(2) attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "SA" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" "SELECT id, name, price, weight FROM products" - "$DbIncubatingAttributes.DB_OPERATION" "SELECT" - "$DbIncubatingAttributes.DB_SQL_TABLE" "products" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "SA" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" "SELECT id, name, price, weight FROM products" + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "SELECT" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "products" } } } @@ -199,12 +201,12 @@ class VertxReactivePropagationTest extends AgentInstrumentationSpecification { childOf(span(3)) attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "SA" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" "SELECT id AS request$requestId, name, price, weight FROM products" - "$DbIncubatingAttributes.DB_OPERATION" "SELECT" - "$DbIncubatingAttributes.DB_SQL_TABLE" "products" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "SA" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" "SELECT id AS request$requestId, name, price, weight FROM products" + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "SELECT" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "products" } } } diff --git a/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/version35Test/groovy/VertxReactivePropagationTest.groovy b/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/version35Test/groovy/VertxReactivePropagationTest.groovy index 9490912c8f93..51cf2101432f 100644 --- a/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/version35Test/groovy/VertxReactivePropagationTest.groovy +++ b/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/version35Test/groovy/VertxReactivePropagationTest.groovy @@ -9,13 +9,13 @@ import io.opentelemetry.api.trace.SpanKind import io.opentelemetry.context.Context import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification import io.opentelemetry.instrumentation.test.utils.PortUtils -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes -import io.opentelemetry.semconv.ServerAttributes import io.opentelemetry.semconv.ClientAttributes -import io.opentelemetry.semconv.UserAgentAttributes import io.opentelemetry.semconv.HttpAttributes import io.opentelemetry.semconv.NetworkAttributes +import io.opentelemetry.semconv.ServerAttributes import io.opentelemetry.semconv.UrlAttributes +import io.opentelemetry.semconv.UserAgentAttributes +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes import io.opentelemetry.testing.internal.armeria.client.WebClient import io.opentelemetry.testing.internal.armeria.common.HttpRequest import io.opentelemetry.testing.internal.armeria.common.HttpRequestBuilder @@ -29,6 +29,8 @@ import static VertxReactiveWebServer.TEST_REQUEST_ID_ATTRIBUTE import static VertxReactiveWebServer.TEST_REQUEST_ID_PARAMETER import static io.opentelemetry.api.trace.SpanKind.CLIENT import static io.opentelemetry.api.trace.SpanKind.SERVER +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS class VertxReactivePropagationTest extends AgentInstrumentationSpecification { @@ -99,12 +101,12 @@ class VertxReactivePropagationTest extends AgentInstrumentationSpecification { childOf span(2) attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "SA" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" "SELECT id, name, price, weight FROM products" - "$DbIncubatingAttributes.DB_OPERATION" "SELECT" - "$DbIncubatingAttributes.DB_SQL_TABLE" "products" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "SA" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" "SELECT id, name, price, weight FROM products" + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "SELECT" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "products" } } } @@ -198,12 +200,12 @@ class VertxReactivePropagationTest extends AgentInstrumentationSpecification { childOf(span(3)) attributes { "$DbIncubatingAttributes.DB_SYSTEM" "hsqldb" - "$DbIncubatingAttributes.DB_NAME" "test" - "$DbIncubatingAttributes.DB_USER" "SA" - "$DbIncubatingAttributes.DB_CONNECTION_STRING" "hsqldb:mem:" - "$DbIncubatingAttributes.DB_STATEMENT" "SELECT id AS request$requestId, name, price, weight FROM products" - "$DbIncubatingAttributes.DB_OPERATION" "SELECT" - "$DbIncubatingAttributes.DB_SQL_TABLE" "products" + "${maybeStable(DbIncubatingAttributes.DB_NAME)}" "test" + "$DbIncubatingAttributes.DB_USER" emitStableDatabaseSemconv() ? null : "SA" + "$DbIncubatingAttributes.DB_CONNECTION_STRING" emitStableDatabaseSemconv() ? null : "hsqldb:mem:" + "${maybeStable(DbIncubatingAttributes.DB_STATEMENT)}" "SELECT id AS request$requestId, name, price, weight FROM products" + "${maybeStable(DbIncubatingAttributes.DB_OPERATION)}" "SELECT" + "${maybeStable(DbIncubatingAttributes.DB_SQL_TABLE)}" "products" } } } diff --git a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/build.gradle.kts b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/build.gradle.kts index d28083b74749..eff4457a3eec 100644 --- a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/build.gradle.kts +++ b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/build.gradle.kts @@ -25,6 +25,14 @@ tasks { withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } val latestDepTest = findProperty("testLatestDeps") as Boolean diff --git a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientTest.java b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientTest.java index c870b6b87230..5b30c2efe62f 100644 --- a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientTest.java +++ b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientTest.java @@ -5,6 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.vertx.v4_0.sql; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE; @@ -12,6 +14,11 @@ import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; @@ -19,7 +26,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.TraceAssert; import io.opentelemetry.sdk.trace.data.StatusData; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import io.vertx.core.Vertx; import io.vertx.pgclient.PgConnectOptions; import io.vertx.pgclient.PgException; @@ -134,11 +140,11 @@ void testSimpleSelect() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_NAME, DB), - equalTo(DbIncubatingAttributes.DB_USER, USER_DB), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "select * from test"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "test"), + equalTo(maybeStable(DB_NAME), DB), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB), + equalTo(maybeStable(DB_STATEMENT), "select * from test"), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "test"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)), span -> @@ -190,9 +196,9 @@ void testInvalidQuery() throws Exception { EXCEPTION_STACKTRACE, val -> val.isInstanceOf(String.class)))) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_NAME, DB), - equalTo(DbIncubatingAttributes.DB_USER, USER_DB), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "invalid"), + equalTo(maybeStable(DB_NAME), DB), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB), + equalTo(maybeStable(DB_STATEMENT), "invalid"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)), span -> @@ -224,13 +230,11 @@ private static void assertPreparedSelect() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_NAME, DB), - equalTo(DbIncubatingAttributes.DB_USER, USER_DB), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "select * from test where id = $1"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "test"), + equalTo(maybeStable(DB_NAME), DB), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB), + equalTo(maybeStable(DB_STATEMENT), "select * from test where id = $1"), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "test"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)))); } @@ -256,13 +260,13 @@ void testBatch() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_NAME, DB), - equalTo(DbIncubatingAttributes.DB_USER, USER_DB), + equalTo(maybeStable(DB_NAME), DB), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + maybeStable(DB_STATEMENT), "insert into test values ($1, $2) returning *"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "INSERT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "test"), + equalTo(maybeStable(DB_OPERATION), "INSERT"), + equalTo(maybeStable(DB_SQL_TABLE), "test"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)))); } @@ -344,11 +348,11 @@ void testManyQueries() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_NAME, DB), - equalTo(DbIncubatingAttributes.DB_USER, USER_DB), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "select * from test"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "test"), + equalTo(maybeStable(DB_NAME), DB), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB), + equalTo(maybeStable(DB_STATEMENT), "select * from test"), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "test"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)), span -> @@ -409,13 +413,12 @@ void testConcurrency() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DbIncubatingAttributes.DB_NAME, DB), - equalTo(DbIncubatingAttributes.DB_USER, USER_DB), + equalTo(maybeStable(DB_NAME), DB), + equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB), equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "select * from test where id = $1"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "test"), + maybeStable(DB_STATEMENT), "select * from test where id = $1"), + equalTo(maybeStable(DB_OPERATION), "SELECT"), + equalTo(maybeStable(DB_SQL_TABLE), "test"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)), span -> diff --git a/instrumentation/vertx/vertx-web-3.0/javaagent/build.gradle.kts b/instrumentation/vertx/vertx-web-3.0/javaagent/build.gradle.kts index 7a58ec9e2662..8d359cbe462b 100644 --- a/instrumentation/vertx/vertx-web-3.0/javaagent/build.gradle.kts +++ b/instrumentation/vertx/vertx-web-3.0/javaagent/build.gradle.kts @@ -37,9 +37,9 @@ testing { dependencies { implementation(project(":instrumentation:vertx:vertx-web-3.0:testing")) - implementation("io.vertx:vertx-web:+") - implementation("io.vertx:vertx-jdbc-client:+") - implementation("io.vertx:vertx-codegen:+") + implementation("io.vertx:vertx-web:latest.release") + implementation("io.vertx:vertx-jdbc-client:latest.release") + implementation("io.vertx:vertx-codegen:latest.release") } } } diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/OpenTelemetrySdkAccess.java b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/OpenTelemetrySdkAccess.java index 2a966b3e665a..1dc7ce6d1cc7 100644 --- a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/OpenTelemetrySdkAccess.java +++ b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/OpenTelemetrySdkAccess.java @@ -22,13 +22,19 @@ public final class OpenTelemetrySdkAccess { */ public interface ForceFlusher { /** Executes force flush. */ - void run(int timeout, TimeUnit unit); + void run(long timeout, TimeUnit unit); } private static volatile ForceFlusher forceFlush; - /** Forces flushing of pending spans. */ + /** Forces flushing of pending telemetry. */ + @Deprecated public static void forceFlush(int timeout, TimeUnit unit) { + forceFlush((long) timeout, unit); + } + + /** Forces flushing of pending telemetry. */ + public static void forceFlush(long timeout, TimeUnit unit) { forceFlush.run(timeout, unit); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java index 8cf043d0e4d3..4d13036dab24 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java @@ -224,7 +224,7 @@ private static void installEarlyInstrumentation( (builder, typeDescription, classLoader, module, protectionDomain) -> builder); VirtualFieldImplementationInstallerFactory virtualFieldInstallerFactory = - new VirtualFieldImplementationInstallerFactory(); + VirtualFieldImplementationInstallerFactory.getInstance(); for (EarlyInstrumentationModule earlyInstrumentationModule : loadOrdered(EarlyInstrumentationModule.class, Utils.getExtensionsClassLoader())) { diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/VirtualFieldImplementationInstallerFactory.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/VirtualFieldImplementationInstallerFactory.java index 3da93ab694c2..c83aa3797843 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/VirtualFieldImplementationInstallerFactory.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/VirtualFieldImplementationInstallerFactory.java @@ -18,11 +18,17 @@ public final class VirtualFieldImplementationInstallerFactory { private static final TransformSafeLogger logger = TransformSafeLogger.getLogger(VirtualFieldImplementationInstallerFactory.class); + private static final VirtualFieldImplementationInstallerFactory INSTANCE = + new VirtualFieldImplementationInstallerFactory(); - public VirtualFieldImplementationInstallerFactory() { + private VirtualFieldImplementationInstallerFactory() { RuntimeVirtualFieldSupplier.set(new RuntimeFieldBasedImplementationSupplier()); } + public static VirtualFieldImplementationInstallerFactory getInstance() { + return INSTANCE; + } + public VirtualFieldImplementationInstaller create(InstrumentationModule instrumentationModule) { VirtualFieldMappingsBuilderImpl builder = new VirtualFieldMappingsBuilderImpl(); if (instrumentationModule instanceof InstrumentationModuleMuzzle) { diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java index b4ea4b948639..09bc519812a9 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java @@ -54,7 +54,7 @@ public final class InstrumentationModuleInstaller { private final Instrumentation instrumentation; private final VirtualFieldImplementationInstallerFactory virtualFieldInstallerFactory = - new VirtualFieldImplementationInstallerFactory(); + VirtualFieldImplementationInstallerFactory.getInstance(); public InstrumentationModuleInstaller(Instrumentation instrumentation) { this.instrumentation = instrumentation; diff --git a/javaagent/build.gradle.kts b/javaagent/build.gradle.kts index 2fc622d2b38e..e2437327b834 100644 --- a/javaagent/build.gradle.kts +++ b/javaagent/build.gradle.kts @@ -421,5 +421,6 @@ class JavaagentProvider( ) : CommandLineArgumentProvider { override fun asArguments(): Iterable = listOf( "-javaagent:${file(agentJar).absolutePath}", + "-Dotel.javaagent.testing.transform-safe-logging.enabled=true" ) } diff --git a/licenses/licenses.md b/licenses/licenses.md index 092ac23dcaa8..39d5f6003bf1 100644 --- a/licenses/licenses.md +++ b/licenses/licenses.md @@ -59,91 +59,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) -**11** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api` **Version:** `1.43.0` +**11** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api` **Version:** `1.44.1` > - **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) -**12** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api-incubator` **Version:** `1.43.0-alpha` +**12** **Group:** `io.opentelemetry` **Name:** `opentelemetry-api-incubator` **Version:** `1.44.1-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) -**13** **Group:** `io.opentelemetry` **Name:** `opentelemetry-context` **Version:** `1.43.0` +**13** **Group:** `io.opentelemetry` **Name:** `opentelemetry-context` **Version:** `1.44.1` > - **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-exporter-common` **Version:** `1.43.0` +**14** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-common` **Version:** `1.44.1` > - **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) -**15** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging` **Version:** `1.43.0` +**15** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging` **Version:** `1.44.1` > - **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-otlp` **Version:** `1.43.0` +**16** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-logging-otlp` **Version:** `1.44.1` > - **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-otlp` **Version:** `1.43.0` +**17** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp` **Version:** `1.44.1` > - **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-common` **Version:** `1.43.0` +**18** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-otlp-common` **Version:** `1.44.1` > - **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-prometheus` **Version:** `1.43.0-alpha` +**19** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-prometheus` **Version:** `1.44.1-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) -**20** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-sender-okhttp` **Version:** `1.43.0` +**20** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-sender-okhttp` **Version:** `1.44.1` > - **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-zipkin` **Version:** `1.43.0` +**21** **Group:** `io.opentelemetry` **Name:** `opentelemetry-exporter-zipkin` **Version:** `1.44.1` > - **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-extension-kotlin` **Version:** `1.43.0` +**22** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-kotlin` **Version:** `1.44.1` > - **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-trace-propagators` **Version:** `1.43.0` +**23** **Group:** `io.opentelemetry` **Name:** `opentelemetry-extension-trace-propagators` **Version:** `1.44.1` > - **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-sdk` **Version:** `1.43.0` +**24** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk` **Version:** `1.44.1` > - **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-common` **Version:** `1.43.0` +**25** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-common` **Version:** `1.44.1` > - **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-extension-autoconfigure` **Version:** `1.43.0` +**26** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure` **Version:** `1.44.1` > - **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-spi` **Version:** `1.43.0` +**27** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-autoconfigure-spi` **Version:** `1.44.1` > - **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-incubator` **Version:** `1.43.0-alpha` +**28** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-incubator` **Version:** `1.44.1-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) -**29** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-jaeger-remote-sampler` **Version:** `1.43.0` +**29** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-extension-jaeger-remote-sampler` **Version:** `1.44.1` > - **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-logs` **Version:** `1.43.0` +**30** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-logs` **Version:** `1.44.1` > - **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-metrics` **Version:** `1.43.0` +**31** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-metrics` **Version:** `1.44.1` > - **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-trace` **Version:** `1.43.0` +**32** **Group:** `io.opentelemetry` **Name:** `opentelemetry-sdk-trace` **Version:** `1.44.1` > - **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) @@ -171,156 +171,153 @@ > - **POM Project URL**: [https://github.com/open-telemetry/semantic-conventions-java](https://github.com/open-telemetry/semantic-conventions-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**39** **Group:** `io.prometheus` **Name:** `prometheus-metrics-config` **Version:** `1.3.1` +**39** **Group:** `io.prometheus` **Name:** `prometheus-metrics-config` **Version:** `1.3.3` > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**40** **Group:** `io.prometheus` **Name:** `prometheus-metrics-exporter-common` **Version:** `1.3.1` +**40** **Group:** `io.prometheus` **Name:** `prometheus-metrics-exporter-common` **Version:** `1.3.3` > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**41** **Group:** `io.prometheus` **Name:** `prometheus-metrics-exporter-httpserver` **Version:** `1.3.1` +**41** **Group:** `io.prometheus` **Name:** `prometheus-metrics-exporter-httpserver` **Version:** `1.3.3` > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**42** **Group:** `io.prometheus` **Name:** `prometheus-metrics-exposition-formats` **Version:** `1.3.1` +**42** **Group:** `io.prometheus` **Name:** `prometheus-metrics-exposition-formats` **Version:** `1.3.3` > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**43** **Group:** `io.prometheus` **Name:** `prometheus-metrics-model` **Version:** `1.3.1` +**43** **Group:** `io.prometheus` **Name:** `prometheus-metrics-model` **Version:** `1.3.3` > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**44** **Group:** `io.prometheus` **Name:** `prometheus-metrics-shaded-protobuf` **Version:** `1.3.1` -> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) - -**45** **Group:** `io.zipkin.reporter2` **Name:** `zipkin-reporter` **Version:** `3.4.2` +**44** **Group:** `io.zipkin.reporter2` **Name:** `zipkin-reporter` **Version:** `3.4.2` > - **Manifest Project URL**: [https://zipkin.io/](https://zipkin.io/) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **Embedded license files**: [zipkin-reporter-3.4.2.jar/META-INF/LICENSE](zipkin-reporter-3.4.2.jar/META-INF/LICENSE) -**46** **Group:** `io.zipkin.reporter2` **Name:** `zipkin-sender-okhttp3` **Version:** `3.4.2` +**45** **Group:** `io.zipkin.reporter2` **Name:** `zipkin-sender-okhttp3` **Version:** `3.4.2` > - **Manifest Project URL**: [https://zipkin.io/](https://zipkin.io/) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **Embedded license files**: [zipkin-sender-okhttp3-3.4.2.jar/META-INF/LICENSE](zipkin-sender-okhttp3-3.4.2.jar/META-INF/LICENSE) -**47** **Group:** `io.zipkin.zipkin2` **Name:** `zipkin` **Version:** `2.27.1` +**46** **Group:** `io.zipkin.zipkin2` **Name:** `zipkin` **Version:** `2.27.1` > - **Manifest Project URL**: [http://zipkin.io/](http://zipkin.io/) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **Embedded license files**: [zipkin-2.27.1.jar/META-INF/LICENSE](zipkin-2.27.1.jar/META-INF/LICENSE) -**48** **Group:** `net.bytebuddy` **Name:** `byte-buddy-dep` **Version:** `1.15.10` +**47** **Group:** `net.bytebuddy` **Name:** `byte-buddy-dep` **Version:** `1.15.10` > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **Embedded license files**: [byte-buddy-dep-1.15.10.jar/META-INF/LICENSE](byte-buddy-dep-1.15.10.jar/META-INF/LICENSE) - [byte-buddy-dep-1.15.10.jar/META-INF/NOTICE](byte-buddy-dep-1.15.10.jar/META-INF/NOTICE) -**49** **Group:** `org.jetbrains` **Name:** `annotations` **Version:** `13.0` +**48** **Group:** `org.jetbrains` **Name:** `annotations` **Version:** `13.0` > - **POM Project URL**: [http://www.jetbrains.org](http://www.jetbrains.org) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**50** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib` **Version:** `2.0.21` +**49** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib` **Version:** `2.0.21` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**51** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk7` **Version:** `2.0.21` +**50** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk7` **Version:** `2.0.21` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**52** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk8` **Version:** `2.0.21` +**51** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk8` **Version:** `2.0.21` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**53** **Group:** `org.ow2.asm` **Name:** `asm` **Version:** `9.7.1` +**52** **Group:** `org.ow2.asm` **Name:** `asm` **Version:** `9.7.1` > - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org) > - **Manifest License**: The 3-Clause BSD License (Not Packaged) > - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause) -**54** **Group:** `org.ow2.asm` **Name:** `asm-analysis` **Version:** `9.7.1` +**53** **Group:** `org.ow2.asm` **Name:** `asm-analysis` **Version:** `9.7.1` > - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org) > - **Manifest License**: The 3-Clause BSD License (Not Packaged) > - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause) -**55** **Group:** `org.ow2.asm` **Name:** `asm-commons` **Version:** `9.7.1` +**54** **Group:** `org.ow2.asm` **Name:** `asm-commons` **Version:** `9.7.1` > - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org) > - **Manifest License**: The 3-Clause BSD License (Not Packaged) > - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause) -**56** **Group:** `org.ow2.asm` **Name:** `asm-tree` **Version:** `9.7.1` +**55** **Group:** `org.ow2.asm` **Name:** `asm-tree` **Version:** `9.7.1` > - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org) > - **Manifest License**: The 3-Clause BSD License (Not Packaged) > - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause) -**57** **Group:** `org.ow2.asm` **Name:** `asm-util` **Version:** `9.7.1` +**56** **Group:** `org.ow2.asm` **Name:** `asm-util` **Version:** `9.7.1` > - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org) > - **Manifest License**: The 3-Clause BSD License (Not Packaged) > - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause) -**58** **Group:** `org.snakeyaml` **Name:** `snakeyaml-engine` **Version:** `2.8` +**57** **Group:** `org.snakeyaml` **Name:** `snakeyaml-engine` **Version:** `2.8` > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM Project URL**: [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**59** **Group:** `org.yaml` **Name:** `snakeyaml` **Version:** `2.3` +**58** **Group:** `org.yaml` **Name:** `snakeyaml` **Version:** `2.3` > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM Project URL**: [https://bitbucket.org/snakeyaml/snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) ## MIT License -**60** **Group:** `org.slf4j` **Name:** `slf4j-api` **Version:** `2.0.16` +**59** **Group:** `org.slf4j` **Name:** `slf4j-api` **Version:** `2.0.16` > - **Project URL**: [http://www.slf4j.org](http://www.slf4j.org) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) > - **Embedded license files**: [slf4j-api-2.0.16.jar/META-INF/LICENSE.txt](slf4j-api-2.0.16.jar/META-INF/LICENSE.txt) -**61** **Group:** `org.slf4j` **Name:** `slf4j-simple` **Version:** `2.0.16` +**60** **Group:** `org.slf4j` **Name:** `slf4j-simple` **Version:** `2.0.16` > - **Project URL**: [http://www.slf4j.org](http://www.slf4j.org) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) > - **Embedded license files**: [slf4j-simple-2.0.16.jar/META-INF/LICENSE.txt](slf4j-simple-2.0.16.jar/META-INF/LICENSE.txt) ## The 3-Clause BSD License -**62** **Group:** `org.ow2.asm` **Name:** `asm` **Version:** `9.7.1` +**61** **Group:** `org.ow2.asm` **Name:** `asm` **Version:** `9.7.1` > - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org) > - **Manifest License**: The 3-Clause BSD License (Not Packaged) > - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause) -**63** **Group:** `org.ow2.asm` **Name:** `asm-analysis` **Version:** `9.7.1` +**62** **Group:** `org.ow2.asm` **Name:** `asm-analysis` **Version:** `9.7.1` > - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org) > - **Manifest License**: The 3-Clause BSD License (Not Packaged) > - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause) -**64** **Group:** `org.ow2.asm` **Name:** `asm-commons` **Version:** `9.7.1` +**63** **Group:** `org.ow2.asm` **Name:** `asm-commons` **Version:** `9.7.1` > - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org) > - **Manifest License**: The 3-Clause BSD License (Not Packaged) > - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause) -**65** **Group:** `org.ow2.asm` **Name:** `asm-tree` **Version:** `9.7.1` +**64** **Group:** `org.ow2.asm` **Name:** `asm-tree` **Version:** `9.7.1` > - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org) > - **Manifest License**: The 3-Clause BSD License (Not Packaged) > - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause) -**66** **Group:** `org.ow2.asm` **Name:** `asm-util` **Version:** `9.7.1` +**65** **Group:** `org.ow2.asm` **Name:** `asm-util` **Version:** `9.7.1` > - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org) > - **Manifest License**: The 3-Clause BSD License (Not Packaged) > - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/) diff --git a/settings.gradle.kts b/settings.gradle.kts index c9e944fdb48c..68cd7bff023f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,7 +13,7 @@ pluginManagement { } plugins { - id("com.gradle.develocity") version "3.18.1" + id("com.gradle.develocity") version "3.18.2" id("com.gradle.common-custom-user-data-gradle-plugin") version "2.0.2" id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" // this can't live in pluginManagement currently due to @@ -402,6 +402,10 @@ include(":instrumentation:ktor:ktor-1.0:library") include(":instrumentation:ktor:ktor-2.0:javaagent") include(":instrumentation:ktor:ktor-2.0:library") include(":instrumentation:ktor:ktor-2.0:testing") +include(":instrumentation:ktor:ktor-2-common:library") +include(":instrumentation:ktor:ktor-3.0:javaagent") +include(":instrumentation:ktor:ktor-3.0:library") +include(":instrumentation:ktor:ktor-3.0:testing") include(":instrumentation:ktor:ktor-common:library") include(":instrumentation:kubernetes-client-7.0:javaagent") include(":instrumentation:kubernetes-client-7.0:javaagent-unit-tests") diff --git a/smoke-tests/images/fake-backend/build.gradle.kts b/smoke-tests/images/fake-backend/build.gradle.kts index 3ec0081a2dd7..2a11503666d1 100644 --- a/smoke-tests/images/fake-backend/build.gradle.kts +++ b/smoke-tests/images/fake-backend/build.gradle.kts @@ -11,7 +11,7 @@ plugins { } dependencies { - implementation("com.linecorp.armeria:armeria-grpc:1.30.1") + implementation("com.linecorp.armeria:armeria-grpc:1.31.0") implementation("io.opentelemetry.proto:opentelemetry-proto") runtimeOnly("org.slf4j:slf4j-simple") } diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/QuarkusSmokeTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/QuarkusSmokeTest.groovy index e8d87c20c527..6009973dbdcd 100644 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/QuarkusSmokeTest.groovy +++ b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/QuarkusSmokeTest.groovy @@ -19,7 +19,7 @@ import static io.opentelemetry.smoketest.TestContainerManager.useWindowsContaine class QuarkusSmokeTest extends SmokeTest { protected String getTargetImage(String jdk) { - "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-quarkus:jdk$jdk-20211213.1574595137" + "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-quarkus:jdk$jdk-20241105.11678591860" } @Override @@ -50,12 +50,12 @@ class QuarkusSmokeTest extends SmokeTest { traces.countFilteredResourceAttributes("telemetry.distro.version", currentAgentVersion) == 1 and: "service.name is detected from manifest" - traces.countFilteredResourceAttributes(ServiceAttributes.SERVICE_NAME.key, "smoke-test-quarkus-images") == 1 + traces.countFilteredResourceAttributes(ServiceAttributes.SERVICE_NAME.key, "quarkus") == 1 cleanup: stopTarget() where: - jdk << [11, 17] // Quarkus 2.0+ does not support Java 8 + jdk << [17, 21, 23] // Quarkus 3.7+ requires Java 17+ } } diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/SemconvStabilityUtil.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/SemconvStabilityUtil.java index 06d25bd9ec79..282bc92042c9 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/SemconvStabilityUtil.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/SemconvStabilityUtil.java @@ -6,7 +6,6 @@ package io.opentelemetry.instrumentation.testing.junit.db; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_TABLE; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_COSMOSDB_CONTAINER; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_MONGODB_COLLECTION; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; @@ -39,14 +38,13 @@ private static Map, AttributeKey> buildMap() { map.put(DB_SQL_TABLE, DB_COLLECTION_NAME); map.put(DB_CASSANDRA_TABLE, DB_COLLECTION_NAME); map.put(DB_MONGODB_COLLECTION, DB_COLLECTION_NAME); - map.put(DB_COSMOSDB_CONTAINER, DB_COLLECTION_NAME); return map; } private SemconvStabilityUtil() {} @SuppressWarnings("unchecked") - public static AttributeKey getAttributeKey(AttributeKey oldKey) { + public static AttributeKey maybeStable(AttributeKey oldKey) { // not testing database/dup if (SemconvStability.emitStableDatabaseSemconv()) { return (AttributeKey) oldToNewMap.get(oldKey); diff --git a/testing/armeria-shaded-for-testing/build.gradle.kts b/testing/armeria-shaded-for-testing/build.gradle.kts index 629df89b3184..6a0fe7f1d7ad 100644 --- a/testing/armeria-shaded-for-testing/build.gradle.kts +++ b/testing/armeria-shaded-for-testing/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } dependencies { - implementation("com.linecorp.armeria:armeria-junit5:1.30.1") + implementation("com.linecorp.armeria:armeria-junit5:1.31.0") } tasks { diff --git a/version.gradle.kts b/version.gradle.kts index df6008f01d96..966960107c1f 100644 --- a/version.gradle.kts +++ b/version.gradle.kts @@ -1,5 +1,5 @@ -val stableVersion = "2.10.0-SNAPSHOT" -val alphaVersion = "2.10.0-alpha-SNAPSHOT" +val stableVersion = "2.11.0-SNAPSHOT" +val alphaVersion = "2.11.0-alpha-SNAPSHOT" allprojects { if (findProperty("otel.stable") != "true") {