From f3cf937c7b0900a26b14655eafe1853538cb4fca Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Tue, 3 Mar 2026 12:02:16 +0800 Subject: [PATCH 1/2] Dubbo: stable semconv support and testing --- .../javaagent/build.gradle.kts | 16 +- .../library-autoconfigure/build.gradle.kts | 20 + .../v2_7/DubboRpcAttributesGetter.java | 17 + .../v2_7/DubboTelemetryBuilder.java | 10 +- .../apachedubbo/v2_7/AbstractDubboTest.java | 329 +++++++++----- .../v2_7/AbstractDubboTraceChainTest.java | 416 ++++++++++++------ 6 files changed, 573 insertions(+), 235 deletions(-) diff --git a/instrumentation/apache-dubbo-2.7/javaagent/build.gradle.kts b/instrumentation/apache-dubbo-2.7/javaagent/build.gradle.kts index b060d0fab592..73759cdc70ce 100644 --- a/instrumentation/apache-dubbo-2.7/javaagent/build.gradle.kts +++ b/instrumentation/apache-dubbo-2.7/javaagent/build.gradle.kts @@ -55,13 +55,23 @@ val stableSemconvSuites = testing.suites.withType(JvmTestSuite::class).map { sui testClassesDirs = suite.sources.output.classesDirs classpath = suite.sources.runtimeClasspath - jvmArgs("-Dotel.semconv-stability.opt-in=service.peer") - systemProperty("metadataConfig", "otel.semconv-stability.opt-in=service.peer") + jvmArgs("-Dotel.semconv-stability.opt-in=rpc,service.peer") + systemProperty("metadataConfig", "otel.semconv-stability.opt-in=rpc,service.peer") + } +} + +val bothSemconvSuites = testing.suites.withType(JvmTestSuite::class).map { suite -> + tasks.register("${suite.name}BothSemconv") { + testClassesDirs = suite.sources.output.classesDirs + classpath = suite.sources.runtimeClasspath + + jvmArgs("-Dotel.semconv-stability.opt-in=rpc/dup,service.peer") + systemProperty("metadataConfig", "otel.semconv-stability.opt-in=rpc/dup,service.peer") } } tasks { check { - dependsOn(testing.suites, stableSemconvSuites) + dependsOn(testing.suites, stableSemconvSuites, bothSemconvSuites) } } diff --git a/instrumentation/apache-dubbo-2.7/library-autoconfigure/build.gradle.kts b/instrumentation/apache-dubbo-2.7/library-autoconfigure/build.gradle.kts index 0fba704c6ef4..bee725c006aa 100644 --- a/instrumentation/apache-dubbo-2.7/library-autoconfigure/build.gradle.kts +++ b/instrumentation/apache-dubbo-2.7/library-autoconfigure/build.gradle.kts @@ -21,3 +21,23 @@ tasks.withType().configureEach { // required on jdk17 jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") } + +tasks { + val testStableSemconv by registering(Test::class) { + testClassesDirs = sourceSets.test.get().output.classesDirs + classpath = sourceSets.test.get().runtimeClasspath + + jvmArgs("-Dotel.semconv-stability.opt-in=rpc") + } + + val testBothSemconv by registering(Test::class) { + testClassesDirs = sourceSets.test.get().output.classesDirs + classpath = sourceSets.test.get().runtimeClasspath + + jvmArgs("-Dotel.semconv-stability.opt-in=rpc/dup") + } + + check { + dependsOn(testStableSemconv, testBothSemconv) + } +} diff --git a/instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboRpcAttributesGetter.java b/instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboRpcAttributesGetter.java index e2683d206c71..5fe3fe255a43 100644 --- a/instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboRpcAttributesGetter.java +++ b/instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboRpcAttributesGetter.java @@ -6,11 +6,17 @@ package io.opentelemetry.instrumentation.apachedubbo.v2_7; import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcAttributesGetter; +import javax.annotation.Nullable; import org.apache.dubbo.rpc.Result; enum DubboRpcAttributesGetter implements RpcAttributesGetter { INSTANCE; + @Override + public String getRpcSystemName(DubboRequest request) { + return "dubbo"; + } + @Override public String getSystem(DubboRequest request) { return "apache_dubbo"; @@ -26,4 +32,15 @@ public String getService(DubboRequest request) { public String getMethod(DubboRequest request) { return request.invocation().getMethodName(); } + + @Override + @Nullable + public String getRpcMethod(DubboRequest request) { + String service = getService(request); + String method = request.invocation().getMethodName(); + if (service != null && method != null) { + return service + "/" + method; + } + return null; + } } diff --git a/instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboTelemetryBuilder.java b/instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboTelemetryBuilder.java index eb9a34e7bc5f..2881702682a7 100644 --- a/instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboTelemetryBuilder.java +++ b/instrumentation/apache-dubbo-2.7/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/DubboTelemetryBuilder.java @@ -10,6 +10,7 @@ import io.opentelemetry.instrumentation.apachedubbo.v2_7.internal.DubboClientNetworkAttributesGetter; import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcClientAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcClientMetrics; +import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcMetricsContextCustomizers; import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcServerAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcServerMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcSpanNameExtractor; @@ -77,6 +78,7 @@ public DubboTelemetryBuilder setServerSpanNameExtractorCustomizer( /** * Returns a new {@link DubboTelemetry} with the settings of this {@link DubboTelemetryBuilder}. */ + @SuppressWarnings("deprecation") // RpcMetricsContextCustomizers is deprecated for removal in 3.0 public DubboTelemetry build() { DubboRpcAttributesGetter rpcAttributesGetter = DubboRpcAttributesGetter.INSTANCE; SpanNameExtractor spanNameExtractor = @@ -96,7 +98,9 @@ public DubboTelemetry build() { .addAttributesExtractor(RpcServerAttributesExtractor.create(rpcAttributesGetter)) .addAttributesExtractor(NetworkAttributesExtractor.create(netServerAttributesGetter)) .addAttributesExtractors(attributesExtractors) - .addOperationMetrics(RpcServerMetrics.get()); + .addOperationMetrics(RpcServerMetrics.get()) + .addContextCustomizer( + RpcMetricsContextCustomizers.dualEmitContextCustomizer(rpcAttributesGetter)); InstrumenterBuilder clientInstrumenterBuilder = Instrumenter.builder( @@ -105,7 +109,9 @@ public DubboTelemetry build() { .addAttributesExtractor(ServerAttributesExtractor.create(netClientAttributesGetter)) .addAttributesExtractor(NetworkAttributesExtractor.create(netClientAttributesGetter)) .addAttributesExtractors(attributesExtractors) - .addOperationMetrics(RpcClientMetrics.get()); + .addOperationMetrics(RpcClientMetrics.get()) + .addContextCustomizer( + RpcMetricsContextCustomizers.dualEmitContextCustomizer(rpcAttributesGetter)); return new DubboTelemetry( serverInstrumenterBuilder.buildServerInstrumenter(DubboHeadersGetter.INSTANCE), 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 7e1409fc0415..f6c947f812ae 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 @@ -5,6 +5,8 @@ package io.opentelemetry.instrumentation.apachedubbo.v2_7; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitOldRpcSemconv; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableRpcSemconv; import static io.opentelemetry.instrumentation.testing.GlobalTraceUtil.runWithSpan; import static io.opentelemetry.instrumentation.testing.junit.service.SemconvServiceStabilityUtil.maybeStablePeerService; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; @@ -18,7 +20,7 @@ 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 io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM_NAME; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService; @@ -130,6 +132,7 @@ void testApacheDubboBase() throws ReflectiveOperationException { "hello", new String[] {String.class.getName()}, new Object[] {"hello"})); assertThat(response).isEqualTo("hello"); + testing() .waitAndAssertTraces( trace -> @@ -140,9 +143,18 @@ void testApacheDubboBase() throws ReflectiveOperationException { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - equalTo(RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), - equalTo(RPC_METHOD, "$invoke"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "apache_dubbo" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "dubbo" : null), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() + ? "org.apache.dubbo.rpc.service.GenericService" + : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "org.apache.dubbo.rpc.service.GenericService/$invoke" + : "$invoke"), equalTo( maybeStablePeerService(), hasServicePeerName() ? "test-peer-service" : null), @@ -161,59 +173,112 @@ void testApacheDubboBase() throws ReflectiveOperationException { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfying( - equalTo(RPC_SYSTEM, APACHE_DUBBO), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "apache_dubbo" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "dubbo" : null), equalTo( RPC_SERVICE, - "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), - equalTo(RPC_METHOD, "hello"), + emitOldRpcSemconv() + ? "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService" + : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService/hello" + : "hello"), satisfies(NETWORK_PEER_ADDRESS, k -> k.isInstanceOf(String.class)), satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class))))); - testing() - .waitAndAssertMetrics( - "io.opentelemetry.apache-dubbo-2.7", - "rpc.server.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - equalTo( - RPC_SERVICE, - "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), - equalTo(RPC_METHOD, "hello")))))); + if (emitOldRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.server.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM, "apache_dubbo"), + equalTo( + RPC_SERVICE, + "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), + equalTo(RPC_METHOD, "hello")))))); - testing() - .waitAndAssertMetrics( - "io.opentelemetry.apache-dubbo-2.7", - "rpc.client.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - 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( - NETWORK_TYPE, - AbstractDubboTest::assertNetworkType)))))); + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.client.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM, "apache_dubbo"), + 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( + NETWORK_TYPE, + AbstractDubboTest::assertNetworkType)))))); + } + + if (emitStableRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.server.call.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("s") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM_NAME, "dubbo"), + equalTo( + RPC_METHOD, + "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService/hello")))))); + + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.client.call.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("s") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM_NAME, "dubbo"), + equalTo( + RPC_METHOD, + "org.apache.dubbo.rpc.service.GenericService/$invoke"), + equalTo(SERVER_ADDRESS, "localhost"), + satisfies( + SERVER_PORT, + k -> k.isInstanceOf(Long.class))))))); + } } @Test @@ -264,9 +329,18 @@ void testApacheDubboTest() .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - equalTo(RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), - equalTo(RPC_METHOD, "$invokeAsync"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "apache_dubbo" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "dubbo" : null), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() + ? "org.apache.dubbo.rpc.service.GenericService" + : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "org.apache.dubbo.rpc.service.GenericService/$invokeAsync" + : "$invokeAsync"), equalTo( maybeStablePeerService(), hasServicePeerName() ? "test-peer-service" : null), @@ -285,11 +359,18 @@ void testApacheDubboTest() .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfying( - equalTo(RPC_SYSTEM, APACHE_DUBBO), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "apache_dubbo" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "dubbo" : null), equalTo( RPC_SERVICE, - "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), - equalTo(RPC_METHOD, "hello"), + emitOldRpcSemconv() + ? "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService" + : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService/hello" + : "hello"), satisfies(NETWORK_PEER_ADDRESS, k -> k.isInstanceOf(String.class)), satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class)), // this attribute is not filled reliably, it is either null or @@ -305,51 +386,97 @@ void testApacheDubboTest() val -> assertThat(val).isEqualTo("ipv4"), val -> assertThat(val).isEqualTo("ipv6"))))))); - testing() - .waitAndAssertMetrics( - "io.opentelemetry.apache-dubbo-2.7", - "rpc.server.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - equalTo( - RPC_SERVICE, - "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), - equalTo(RPC_METHOD, "hello")))))); + if (emitOldRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.server.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM, "apache_dubbo"), + equalTo( + RPC_SERVICE, + "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), + equalTo(RPC_METHOD, "hello")))))); - testing() - .waitAndAssertMetrics( - "io.opentelemetry.apache-dubbo-2.7", - "rpc.client.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - 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( - NETWORK_TYPE, - AbstractDubboTest::assertNetworkType)))))); + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.client.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM, "apache_dubbo"), + 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( + NETWORK_TYPE, + AbstractDubboTest::assertNetworkType)))))); + } + + if (emitStableRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.server.call.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("s") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM_NAME, "dubbo"), + equalTo( + RPC_METHOD, + "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService/hello")))))); + + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.client.call.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("s") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM_NAME, "dubbo"), + equalTo( + RPC_METHOD, + "org.apache.dubbo.rpc.service.GenericService/$invokeAsync"), + equalTo(SERVER_ADDRESS, "localhost"), + satisfies( + SERVER_PORT, + k -> k.isInstanceOf(Long.class))))))); + } } static void assertNetworkType(AbstractStringAssert stringAssert) { 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 3578b2cad432..a04871fa3b43 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 @@ -6,6 +6,8 @@ package io.opentelemetry.instrumentation.apachedubbo.v2_7; import static io.opentelemetry.instrumentation.apachedubbo.v2_7.AbstractDubboTest.assertLatestDeps; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitOldRpcSemconv; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableRpcSemconv; import static io.opentelemetry.instrumentation.testing.GlobalTraceUtil.runWithSpan; import static io.opentelemetry.instrumentation.testing.junit.service.SemconvServiceStabilityUtil.maybeStablePeerService; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; @@ -19,7 +21,7 @@ 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 io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM_NAME; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService; @@ -182,9 +184,18 @@ void testDubboChain() throws ReflectiveOperationException { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - equalTo(RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), - equalTo(RPC_METHOD, "$invoke"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "apache_dubbo" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "dubbo" : null), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() + ? "org.apache.dubbo.rpc.service.GenericService" + : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "org.apache.dubbo.rpc.service.GenericService/$invoke" + : "$invoke"), equalTo( maybeStablePeerService(), hasServicePeerName() ? "test-peer-service" : null), @@ -203,11 +214,18 @@ void testDubboChain() throws ReflectiveOperationException { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfying( - equalTo(RPC_SYSTEM, APACHE_DUBBO), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "apache_dubbo" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "dubbo" : null), equalTo( RPC_SERVICE, - "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"), - equalTo(RPC_METHOD, "hello"), + emitOldRpcSemconv() + ? "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService" + : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService/hello" + : "hello"), satisfies(NETWORK_PEER_ADDRESS, k -> k.isInstanceOf(String.class)), satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class))), span -> @@ -215,9 +233,18 @@ void testDubboChain() throws ReflectiveOperationException { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(2)) .hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - equalTo(RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), - equalTo(RPC_METHOD, "$invoke"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "apache_dubbo" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "dubbo" : null), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() + ? "org.apache.dubbo.rpc.service.GenericService" + : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "org.apache.dubbo.rpc.service.GenericService/$invoke" + : "$invoke"), equalTo( maybeStablePeerService(), hasServicePeerName() ? "test-peer-service" : null), @@ -236,79 +263,148 @@ void testDubboChain() throws ReflectiveOperationException { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(3)) .hasAttributesSatisfying( - equalTo(RPC_SYSTEM, APACHE_DUBBO), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "apache_dubbo" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "dubbo" : null), equalTo( RPC_SERVICE, - "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), - equalTo(RPC_METHOD, "hello"), + emitOldRpcSemconv() + ? "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService" + : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService/hello" + : "hello"), satisfies(NETWORK_PEER_ADDRESS, k -> k.isInstanceOf(String.class)), satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class))))); - testing() - .waitAndAssertMetrics( - "io.opentelemetry.apache-dubbo-2.7", - "rpc.server.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - equalTo( - RPC_SERVICE, - "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), - equalTo(RPC_METHOD, "hello")), - point -> - point.hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - equalTo( - RPC_SERVICE, - "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"), - equalTo(RPC_METHOD, "hello")))))); - - testing() - .waitAndAssertMetrics( - "io.opentelemetry.apache-dubbo-2.7", - "rpc.client.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - 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( - NETWORK_TYPE, - AbstractDubboTest::assertNetworkType)), - point -> - point.hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - 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( - NETWORK_TYPE, - AbstractDubboTest::assertNetworkType)))))); + if (emitOldRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.server.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM, "apache_dubbo"), + equalTo( + RPC_SERVICE, + "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), + equalTo(RPC_METHOD, "hello")), + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM, "apache_dubbo"), + equalTo( + RPC_SERVICE, + "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"), + equalTo(RPC_METHOD, "hello")))))); + + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.client.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM, "apache_dubbo"), + 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( + NETWORK_TYPE, + AbstractDubboTest::assertNetworkType)), + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM, "apache_dubbo"), + 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( + NETWORK_TYPE, + AbstractDubboTest::assertNetworkType)))))); + } + + if (emitStableRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.server.call.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("s") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM_NAME, "dubbo"), + equalTo( + RPC_METHOD, + "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService/hello")), + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM_NAME, "dubbo"), + equalTo( + RPC_METHOD, + "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService/hello")))))); + + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.client.call.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("s") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM_NAME, "dubbo"), + equalTo( + RPC_METHOD, + "org.apache.dubbo.rpc.service.GenericService/$invoke"), + equalTo(SERVER_ADDRESS, "localhost"), + satisfies( + SERVER_PORT, + k -> k.isInstanceOf(Long.class))), + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM_NAME, "dubbo"), + equalTo( + RPC_METHOD, + "org.apache.dubbo.rpc.service.GenericService/$invoke"), + equalTo(SERVER_ADDRESS, "localhost"), + satisfies( + SERVER_PORT, + k -> k.isInstanceOf(Long.class))))))); + } } @Test @@ -365,9 +461,18 @@ void testDubboChainInJvm() throws ReflectiveOperationException { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - equalTo(RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), - equalTo(RPC_METHOD, "$invoke"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "apache_dubbo" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "dubbo" : null), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() + ? "org.apache.dubbo.rpc.service.GenericService" + : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "org.apache.dubbo.rpc.service.GenericService/$invoke" + : "$invoke"), equalTo( maybeStablePeerService(), hasServicePeerName() ? "test-peer-service" : null), @@ -386,58 +491,111 @@ void testDubboChainInJvm() throws ReflectiveOperationException { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfying( - equalTo(RPC_SYSTEM, APACHE_DUBBO), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "apache_dubbo" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "dubbo" : null), equalTo( RPC_SERVICE, - "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"), - equalTo(RPC_METHOD, "hello"), + emitOldRpcSemconv() + ? "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService" + : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService/hello" + : "hello"), satisfies(NETWORK_PEER_ADDRESS, k -> k.isInstanceOf(String.class)), satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class))))); - testing() - .waitAndAssertMetrics( - "io.opentelemetry.apache-dubbo-2.7", - "rpc.server.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - equalTo( - RPC_SERVICE, - "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"), - equalTo(RPC_METHOD, "hello")))))); - - testing() - .waitAndAssertMetrics( - "io.opentelemetry.apache-dubbo-2.7", - "rpc.client.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, APACHE_DUBBO), - 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( - NETWORK_TYPE, - AbstractDubboTest::assertNetworkType)))))); + if (emitOldRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.server.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM, "apache_dubbo"), + equalTo( + RPC_SERVICE, + "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"), + equalTo(RPC_METHOD, "hello")))))); + + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.client.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM, "apache_dubbo"), + 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( + NETWORK_TYPE, + AbstractDubboTest::assertNetworkType)))))); + } + + if (emitStableRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.server.call.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("s") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM_NAME, "dubbo"), + equalTo( + RPC_METHOD, + "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService/hello")))))); + + testing() + .waitAndAssertMetrics( + "io.opentelemetry.apache-dubbo-2.7", + "rpc.client.call.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("s") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM_NAME, "dubbo"), + equalTo( + RPC_METHOD, + "org.apache.dubbo.rpc.service.GenericService/$invoke"), + equalTo(SERVER_ADDRESS, "localhost"), + satisfies( + SERVER_PORT, + k -> k.isInstanceOf(Long.class))))))); + } } } From 9960b7ce8ca9b938ac4fb9feb3479b2f5c2860c7 Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Wed, 4 Mar 2026 16:03:53 +0800 Subject: [PATCH 2/2] Remove unnecessary blank lines --- .../instrumentation/apachedubbo/v2_7/AbstractDubboTest.java | 1 - 1 file changed, 1 deletion(-) 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 f6c947f812ae..0847ff83bf97 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 @@ -132,7 +132,6 @@ void testApacheDubboBase() throws ReflectiveOperationException { "hello", new String[] {String.class.getName()}, new Object[] {"hello"})); assertThat(response).isEqualTo("hello"); - testing() .waitAndAssertTraces( trace ->