From 24b443cae095932556afc3f4a7e41ed109eb2834 Mon Sep 17 00:00:00 2001 From: Cuichen Li Date: Fri, 13 Dec 2024 12:46:19 +0800 Subject: [PATCH 1/7] capture code.* resources attributes --- .../v5_0/server/WebfluxSingletons.java | 3 + .../v5_0/server/SpringWebfluxTest.java | 66 +++++++++++++++++-- 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java index 5114c530c3a9..3d583a6e7575 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteGetter; @@ -32,6 +33,8 @@ public final class WebfluxSingletons { INSTRUMENTER = builder .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) + .addAttributesExtractor( + CodeAttributesExtractor.create(new HandlerCodeAttributesGetter())) .buildInstrumenter(); } 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 ed267f43e832..661838f9d4a0 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 @@ -25,6 +25,8 @@ 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 io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_FUNCTION; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_NAMESPACE; import static org.junit.jupiter.api.Named.named; import io.opentelemetry.api.trace.SpanKind; @@ -142,7 +144,13 @@ void basicGetTest(Parameter parameter) { stringKey("spring-webflux.handler.type"), parameter.annotatedMethod == null ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.isEqualTo(TestController.class.getName()))); + : val -> val.isEqualTo(TestController.class.getName())), + satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + satisfies( + CODE_NAMESPACE, + parameter.annotatedMethod == null + ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) + : val -> val.endsWith("HandlerMethod"))); })); } @@ -261,7 +269,13 @@ void getAsyncResponseTest(Parameter parameter) { stringKey("spring-webflux.handler.type"), parameter.annotatedMethod == null ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.isEqualTo(TestController.class.getName()))); + : val -> val.isEqualTo(TestController.class.getName())), + satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + satisfies( + CODE_NAMESPACE, + parameter.annotatedMethod == null + ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) + : val -> val.endsWith("HandlerMethod"))); }, span -> span.hasName("tracedMethod") @@ -367,7 +381,13 @@ void createSpanDuringHandlerFunctionTest(Parameter parameter) { stringKey("spring-webflux.handler.type"), parameter.annotatedMethod == null ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.isEqualTo(TestController.class.getName()))); + : val -> val.isEqualTo(TestController.class.getName())), + satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + satisfies( + CODE_NAMESPACE, + parameter.annotatedMethod == null + ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) + : val -> val.endsWith("HandlerMethod"))); }, span -> span.hasName("tracedMethod") @@ -430,6 +450,10 @@ void get404Test() { .hasAttributesSatisfyingExactly( equalTo( stringKey("spring-webflux.handler.type"), + "org.springframework.web.reactive.resource.ResourceWebHandler"), + satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + equalTo( + CODE_NAMESPACE, "org.springframework.web.reactive.resource.ResourceWebHandler")))); } @@ -487,7 +511,11 @@ void basicPostTest() { .hasAttributesSatisfyingExactly( satisfies( stringKey("spring-webflux.handler.type"), - val -> val.contains(EchoHandlerFunction.class.getName()))), + val -> val.contains(EchoHandlerFunction.class.getName())), + satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + satisfies( + CODE_NAMESPACE, + val -> val.isEqualTo("server.EchoHandlerFunction"))), span -> span.hasName("echo").hasParent(trace.getSpan(1)).hasTotalAttributeCount(0))); } @@ -548,7 +576,13 @@ void getToBadEndpointTest(Parameter parameter) { stringKey("spring-webflux.handler.type"), parameter.annotatedMethod == null ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.isEqualTo(TestController.class.getName()))); + : val -> val.isEqualTo(TestController.class.getName())), + satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + satisfies( + CODE_NAMESPACE, + parameter.annotatedMethod == null + ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) + : val -> val.endsWith("HandlerMethod"))); })); } @@ -605,6 +639,10 @@ void redirectTest() { .hasAttributesSatisfyingExactly( satisfies( stringKey("spring-webflux.handler.type"), + val -> val.startsWith("server.RedirectComponent$$Lambda")), + satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + satisfies( + CODE_NAMESPACE, val -> val.startsWith("server.RedirectComponent$$Lambda")))), trace -> trace.hasSpansSatisfyingExactly( @@ -633,6 +671,10 @@ void redirectTest() { .hasAttributesSatisfyingExactly( satisfies( stringKey("spring-webflux.handler.type"), + val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX)), + satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + satisfies( + CODE_NAMESPACE, val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX))); })); } @@ -692,7 +734,13 @@ void multipleGetsToDelayingRoute(Parameter parameter) { stringKey("spring-webflux.handler.type"), parameter.annotatedMethod == null ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.isEqualTo(TestController.class.getName()))); + : val -> val.isEqualTo(TestController.class.getName())), + satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + satisfies( + CODE_NAMESPACE, + parameter.annotatedMethod == null + ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) + : val -> val.endsWith("HandlerMethod"))); }); testing.waitAndAssertTraces(Collections.nCopies(requestsCount, traceAssertion)); @@ -764,6 +812,12 @@ void cancelRequestTest() throws Exception { stringKey("spring-webflux.handler.type"), value -> value.startsWith( + "server.SpringWebFluxTestApplication$$Lambda")), + satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + satisfies( + CODE_NAMESPACE, + val -> + val.startsWith( "server.SpringWebFluxTestApplication$$Lambda"))))); SpringWebFluxTestApplication.resumeSlowRequest(); From ee2c31ec9125a3700f0a7221ddf21f83168ca3b4 Mon Sep 17 00:00:00 2001 From: Cuichen Li Date: Mon, 16 Dec 2024 17:22:58 +0800 Subject: [PATCH 2/7] remove redundant metric --- .../v5_0/server/WebfluxSingletons.java | 4 +- .../v5_0/server/SpringWebfluxTest.java | 43 ------------------- 2 files changed, 1 insertion(+), 46 deletions(-) diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java index 3d583a6e7575..2c67b2476a86 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java @@ -26,9 +26,7 @@ public final class WebfluxSingletons { Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, new WebfluxSpanNameExtractor()); - if (SpringWebfluxConfig.captureExperimentalSpanAttributes()) { - builder.addAttributesExtractor(new ExperimentalAttributesExtractor()); - } + if (SpringWebfluxConfig.captureExperimentalSpanAttributes()) {} INSTRUMENTER = builder 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 661838f9d4a0..0ac62db7ac23 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 @@ -5,7 +5,6 @@ package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.server; -import static io.opentelemetry.api.common.AttributeKey.stringKey; 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; @@ -140,11 +139,6 @@ void basicGetTest(Parameter parameter) { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies( - stringKey("spring-webflux.handler.type"), - parameter.annotatedMethod == null - ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.isEqualTo(TestController.class.getName())), satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), satisfies( CODE_NAMESPACE, @@ -265,11 +259,6 @@ void getAsyncResponseTest(Parameter parameter) { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies( - stringKey("spring-webflux.handler.type"), - parameter.annotatedMethod == null - ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.isEqualTo(TestController.class.getName())), satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), satisfies( CODE_NAMESPACE, @@ -377,11 +366,6 @@ void createSpanDuringHandlerFunctionTest(Parameter parameter) { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies( - stringKey("spring-webflux.handler.type"), - parameter.annotatedMethod == null - ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.isEqualTo(TestController.class.getName())), satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), satisfies( CODE_NAMESPACE, @@ -448,9 +432,6 @@ void get404Test() { .hasStatus(StatusData.error()) .hasEventsSatisfyingExactly(SpringWebfluxTest::resource404Exception) .hasAttributesSatisfyingExactly( - equalTo( - stringKey("spring-webflux.handler.type"), - "org.springframework.web.reactive.resource.ResourceWebHandler"), satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), equalTo( CODE_NAMESPACE, @@ -509,9 +490,6 @@ void basicPostTest() { .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies( - stringKey("spring-webflux.handler.type"), - val -> val.contains(EchoHandlerFunction.class.getName())), satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), satisfies( CODE_NAMESPACE, @@ -572,11 +550,6 @@ void getToBadEndpointTest(Parameter parameter) { EXCEPTION_STACKTRACE, val -> val.isInstanceOf(String.class)))) .hasAttributesSatisfyingExactly( - satisfies( - stringKey("spring-webflux.handler.type"), - parameter.annotatedMethod == null - ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.isEqualTo(TestController.class.getName())), satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), satisfies( CODE_NAMESPACE, @@ -637,9 +610,6 @@ void redirectTest() { .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies( - stringKey("spring-webflux.handler.type"), - val -> val.startsWith("server.RedirectComponent$$Lambda")), satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), satisfies( CODE_NAMESPACE, @@ -669,9 +639,6 @@ void redirectTest() { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies( - stringKey("spring-webflux.handler.type"), - val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX)), satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), satisfies( CODE_NAMESPACE, @@ -730,11 +697,6 @@ void multipleGetsToDelayingRoute(Parameter parameter) { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies( - stringKey("spring-webflux.handler.type"), - parameter.annotatedMethod == null - ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.isEqualTo(TestController.class.getName())), satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), satisfies( CODE_NAMESPACE, @@ -808,11 +770,6 @@ void cancelRequestTest() throws Exception { .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies( - stringKey("spring-webflux.handler.type"), - value -> - value.startsWith( - "server.SpringWebFluxTestApplication$$Lambda")), satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), satisfies( CODE_NAMESPACE, From 33ec2954c6d14fcd9535e6b1c7beabd1d7efec26 Mon Sep 17 00:00:00 2001 From: Cuichen Li Date: Tue, 17 Dec 2024 10:54:11 +0800 Subject: [PATCH 3/7] fix check style error --- .../spring/webflux/v5_0/server/WebfluxSingletons.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java index 2c67b2476a86..5e08e970db70 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/WebfluxSingletons.java @@ -11,7 +11,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteGetter; import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; -import io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.SpringWebfluxConfig; import org.springframework.web.reactive.HandlerMapping; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.util.pattern.PathPattern; @@ -26,8 +25,6 @@ public final class WebfluxSingletons { Instrumenter.builder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, new WebfluxSpanNameExtractor()); - if (SpringWebfluxConfig.captureExperimentalSpanAttributes()) {} - INSTRUMENTER = builder .setEnabled(ExperimentalConfig.get().controllerTelemetryEnabled()) From e7381bb69c54d0ef6df24523236707c98357e9af Mon Sep 17 00:00:00 2001 From: Cuichen Li Date: Thu, 19 Dec 2024 17:59:45 +0800 Subject: [PATCH 4/7] update --- .../server/HandlerCodeAttributesGetter.java | 9 +++++- .../v5_0/server/SpringWebfluxTest.java | 30 +++++++++---------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/HandlerCodeAttributesGetter.java b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/HandlerCodeAttributesGetter.java index 6218a761a896..552890c7231b 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/HandlerCodeAttributesGetter.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/HandlerCodeAttributesGetter.java @@ -7,12 +7,19 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesGetter; import javax.annotation.Nullable; +import org.springframework.web.method.HandlerMethod; public class HandlerCodeAttributesGetter implements CodeAttributesGetter { @Nullable @Override public Class getCodeClass(Object handler) { - return handler.getClass(); + if (handler instanceof HandlerMethod) { + // Special case for requests mapped with annotations + HandlerMethod handlerMethod = (HandlerMethod) handler; + return handlerMethod.getMethod().getDeclaringClass(); + } else { + return handler.getClass(); + } } @Nullable 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 0ac62db7ac23..4eaaee54630d 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 @@ -139,12 +139,12 @@ void basicGetTest(Parameter parameter) { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + equalTo(CODE_FUNCTION, "handle"), satisfies( CODE_NAMESPACE, parameter.annotatedMethod == null ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.endsWith("HandlerMethod"))); + : val -> val.isEqualTo(TestController.class.getName()))); })); } @@ -259,12 +259,12 @@ void getAsyncResponseTest(Parameter parameter) { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + equalTo(CODE_FUNCTION, "handle"), satisfies( CODE_NAMESPACE, parameter.annotatedMethod == null ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.endsWith("HandlerMethod"))); + : val -> val.isEqualTo(TestController.class.getName()))); }, span -> span.hasName("tracedMethod") @@ -366,12 +366,12 @@ void createSpanDuringHandlerFunctionTest(Parameter parameter) { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + equalTo(CODE_FUNCTION, "handle"), satisfies( CODE_NAMESPACE, parameter.annotatedMethod == null ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.endsWith("HandlerMethod"))); + : val -> val.isEqualTo(TestController.class.getName()))); }, span -> span.hasName("tracedMethod") @@ -432,7 +432,7 @@ void get404Test() { .hasStatus(StatusData.error()) .hasEventsSatisfyingExactly(SpringWebfluxTest::resource404Exception) .hasAttributesSatisfyingExactly( - satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + equalTo(CODE_FUNCTION, "handle"), equalTo( CODE_NAMESPACE, "org.springframework.web.reactive.resource.ResourceWebHandler")))); @@ -490,7 +490,7 @@ void basicPostTest() { .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + equalTo(CODE_FUNCTION, "handle"), satisfies( CODE_NAMESPACE, val -> val.isEqualTo("server.EchoHandlerFunction"))), @@ -550,12 +550,12 @@ void getToBadEndpointTest(Parameter parameter) { EXCEPTION_STACKTRACE, val -> val.isInstanceOf(String.class)))) .hasAttributesSatisfyingExactly( - satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + equalTo(CODE_FUNCTION, "handle"), satisfies( CODE_NAMESPACE, parameter.annotatedMethod == null ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.endsWith("HandlerMethod"))); + : val -> val.isEqualTo(TestController.class.getName()))); })); } @@ -610,7 +610,7 @@ void redirectTest() { .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + equalTo(CODE_FUNCTION, "handle"), satisfies( CODE_NAMESPACE, val -> val.startsWith("server.RedirectComponent$$Lambda")))), @@ -639,7 +639,7 @@ void redirectTest() { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + equalTo(CODE_FUNCTION, "handle"), satisfies( CODE_NAMESPACE, val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX))); @@ -697,12 +697,12 @@ void multipleGetsToDelayingRoute(Parameter parameter) { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + equalTo(CODE_FUNCTION, "handle"), satisfies( CODE_NAMESPACE, parameter.annotatedMethod == null ? val -> val.contains(INNER_HANDLER_FUNCTION_CLASS_TAG_PREFIX) - : val -> val.endsWith("HandlerMethod"))); + : val -> val.isEqualTo(TestController.class.getName()))); }); testing.waitAndAssertTraces(Collections.nCopies(requestsCount, traceAssertion)); @@ -770,7 +770,7 @@ void cancelRequestTest() throws Exception { .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - satisfies(CODE_FUNCTION, val -> val.isEqualTo("handle")), + equalTo(CODE_FUNCTION, "handle"), satisfies( CODE_NAMESPACE, val -> From 807fd56e2cc4d5b3eb1252376bbabdcbef37578f Mon Sep 17 00:00:00 2001 From: Cuichen Li Date: Thu, 19 Dec 2024 19:29:29 +0800 Subject: [PATCH 5/7] one more --- .../spring/webflux/v5_0/server/SpringWebfluxTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 4eaaee54630d..11af191f8cd7 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 @@ -491,9 +491,7 @@ void basicPostTest() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo(CODE_FUNCTION, "handle"), - satisfies( - CODE_NAMESPACE, - val -> val.isEqualTo("server.EchoHandlerFunction"))), + equalTo(CODE_NAMESPACE, "server.EchoHandlerFunction")), span -> span.hasName("echo").hasParent(trace.getSpan(1)).hasTotalAttributeCount(0))); } From c1a5638d8ab0f82e1773c013b37087078e36ba71 Mon Sep 17 00:00:00 2001 From: Will Li Date: Thu, 19 Dec 2024 23:59:19 +0800 Subject: [PATCH 6/7] Update instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/SpringWebfluxTest.java Co-authored-by: Trask Stalnaker --- .../spring/webflux/v5_0/server/SpringWebfluxTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 11af191f8cd7..928075f47658 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 @@ -491,7 +491,7 @@ void basicPostTest() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo(CODE_FUNCTION, "handle"), - equalTo(CODE_NAMESPACE, "server.EchoHandlerFunction")), + equalTo(CODE_NAMESPACE, EchoHandlerFunction.class.getName())), span -> span.hasName("echo").hasParent(trace.getSpan(1)).hasTotalAttributeCount(0))); } From d8d3837af47450b454eb5564ef992187a1024cdd Mon Sep 17 00:00:00 2001 From: Cuichen Li Date: Fri, 20 Dec 2024 23:10:50 +0800 Subject: [PATCH 7/7] update to get method name --- .../server/HandlerCodeAttributesGetter.java | 4 +++ .../v5_0/server/SpringWebfluxTest.java | 30 +++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/HandlerCodeAttributesGetter.java b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/HandlerCodeAttributesGetter.java index 552890c7231b..c1ac972ffc63 100644 --- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/HandlerCodeAttributesGetter.java +++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/server/HandlerCodeAttributesGetter.java @@ -25,6 +25,10 @@ public Class getCodeClass(Object handler) { @Nullable @Override public String getMethodName(Object handler) { + if (handler instanceof HandlerMethod) { + HandlerMethod handlerMethod = (HandlerMethod) handler; + return handlerMethod.getMethod().getName(); + } return "handle"; } } 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 11af191f8cd7..74893c9073a2 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 @@ -139,7 +139,11 @@ void basicGetTest(Parameter parameter) { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(CODE_FUNCTION, "handle"), + satisfies( + CODE_FUNCTION, + parameter.annotatedMethod == null + ? val -> val.isEqualTo("handle") + : val -> val.isEqualTo(parameter.annotatedMethod)), satisfies( CODE_NAMESPACE, parameter.annotatedMethod == null @@ -259,7 +263,11 @@ void getAsyncResponseTest(Parameter parameter) { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(CODE_FUNCTION, "handle"), + satisfies( + CODE_FUNCTION, + parameter.annotatedMethod == null + ? val -> val.isEqualTo("handle") + : val -> val.isEqualTo(parameter.annotatedMethod)), satisfies( CODE_NAMESPACE, parameter.annotatedMethod == null @@ -366,7 +374,11 @@ void createSpanDuringHandlerFunctionTest(Parameter parameter) { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(CODE_FUNCTION, "handle"), + satisfies( + CODE_FUNCTION, + parameter.annotatedMethod == null + ? val -> val.isEqualTo("handle") + : val -> val.isEqualTo(parameter.annotatedMethod)), satisfies( CODE_NAMESPACE, parameter.annotatedMethod == null @@ -548,7 +560,11 @@ void getToBadEndpointTest(Parameter parameter) { EXCEPTION_STACKTRACE, val -> val.isInstanceOf(String.class)))) .hasAttributesSatisfyingExactly( - equalTo(CODE_FUNCTION, "handle"), + satisfies( + CODE_FUNCTION, + parameter.annotatedMethod == null + ? val -> val.isEqualTo("handle") + : val -> val.isEqualTo(parameter.annotatedMethod)), satisfies( CODE_NAMESPACE, parameter.annotatedMethod == null @@ -695,7 +711,11 @@ void multipleGetsToDelayingRoute(Parameter parameter) { span.hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(CODE_FUNCTION, "handle"), + satisfies( + CODE_FUNCTION, + parameter.annotatedMethod == null + ? val -> val.isEqualTo("handle") + : val -> val.isEqualTo(parameter.annotatedMethod)), satisfies( CODE_NAMESPACE, parameter.annotatedMethod == null