From a94b0e51e27a744968bbd988b0bfd4e2a337d2f2 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 2 Nov 2022 20:57:41 +0100 Subject: [PATCH] Align server contextual names with OTel conventions This commit ensures that the matching path pattern for the request being observed is used in the conytextual name, as advised in the OTel HTTP server semantic conventions. If the path pattern is not available, no additional value is provided and the "http {method}" baseline is being used. Fixes gh-29424 --- .../DefaultServerRequestObservationConvention.java | 4 ++++ .../DefaultServerRequestObservationConvention.java | 4 ++++ .../DefaultServerRequestObservationConventionTests.java | 6 ++++++ .../DefaultServerRequestObservationConventionTests.java | 8 ++++++++ 4 files changed, 22 insertions(+) diff --git a/spring-web/src/main/java/org/springframework/http/observation/DefaultServerRequestObservationConvention.java b/spring-web/src/main/java/org/springframework/http/observation/DefaultServerRequestObservationConvention.java index d011705ae11..eba0a0e8b5f 100644 --- a/spring-web/src/main/java/org/springframework/http/observation/DefaultServerRequestObservationConvention.java +++ b/spring-web/src/main/java/org/springframework/http/observation/DefaultServerRequestObservationConvention.java @@ -76,6 +76,10 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO @Override public String getContextualName(ServerRequestObservationContext context) { + if (context.getPathPattern() != null) { + return String.format("http %s %s", context.getCarrier().getMethod().toLowerCase(), + context.getPathPattern()); + } return "http " + context.getCarrier().getMethod().toLowerCase(); } diff --git a/spring-web/src/main/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConvention.java b/spring-web/src/main/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConvention.java index 9e3244c7d4c..55170a6b23c 100644 --- a/spring-web/src/main/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConvention.java +++ b/spring-web/src/main/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConvention.java @@ -79,6 +79,10 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO @Override public String getContextualName(ServerRequestObservationContext context) { + if (context.getPathPattern() != null) { + return String.format("http %s %s", context.getCarrier().getMethod().name().toLowerCase(), + context.getPathPattern().toString()); + } return "http " + context.getCarrier().getMethod().name().toLowerCase(); } diff --git a/spring-web/src/test/java/org/springframework/http/observation/DefaultServerRequestObservationConventionTests.java b/spring-web/src/test/java/org/springframework/http/observation/DefaultServerRequestObservationConventionTests.java index 920c54e1d4a..9f7e61eb957 100644 --- a/spring-web/src/test/java/org/springframework/http/observation/DefaultServerRequestObservationConventionTests.java +++ b/spring-web/src/test/java/org/springframework/http/observation/DefaultServerRequestObservationConventionTests.java @@ -50,6 +50,12 @@ class DefaultServerRequestObservationConventionTests { assertThat(convention.getContextualName(this.context)).isEqualTo("http get"); } + @Test + void contextualNameShouldUsePathPatternWhenAvailable() { + this.context.setPathPattern("/test/{name}"); + assertThat(convention.getContextualName(this.context)).isEqualTo("http get /test/{name}"); + } + @Test void supportsOnlyHttpRequestsObservationContext() { assertThat(this.convention.supportsContext(this.context)).isTrue(); diff --git a/spring-web/src/test/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConventionTests.java b/spring-web/src/test/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConventionTests.java index 42afdf35c5d..37b47b56235 100644 --- a/spring-web/src/test/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConventionTests.java +++ b/spring-web/src/test/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConventionTests.java @@ -49,6 +49,14 @@ class DefaultServerRequestObservationConventionTests { assertThat(convention.getContextualName(context)).isEqualTo("http get"); } + @Test + void contextualNameShouldUsePathPatternWhenAvailable() { + ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test/resource")); + ServerRequestObservationContext context = new ServerRequestObservationContext(exchange); + context.setPathPattern(PathPatternParser.defaultInstance.parse("/test/{name}")); + assertThat(convention.getContextualName(context)).isEqualTo("http get /test/{name}"); + } + @Test void supportsOnlyHttpRequestsObservationContext() { ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.post("/test/resource"));