From e212a7c14b217c559bb9bb9354cb32d2405300be Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Fri, 19 Sep 2025 13:40:37 +0300 Subject: [PATCH 1/2] Improve dubbo network type assertion --- .../javaagent/build.gradle.kts | 1 + .../apachedubbo/v2_7/AbstractDubboTest.java | 36 ++++----- .../v2_7/AbstractDubboTraceChainTest.java | 77 +++---------------- 3 files changed, 23 insertions(+), 91 deletions(-) diff --git a/instrumentation/apache-dubbo-2.7/javaagent/build.gradle.kts b/instrumentation/apache-dubbo-2.7/javaagent/build.gradle.kts index db6e845aad32..0c68fb84f35e 100644 --- a/instrumentation/apache-dubbo-2.7/javaagent/build.gradle.kts +++ b/instrumentation/apache-dubbo-2.7/javaagent/build.gradle.kts @@ -40,6 +40,7 @@ testing { } tasks.withType().configureEach { + systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") // to suppress non-fatal errors on jdk17 jvmArgs("--add-opens=java.base/java.math=ALL-UNNAMED") 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 672c5a86166d..58f2e84c83dc 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 @@ -38,6 +38,7 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap; import org.apache.dubbo.rpc.service.GenericService; import org.assertj.core.api.AbstractAssert; +import org.assertj.core.api.AbstractStringAssert; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -153,13 +154,7 @@ void testApacheDubboBase() throws ReflectiveOperationException { k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(Long.class))), - satisfies( - NETWORK_TYPE, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isEqualTo("ipv4"), - val -> assertThat(val).isEqualTo("ipv6")))), + satisfies(NETWORK_TYPE, AbstractDubboTest::assertNetworkType)), span -> span.hasName( "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService/hello") @@ -227,14 +222,7 @@ void testApacheDubboBase() throws ReflectiveOperationException { SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( NETWORK_TYPE, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> - assertThat(val).isEqualTo("ipv4"), - val -> - assertThat(val) - .isEqualTo("ipv6")))))))); + AbstractDubboTest::assertNetworkType)))))); } @Test @@ -384,13 +372,15 @@ void testApacheDubboTest() SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( NETWORK_TYPE, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> - assertThat(val).isEqualTo("ipv4"), - val -> - assertThat(val) - .isEqualTo("ipv6")))))))); + AbstractDubboTest::assertNetworkType)))))); + } + + static void assertNetworkType(AbstractStringAssert stringAssert) { + if (Boolean.getBoolean("testLatestDeps")) { + stringAssert.satisfiesAnyOf( + val -> assertThat(val).isEqualTo("ipv4"), val -> assertThat(val).isEqualTo("ipv6")); + } else { + stringAssert.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 fcaebe8c051d..46b86bde749c 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 @@ -196,13 +196,7 @@ void testDubboChain() throws ReflectiveOperationException { k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(Long.class))), - satisfies( - NETWORK_TYPE, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isEqualTo("ipv4"), - val -> assertThat(val).isEqualTo("ipv6")))), + satisfies(NETWORK_TYPE, AbstractDubboTest::assertNetworkType)), span -> span.hasName( "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService/hello") @@ -217,14 +211,7 @@ void testDubboChain() throws ReflectiveOperationException { "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"), 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, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isEqualTo("ipv4"), - val -> assertThat(val).isEqualTo("ipv6")))), + satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class))), span -> span.hasName("org.apache.dubbo.rpc.service.GenericService/$invoke") .hasKind(SpanKind.CLIENT) @@ -249,13 +236,7 @@ void testDubboChain() throws ReflectiveOperationException { k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(Long.class))), - satisfies( - NETWORK_TYPE, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isEqualTo("ipv4"), - val -> assertThat(val).isEqualTo("ipv6")))), + satisfies(NETWORK_TYPE, AbstractDubboTest::assertNetworkType)), span -> span.hasName( "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService/hello") @@ -270,14 +251,7 @@ void testDubboChain() throws ReflectiveOperationException { "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), 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, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isEqualTo("ipv4"), - val -> assertThat(val).isEqualTo("ipv6")))))); + satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class))))); testing() .waitAndAssertMetrics( @@ -339,14 +313,7 @@ void testDubboChain() throws ReflectiveOperationException { SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( NETWORK_TYPE, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> - assertThat(val).isEqualTo("ipv4"), - val -> - assertThat(val) - .isEqualTo("ipv6")))), + AbstractDubboTest::assertNetworkType)), point -> point.hasAttributesSatisfyingExactly( equalTo( @@ -362,14 +329,7 @@ void testDubboChain() throws ReflectiveOperationException { SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( NETWORK_TYPE, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> - assertThat(val).isEqualTo("ipv4"), - val -> - assertThat(val) - .isEqualTo("ipv6")))))))); + AbstractDubboTest::assertNetworkType)))))); } @Test @@ -455,13 +415,7 @@ void testDubboChainInJvm() throws ReflectiveOperationException { k.satisfiesAnyOf( val -> assertThat(val).isNull(), val -> assertThat(val).isInstanceOf(Long.class))), - satisfies( - NETWORK_TYPE, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isEqualTo("ipv4"), - val -> assertThat(val).isEqualTo("ipv6")))), + satisfies(NETWORK_TYPE, AbstractDubboTest::assertNetworkType)), span -> span.hasName( "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService/hello") @@ -477,13 +431,7 @@ void testDubboChainInJvm() throws ReflectiveOperationException { 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, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isEqualTo("ipv4"), - val -> assertThat(val).isEqualTo("ipv6")))))); + satisfies(NETWORK_TYPE, AbstractDubboTest::assertNetworkType)))); testing() .waitAndAssertMetrics( @@ -535,13 +483,6 @@ void testDubboChainInJvm() throws ReflectiveOperationException { SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( NETWORK_TYPE, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> - assertThat(val).isEqualTo("ipv4"), - val -> - assertThat(val) - .isEqualTo("ipv6")))))))); + AbstractDubboTest::assertNetworkType)))))); } } From 309ff0a34e75ee431f1486ef90a00b31d4c34fdd Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 23 Sep 2025 10:20:44 +0300 Subject: [PATCH 2/2] fix failing assertion --- .../apachedubbo/v2_7/AbstractDubboTest.java | 60 +++++++++---------- .../v2_7/AbstractDubboTraceChainTest.java | 34 +++-------- 2 files changed, 36 insertions(+), 58 deletions(-) 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 58f2e84c83dc..2590bef9ea1d 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 @@ -29,6 +29,7 @@ import java.net.InetAddress; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; import org.apache.dubbo.common.utils.NetUtils; import org.apache.dubbo.config.ApplicationConfig; import org.apache.dubbo.config.ProtocolConfig; @@ -144,16 +145,10 @@ void testApacheDubboBase() throws ReflectiveOperationException { satisfies(SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( NETWORK_PEER_ADDRESS, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isInstanceOf(String.class))), + k -> assertLatestDeps(k, a -> a.isInstanceOf(String.class))), satisfies( NETWORK_PEER_PORT, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isInstanceOf(Long.class))), + k -> assertLatestDeps(k, a -> a.isInstanceOf(Long.class))), satisfies(NETWORK_TYPE, AbstractDubboTest::assertNetworkType)), span -> span.hasName( @@ -169,8 +164,7 @@ void testApacheDubboBase() throws ReflectiveOperationException { "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), 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)))); + satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class))))); testing() .waitAndAssertMetrics( @@ -282,23 +276,11 @@ void testApacheDubboTest() satisfies(SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( NETWORK_PEER_ADDRESS, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isInstanceOf(String.class))), + k -> assertLatestDeps(k, a -> a.isInstanceOf(String.class))), satisfies( NETWORK_PEER_PORT, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isInstanceOf(Long.class))), - satisfies( - NETWORK_TYPE, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isEqualTo("ipv4"), - val -> assertThat(val).isEqualTo("ipv6")))), + k -> assertLatestDeps(k, a -> a.isInstanceOf(Long.class))), + satisfies(NETWORK_TYPE, AbstractDubboTest::assertNetworkType)), span -> span.hasName( "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService/hello") @@ -314,13 +296,18 @@ void testApacheDubboTest() equalTo(RPC_METHOD, "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 + // "ipv4"/"ipv6" satisfies( NETWORK_TYPE, k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isEqualTo("ipv4"), - val -> assertThat(val).isEqualTo("ipv6")))))); + assertLatestDeps( + k, + a -> + a.satisfiesAnyOf( + val -> assertThat(val).isNull(), + val -> assertThat(val).isEqualTo("ipv4"), + val -> assertThat(val).isEqualTo("ipv6"))))))); testing() .waitAndAssertMetrics( @@ -376,11 +363,20 @@ void testApacheDubboTest() } static void assertNetworkType(AbstractStringAssert stringAssert) { + assertLatestDeps( + stringAssert, + a -> + a.satisfiesAnyOf( + val -> assertThat(val).isEqualTo("ipv4"), + val -> assertThat(val).isEqualTo("ipv6"))); + } + + static void assertLatestDeps( + AbstractAssert assertion, Consumer> action) { if (Boolean.getBoolean("testLatestDeps")) { - stringAssert.satisfiesAnyOf( - val -> assertThat(val).isEqualTo("ipv4"), val -> assertThat(val).isEqualTo("ipv6")); + action.accept(assertion); } else { - stringAssert.isNull(); + assertion.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 4b7140613657..16febc283e9a 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 @@ -5,6 +5,7 @@ package io.opentelemetry.instrumentation.apachedubbo.v2_7; +import static io.opentelemetry.instrumentation.apachedubbo.v2_7.AbstractDubboTest.assertLatestDeps; import static io.opentelemetry.instrumentation.testing.GlobalTraceUtil.runWithSpan; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; @@ -186,16 +187,10 @@ void testDubboChain() throws ReflectiveOperationException { satisfies(SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( NETWORK_PEER_ADDRESS, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isInstanceOf(String.class))), + k -> assertLatestDeps(k, a -> a.isInstanceOf(String.class))), satisfies( NETWORK_PEER_PORT, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isInstanceOf(Long.class))), + k -> assertLatestDeps(k, a -> a.isInstanceOf(Long.class))), satisfies(NETWORK_TYPE, AbstractDubboTest::assertNetworkType)), span -> span.hasName( @@ -226,16 +221,10 @@ void testDubboChain() throws ReflectiveOperationException { satisfies(SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( NETWORK_PEER_ADDRESS, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isInstanceOf(String.class))), + k -> assertLatestDeps(k, a -> a.isInstanceOf(String.class))), satisfies( NETWORK_PEER_PORT, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isInstanceOf(Long.class))), + k -> assertLatestDeps(k, a -> a.isInstanceOf(Long.class))), satisfies(NETWORK_TYPE, AbstractDubboTest::assertNetworkType)), span -> span.hasName( @@ -395,16 +384,10 @@ void testDubboChainInJvm() throws ReflectiveOperationException { satisfies(SERVER_PORT, k -> k.isInstanceOf(Long.class)), satisfies( NETWORK_PEER_ADDRESS, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isInstanceOf(String.class))), + k -> assertLatestDeps(k, a -> a.isInstanceOf(String.class))), satisfies( NETWORK_PEER_PORT, - k -> - k.satisfiesAnyOf( - val -> assertThat(val).isNull(), - val -> assertThat(val).isInstanceOf(Long.class))), + k -> assertLatestDeps(k, a -> a.isInstanceOf(Long.class))), satisfies(NETWORK_TYPE, AbstractDubboTest::assertNetworkType)), span -> span.hasName( @@ -420,8 +403,7 @@ void testDubboChainInJvm() throws ReflectiveOperationException { "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"), 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, AbstractDubboTest::assertNetworkType)))); + satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class))))); testing() .waitAndAssertMetrics(