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 d011705ae1..eba0a0e8b5 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 9e3244c7d4..55170a6b23 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 920c54e1d4..9f7e61eb95 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 42afdf35c5..37b47b5623 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"));