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 bbd4f9ad1d01..6b7eba14ae9a 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,7 +10,9 @@ import io.opentelemetry.api.common.AttributeKey; 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.RpcServerAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcServerMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; @@ -102,7 +104,8 @@ public DubboTelemetry build() { openTelemetry, INSTRUMENTATION_NAME, serverSpanNameExtractor) .addAttributesExtractor(RpcServerAttributesExtractor.create(rpcAttributesGetter)) .addAttributesExtractor(NetworkAttributesExtractor.create(netServerAttributesGetter)) - .addAttributesExtractors(attributesExtractors); + .addAttributesExtractors(attributesExtractors) + .addOperationMetrics(RpcServerMetrics.get()); InstrumenterBuilder clientInstrumenterBuilder = Instrumenter.builder( @@ -110,7 +113,8 @@ public DubboTelemetry build() { .addAttributesExtractor(RpcClientAttributesExtractor.create(rpcAttributesGetter)) .addAttributesExtractor(ServerAttributesExtractor.create(netClientAttributesGetter)) .addAttributesExtractor(NetworkAttributesExtractor.create(netClientAttributesGetter)) - .addAttributesExtractors(attributesExtractors); + .addAttributesExtractors(attributesExtractors) + .addOperationMetrics(RpcClientMetrics.get()); if (peerService != null) { clientInstrumenterBuilder.addAttributesExtractor( 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 c1051d03faff..672c5a86166d 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 @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.apachedubbo.v2_7; 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; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; @@ -16,7 +17,6 @@ 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; import io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService; @@ -176,6 +176,65 @@ void testApacheDubboBase() throws ReflectiveOperationException { satisfies(NETWORK_PEER_ADDRESS, k -> k.isInstanceOf(String.class)), satisfies(NETWORK_PEER_PORT, k -> k.isInstanceOf(Long.class)), satisfies(NETWORK_TYPE, AbstractAssert::isNull)))); + + 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, + RpcIncubatingAttributes + .RpcSystemIncubatingValues.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, + RpcIncubatingAttributes + .RpcSystemIncubatingValues.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, + k -> + k.satisfiesAnyOf( + val -> assertThat(val).isNull(), + val -> + assertThat(val).isEqualTo("ipv4"), + val -> + assertThat(val) + .isEqualTo("ipv6")))))))); } @Test @@ -274,5 +333,64 @@ void testApacheDubboTest() val -> assertThat(val).isNull(), 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, + RpcIncubatingAttributes + .RpcSystemIncubatingValues.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, + RpcIncubatingAttributes + .RpcSystemIncubatingValues.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, + k -> + k.satisfiesAnyOf( + val -> assertThat(val).isNull(), + val -> + assertThat(val).isEqualTo("ipv4"), + val -> + assertThat(val) + .isEqualTo("ipv6")))))))); } } 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 f1d7a28dd75d..fcaebe8c051d 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,7 @@ package io.opentelemetry.instrumentation.apachedubbo.v2_7; 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; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; @@ -16,7 +17,6 @@ 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; import io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService; @@ -278,6 +278,98 @@ void testDubboChain() throws ReflectiveOperationException { val -> assertThat(val).isNull(), 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, + RpcIncubatingAttributes + .RpcSystemIncubatingValues.APACHE_DUBBO), + equalTo( + RPC_SERVICE, + "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), + equalTo(RPC_METHOD, "hello")), + point -> + point.hasAttributesSatisfyingExactly( + equalTo( + RPC_SYSTEM, + RpcIncubatingAttributes + .RpcSystemIncubatingValues.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, + RpcIncubatingAttributes + .RpcSystemIncubatingValues.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, + k -> + k.satisfiesAnyOf( + val -> assertThat(val).isNull(), + val -> + assertThat(val).isEqualTo("ipv4"), + val -> + assertThat(val) + .isEqualTo("ipv6")))), + point -> + point.hasAttributesSatisfyingExactly( + equalTo( + RPC_SYSTEM, + RpcIncubatingAttributes + .RpcSystemIncubatingValues.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, + k -> + k.satisfiesAnyOf( + val -> assertThat(val).isNull(), + val -> + assertThat(val).isEqualTo("ipv4"), + val -> + assertThat(val) + .isEqualTo("ipv6")))))))); } @Test @@ -392,5 +484,64 @@ void testDubboChainInJvm() throws ReflectiveOperationException { val -> assertThat(val).isNull(), 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, + RpcIncubatingAttributes + .RpcSystemIncubatingValues.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, + RpcIncubatingAttributes + .RpcSystemIncubatingValues.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, + k -> + k.satisfiesAnyOf( + val -> assertThat(val).isNull(), + val -> + assertThat(val).isEqualTo("ipv4"), + val -> + assertThat(val) + .isEqualTo("ipv6")))))))); } }