diff --git a/spring-web/src/main/java/org/springframework/http/client/observation/DefaultClientHttpObservationConvention.java b/spring-web/src/main/java/org/springframework/http/client/observation/DefaultClientHttpObservationConvention.java index 026ed5550d..edb2c4303f 100644 --- a/spring-web/src/main/java/org/springframework/http/client/observation/DefaultClientHttpObservationConvention.java +++ b/spring-web/src/main/java/org/springframework/http/client/observation/DefaultClientHttpObservationConvention.java @@ -69,6 +69,11 @@ public class DefaultClientHttpObservationConvention implements ClientHttpObserva return this.name; } + @Override + public String getContextualName(ClientHttpObservationContext context) { + return "http " + context.getCarrier().getMethod().name().toLowerCase(); + } + @Override public KeyValues getLowCardinalityKeyValues(ClientHttpObservationContext context) { return KeyValues.of(uri(context), method(context), status(context), exception(context), outcome(context)); diff --git a/spring-web/src/main/java/org/springframework/web/observation/DefaultHttpRequestsObservationConvention.java b/spring-web/src/main/java/org/springframework/web/observation/DefaultHttpRequestsObservationConvention.java index d9b2fad575..e8c51f7169 100644 --- a/spring-web/src/main/java/org/springframework/web/observation/DefaultHttpRequestsObservationConvention.java +++ b/spring-web/src/main/java/org/springframework/web/observation/DefaultHttpRequestsObservationConvention.java @@ -70,6 +70,11 @@ public class DefaultHttpRequestsObservationConvention implements HttpRequestsObs return this.name; } + @Override + public String getContextualName(HttpRequestsObservationContext context) { + return "http " + context.getCarrier().getMethod().toLowerCase(); + } + @Override public KeyValues getLowCardinalityKeyValues(HttpRequestsObservationContext context) { return KeyValues.of(method(context), uri(context), status(context), exception(context), outcome(context)); diff --git a/spring-web/src/main/java/org/springframework/web/observation/reactive/DefaultHttpRequestsObservationConvention.java b/spring-web/src/main/java/org/springframework/web/observation/reactive/DefaultHttpRequestsObservationConvention.java index 897cf0003e..45361707dc 100644 --- a/spring-web/src/main/java/org/springframework/web/observation/reactive/DefaultHttpRequestsObservationConvention.java +++ b/spring-web/src/main/java/org/springframework/web/observation/reactive/DefaultHttpRequestsObservationConvention.java @@ -73,6 +73,11 @@ public class DefaultHttpRequestsObservationConvention implements HttpRequestsObs return this.name; } + @Override + public String getContextualName(HttpRequestsObservationContext context) { + return "http " + context.getCarrier().getMethod().name().toLowerCase(); + } + @Override public KeyValues getLowCardinalityKeyValues(HttpRequestsObservationContext context) { return KeyValues.of(method(context), uri(context), status(context), exception(context), outcome(context)); diff --git a/spring-web/src/test/java/org/springframework/http/client/observation/DefaultClientHttpObservationConventionTests.java b/spring-web/src/test/java/org/springframework/http/client/observation/DefaultClientHttpObservationConventionTests.java index b31dc375ab..9c405e7df8 100644 --- a/spring-web/src/test/java/org/springframework/http/client/observation/DefaultClientHttpObservationConventionTests.java +++ b/spring-web/src/test/java/org/springframework/http/client/observation/DefaultClientHttpObservationConventionTests.java @@ -42,6 +42,18 @@ class DefaultClientHttpObservationConventionTests { private final DefaultClientHttpObservationConvention observationConvention = new DefaultClientHttpObservationConvention(); + @Test + void shouldHaveName() { + assertThat(this.observationConvention.getName()).isEqualTo("http.client.requests"); + } + + @Test + void shouldHaveContextualName() { + ClientHttpObservationContext context = new ClientHttpObservationContext(); + context.setCarrier(new MockClientHttpRequest(HttpMethod.GET, "/test")); + assertThat(this.observationConvention.getContextualName(context)).isEqualTo("http get"); + } + @Test void supportsOnlyClientHttpObservationContext() { assertThat(this.observationConvention.supportsContext(new ClientHttpObservationContext())).isTrue(); diff --git a/spring-web/src/test/java/org/springframework/web/observation/DefaultHttpRequestsObservationConventionTests.java b/spring-web/src/test/java/org/springframework/web/observation/DefaultHttpRequestsObservationConventionTests.java index 53323c31a0..c516f372d2 100644 --- a/spring-web/src/test/java/org/springframework/web/observation/DefaultHttpRequestsObservationConventionTests.java +++ b/spring-web/src/test/java/org/springframework/web/observation/DefaultHttpRequestsObservationConventionTests.java @@ -33,7 +33,7 @@ class DefaultHttpRequestsObservationConventionTests { private final DefaultHttpRequestsObservationConvention convention = new DefaultHttpRequestsObservationConvention(); - private final MockHttpServletRequest request = new MockHttpServletRequest(); + private final MockHttpServletRequest request = new MockHttpServletRequest("GET", "/test/resource"); private final MockHttpServletResponse response = new MockHttpServletResponse(); @@ -45,6 +45,11 @@ class DefaultHttpRequestsObservationConventionTests { assertThat(convention.getName()).isEqualTo("http.server.requests"); } + @Test + void shouldHaveContextualName() { + assertThat(convention.getContextualName(this.context)).isEqualTo("http get"); + } + @Test void supportsOnlyHttpRequestsObservationContext() { assertThat(this.convention.supportsContext(this.context)).isTrue(); @@ -66,7 +71,6 @@ class DefaultHttpRequestsObservationConventionTests { @Test void addsKeyValuesForExchangeWithPathPattern() { - this.request.setMethod("GET"); this.request.setRequestURI("/test/resource"); this.request.setPathInfo("/test/resource"); this.context.setPathPattern("/test/{name}"); @@ -80,7 +84,6 @@ class DefaultHttpRequestsObservationConventionTests { @Test void addsKeyValuesForErrorExchange() { - this.request.setMethod("GET"); this.request.setRequestURI("/test/resource"); this.request.setPathInfo("/test/resource"); this.context.setError(new IllegalArgumentException("custom error")); @@ -95,7 +98,6 @@ class DefaultHttpRequestsObservationConventionTests { @Test void addsKeyValuesForRedirectExchange() { - this.request.setMethod("GET"); this.request.setRequestURI("/test/redirect"); this.request.setPathInfo("/test/redirect"); this.response.setStatus(302); @@ -110,7 +112,6 @@ class DefaultHttpRequestsObservationConventionTests { @Test void addsKeyValuesForNotFoundExchange() { - this.request.setMethod("GET"); this.request.setRequestURI("/test/notFound"); this.request.setPathInfo("/test/notFound"); this.response.setStatus(404); diff --git a/spring-web/src/test/java/org/springframework/web/observation/reactive/DefaultHttpRequestsObservationConventionTests.java b/spring-web/src/test/java/org/springframework/web/observation/reactive/DefaultHttpRequestsObservationConventionTests.java index 446dead3ca..417ad78a20 100644 --- a/spring-web/src/test/java/org/springframework/web/observation/reactive/DefaultHttpRequestsObservationConventionTests.java +++ b/spring-web/src/test/java/org/springframework/web/observation/reactive/DefaultHttpRequestsObservationConventionTests.java @@ -42,6 +42,13 @@ class DefaultHttpRequestsObservationConventionTests { assertThat(convention.getName()).isEqualTo("http.server.requests"); } + @Test + void shouldHaveContextualName() { + ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test/resource")); + HttpRequestsObservationContext context = new HttpRequestsObservationContext(exchange); + assertThat(convention.getContextualName(context)).isEqualTo("http get"); + } + @Test void supportsOnlyHttpRequestsObservationContext() { ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.post("/test/resource")); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientObservationConvention.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientObservationConvention.java index 256599f642..53375081ac 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientObservationConvention.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientObservationConvention.java @@ -67,6 +67,11 @@ public class DefaultClientObservationConvention implements ClientObservationConv return this.name; } + @Override + public String getContextualName(ClientObservationContext context) { + return "http " + context.getCarrier().method().name().toLowerCase(); + } + @Override public KeyValues getLowCardinalityKeyValues(ClientObservationContext context) { return KeyValues.of(uri(context), method(context), status(context), exception(context), outcome(context)); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientObservationConventionTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientObservationConventionTests.java index a76b30c23a..7efb49fe56 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientObservationConventionTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultClientObservationConventionTests.java @@ -36,6 +36,18 @@ class DefaultClientObservationConventionTests { private DefaultClientObservationConvention observationConvention = new DefaultClientObservationConvention(); + @Test + void shouldHaveName() { + assertThat(this.observationConvention.getName()).isEqualTo("http.client.requests"); + } + + @Test + void shouldHaveContextualName() { + ClientObservationContext context = new ClientObservationContext(); + context.setCarrier(ClientRequest.create(HttpMethod.GET, URI.create("/test")).build()); + assertThat(this.observationConvention.getContextualName(context)).isEqualTo("http get"); + } + @Test void shouldOnlySupportWebClientObservationContext() { assertThat(this.observationConvention.supportsContext(new ClientObservationContext())).isTrue();