From 455a736a01176fd48aa29e5d322dc6c9d53e397f Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Thu, 6 Oct 2022 11:36:47 +0200 Subject: [PATCH] Switch to Micrometer 1.10.0-SNAPSHOT See gh-29241 --- framework-platform/framework-platform.gradle | 2 +- ...> ClientHttpObservationDocumentation.java} | 4 +- ...efaultClientHttpObservationConvention.java | 36 +++++++++-------- .../web/client/RestTemplate.java | 6 +-- ...aultHttpRequestsObservationConvention.java | 35 ++++++++-------- ...HttpRequestsObservationDocumentation.java} | 4 +- .../HttpRequestsObservationFilter.java | 4 +- ...aultHttpRequestsObservationConvention.java | 35 ++++++++-------- ...HttpRequestsObservationDocumentation.java} | 4 +- .../HttpRequestsObservationWebFilter.java | 2 +- .../HttpRequestsObservationFilterTests.java | 4 +- ...HttpRequestsObservationWebFilterTests.java | 2 +- ...va => ClientObservationDocumentation.java} | 8 ++-- .../DefaultClientObservationConvention.java | 40 ++++++++++--------- .../function/client/DefaultWebClient.java | 4 +- 15 files changed, 98 insertions(+), 92 deletions(-) rename spring-web/src/main/java/org/springframework/http/client/observation/{ClientHttpObservation.java => ClientHttpObservationDocumentation.java} (95%) rename spring-web/src/main/java/org/springframework/web/observation/{HttpRequestsObservation.java => HttpRequestsObservationDocumentation.java} (95%) rename spring-web/src/main/java/org/springframework/web/observation/reactive/{HttpRequestsObservation.java => HttpRequestsObservationDocumentation.java} (95%) rename spring-webflux/src/main/java/org/springframework/web/reactive/function/client/{ClientObservation.java => ClientObservationDocumentation.java} (90%) diff --git a/framework-platform/framework-platform.gradle b/framework-platform/framework-platform.gradle index 2c948581b7..63d67f06d0 100644 --- a/framework-platform/framework-platform.gradle +++ b/framework-platform/framework-platform.gradle @@ -8,7 +8,7 @@ javaPlatform { dependencies { api(platform("com.fasterxml.jackson:jackson-bom:2.13.4")) - api(platform("io.micrometer:micrometer-bom:1.10.0-M6")) + api(platform("io.micrometer:micrometer-bom:1.10.0-SNAPSHOT")) api(platform("io.netty:netty-bom:4.1.82.Final")) api(platform("io.netty:netty5-bom:5.0.0.Alpha5")) api(platform("io.projectreactor:reactor-bom:2022.0.0-SNAPSHOT")) diff --git a/spring-web/src/main/java/org/springframework/http/client/observation/ClientHttpObservation.java b/spring-web/src/main/java/org/springframework/http/client/observation/ClientHttpObservationDocumentation.java similarity index 95% rename from spring-web/src/main/java/org/springframework/http/client/observation/ClientHttpObservation.java rename to spring-web/src/main/java/org/springframework/http/client/observation/ClientHttpObservationDocumentation.java index e5c3cb81bd..44f06737c0 100644 --- a/spring-web/src/main/java/org/springframework/http/client/observation/ClientHttpObservation.java +++ b/spring-web/src/main/java/org/springframework/http/client/observation/ClientHttpObservationDocumentation.java @@ -19,7 +19,7 @@ package org.springframework.http.client.observation; import io.micrometer.common.docs.KeyName; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationConvention; -import io.micrometer.observation.docs.DocumentedObservation; +import io.micrometer.observation.docs.ObservationDocumentation; import org.springframework.http.client.ClientHttpRequestFactory; @@ -30,7 +30,7 @@ import org.springframework.http.client.ClientHttpRequestFactory; * @author Brian Clozel * @since 6.0 */ -public enum ClientHttpObservation implements DocumentedObservation { +public enum ClientHttpObservationDocumentation implements ObservationDocumentation { /** * Observation created for a client HTTP exchange. 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 bce76cc602..9fcedf226f 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 @@ -36,19 +36,19 @@ public class DefaultClientHttpObservationConvention implements ClientHttpObserva private static final String DEFAULT_NAME = "http.client.requests"; - private static final KeyValue URI_NONE = KeyValue.of(ClientHttpObservation.LowCardinalityKeyNames.URI, "none"); + private static final KeyValue URI_NONE = KeyValue.of(ClientHttpObservationDocumentation.LowCardinalityKeyNames.URI, "none"); - private static final KeyValue METHOD_NONE = KeyValue.of(ClientHttpObservation.LowCardinalityKeyNames.METHOD, "none"); + private static final KeyValue METHOD_NONE = KeyValue.of(ClientHttpObservationDocumentation.LowCardinalityKeyNames.METHOD, "none"); - private static final KeyValue STATUS_IO_ERROR = KeyValue.of(ClientHttpObservation.LowCardinalityKeyNames.STATUS, "IO_ERROR"); + private static final KeyValue STATUS_IO_ERROR = KeyValue.of(ClientHttpObservationDocumentation.LowCardinalityKeyNames.STATUS, "IO_ERROR"); - private static final KeyValue STATUS_CLIENT_ERROR = KeyValue.of(ClientHttpObservation.LowCardinalityKeyNames.STATUS, "CLIENT_ERROR"); + private static final KeyValue STATUS_CLIENT_ERROR = KeyValue.of(ClientHttpObservationDocumentation.LowCardinalityKeyNames.STATUS, "CLIENT_ERROR"); - private static final KeyValue EXCEPTION_NONE = KeyValue.of(ClientHttpObservation.LowCardinalityKeyNames.EXCEPTION, "none"); + private static final KeyValue EXCEPTION_NONE = KeyValue.of(ClientHttpObservationDocumentation.LowCardinalityKeyNames.EXCEPTION, "none"); - private static final KeyValue HTTP_URL_NONE = KeyValue.of(ClientHttpObservation.HighCardinalityKeyNames.HTTP_URL, "none"); + private static final KeyValue HTTP_URL_NONE = KeyValue.of(ClientHttpObservationDocumentation.HighCardinalityKeyNames.HTTP_URL, "none"); - private static final KeyValue CLIENT_NAME_NONE = KeyValue.of(ClientHttpObservation.HighCardinalityKeyNames.CLIENT_NAME, "none"); + private static final KeyValue CLIENT_NAME_NONE = KeyValue.of(ClientHttpObservationDocumentation.HighCardinalityKeyNames.CLIENT_NAME, "none"); private final String name; @@ -84,14 +84,14 @@ public class DefaultClientHttpObservationConvention implements ClientHttpObserva protected KeyValue uri(ClientHttpObservationContext context) { if (context.getUriTemplate() != null) { - return KeyValue.of(ClientHttpObservation.LowCardinalityKeyNames.URI, context.getUriTemplate()); + return KeyValue.of(ClientHttpObservationDocumentation.LowCardinalityKeyNames.URI, context.getUriTemplate()); } return URI_NONE; } protected KeyValue method(ClientHttpObservationContext context) { if (context.getCarrier() != null) { - return KeyValue.of(ClientHttpObservation.LowCardinalityKeyNames.METHOD, context.getCarrier().getMethod().name()); + return KeyValue.of(ClientHttpObservationDocumentation.LowCardinalityKeyNames.METHOD, context.getCarrier().getMethod().name()); } else { return METHOD_NONE; @@ -104,7 +104,7 @@ public class DefaultClientHttpObservationConvention implements ClientHttpObserva return STATUS_CLIENT_ERROR; } try { - return KeyValue.of(ClientHttpObservation.LowCardinalityKeyNames.STATUS, String.valueOf(response.getStatusCode().value())); + return KeyValue.of(ClientHttpObservationDocumentation.LowCardinalityKeyNames.STATUS, String.valueOf(response.getStatusCode().value())); } catch (IOException ex) { return STATUS_IO_ERROR; @@ -112,11 +112,13 @@ public class DefaultClientHttpObservationConvention implements ClientHttpObserva } protected KeyValue exception(ClientHttpObservationContext context) { - return context.getError().map(exception -> { - String simpleName = exception.getClass().getSimpleName(); - return KeyValue.of(ClientHttpObservation.LowCardinalityKeyNames.EXCEPTION, - StringUtils.hasText(simpleName) ? simpleName : exception.getClass().getName()); - }).orElse(EXCEPTION_NONE); + Throwable error = context.getError(); + if (error != null) { + String simpleName = error.getClass().getSimpleName(); + return KeyValue.of(ClientHttpObservationDocumentation.LowCardinalityKeyNames.EXCEPTION, + StringUtils.hasText(simpleName) ? simpleName : error.getClass().getName()); + } + return EXCEPTION_NONE; } protected static KeyValue outcome(ClientHttpObservationContext context) { @@ -139,14 +141,14 @@ public class DefaultClientHttpObservationConvention implements ClientHttpObserva protected KeyValue requestUri(ClientHttpObservationContext context) { if (context.getCarrier() != null) { - return KeyValue.of(ClientHttpObservation.HighCardinalityKeyNames.HTTP_URL, context.getCarrier().getURI().toASCIIString()); + return KeyValue.of(ClientHttpObservationDocumentation.HighCardinalityKeyNames.HTTP_URL, context.getCarrier().getURI().toASCIIString()); } return HTTP_URL_NONE; } protected KeyValue clientName(ClientHttpObservationContext context) { if (context.getCarrier() != null && context.getCarrier().getURI().getHost() != null) { - return KeyValue.of(ClientHttpObservation.HighCardinalityKeyNames.CLIENT_NAME, context.getCarrier().getURI().getHost()); + return KeyValue.of(ClientHttpObservationDocumentation.HighCardinalityKeyNames.CLIENT_NAME, context.getCarrier().getURI().getHost()); } return CLIENT_NAME_NONE; } diff --git a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java index edb93690c9..1152f452d4 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java @@ -44,9 +44,9 @@ import org.springframework.http.ResponseEntity; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.ClientHttpResponse; -import org.springframework.http.client.observation.ClientHttpObservation; import org.springframework.http.client.observation.ClientHttpObservationContext; import org.springframework.http.client.observation.ClientHttpObservationConvention; +import org.springframework.http.client.observation.ClientHttpObservationDocumentation; import org.springframework.http.client.observation.DefaultClientHttpObservationConvention; import org.springframework.http.client.support.InterceptingHttpAccessor; import org.springframework.http.converter.ByteArrayHttpMessageConverter; @@ -865,8 +865,8 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat } ClientHttpObservationContext observationContext = new ClientHttpObservationContext(request); observationContext.setUriTemplate(uriTemplate); - Observation observation = ClientHttpObservation.HTTP_REQUEST.observation(this.observationConvention, - DEFAULT_OBSERVATION_CONVENTION, observationContext, this.observationRegistry).start(); + Observation observation = ClientHttpObservationDocumentation.HTTP_REQUEST.observation(this.observationConvention, + DEFAULT_OBSERVATION_CONVENTION, () -> observationContext, this.observationRegistry).start(); ClientHttpResponse response = null; try { if (requestCallback != null) { 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 85df4e3947..d4b0e17de6 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 @@ -33,21 +33,21 @@ public class DefaultHttpRequestsObservationConvention implements HttpRequestsObs private static final String DEFAULT_NAME = "http.server.requests"; - private static final KeyValue METHOD_UNKNOWN = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.METHOD, "UNKNOWN"); + private static final KeyValue METHOD_UNKNOWN = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.METHOD, "UNKNOWN"); - private static final KeyValue STATUS_UNKNOWN = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.STATUS, "UNKNOWN"); + private static final KeyValue STATUS_UNKNOWN = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.STATUS, "UNKNOWN"); - private static final KeyValue URI_UNKNOWN = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.URI, "UNKNOWN"); + private static final KeyValue URI_UNKNOWN = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.URI, "UNKNOWN"); - private static final KeyValue URI_ROOT = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.URI, "root"); + private static final KeyValue URI_ROOT = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.URI, "root"); - private static final KeyValue URI_NOT_FOUND = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.URI, "NOT_FOUND"); + private static final KeyValue URI_NOT_FOUND = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.URI, "NOT_FOUND"); - private static final KeyValue URI_REDIRECTION = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.URI, "REDIRECTION"); + private static final KeyValue URI_REDIRECTION = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.URI, "REDIRECTION"); - private static final KeyValue EXCEPTION_NONE = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.EXCEPTION, "none"); + private static final KeyValue EXCEPTION_NONE = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.EXCEPTION, "none"); - private static final KeyValue HTTP_URL_UNKNOWN = KeyValue.of(HttpRequestsObservation.HighCardinalityKeyNames.HTTP_URL, "UNKNOWN"); + private static final KeyValue HTTP_URL_UNKNOWN = KeyValue.of(HttpRequestsObservationDocumentation.HighCardinalityKeyNames.HTTP_URL, "UNKNOWN"); private final String name; @@ -87,11 +87,11 @@ public class DefaultHttpRequestsObservationConvention implements HttpRequestsObs } protected KeyValue method(HttpRequestsObservationContext context) { - return (context.getCarrier() != null) ? KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.METHOD, context.getCarrier().getMethod()) : METHOD_UNKNOWN; + return (context.getCarrier() != null) ? KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.METHOD, context.getCarrier().getMethod()) : METHOD_UNKNOWN; } protected KeyValue status(HttpRequestsObservationContext context) { - return (context.getResponse() != null) ? KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.STATUS, Integer.toString(context.getResponse().getStatus())) : STATUS_UNKNOWN; + return (context.getResponse() != null) ? KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.STATUS, Integer.toString(context.getResponse().getStatus())) : STATUS_UNKNOWN; } protected KeyValue uri(HttpRequestsObservationContext context) { @@ -119,12 +119,13 @@ public class DefaultHttpRequestsObservationConvention implements HttpRequestsObs } protected KeyValue exception(HttpRequestsObservationContext context) { - return context.getError().map(throwable -> { - String simpleName = throwable.getClass().getSimpleName(); - return KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.EXCEPTION, - StringUtils.hasText(simpleName) ? simpleName : throwable.getClass().getName()); - }) - .orElse(EXCEPTION_NONE); + Throwable error = context.getError(); + if (error != null) { + String simpleName = error.getClass().getSimpleName(); + return KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.EXCEPTION, + StringUtils.hasText(simpleName) ? simpleName : error.getClass().getName()); + } + return EXCEPTION_NONE; } protected KeyValue outcome(HttpRequestsObservationContext context) { @@ -138,7 +139,7 @@ public class DefaultHttpRequestsObservationConvention implements HttpRequestsObs protected KeyValue uriExpanded(HttpRequestsObservationContext context) { if (context.getCarrier() != null) { - return KeyValue.of(HttpRequestsObservation.HighCardinalityKeyNames.HTTP_URL, context.getCarrier().getRequestURI()); + return KeyValue.of(HttpRequestsObservationDocumentation.HighCardinalityKeyNames.HTTP_URL, context.getCarrier().getRequestURI()); } return HTTP_URL_UNKNOWN; } diff --git a/spring-web/src/main/java/org/springframework/web/observation/HttpRequestsObservation.java b/spring-web/src/main/java/org/springframework/web/observation/HttpRequestsObservationDocumentation.java similarity index 95% rename from spring-web/src/main/java/org/springframework/web/observation/HttpRequestsObservation.java rename to spring-web/src/main/java/org/springframework/web/observation/HttpRequestsObservationDocumentation.java index d0f7b3eccd..a468da62f9 100644 --- a/spring-web/src/main/java/org/springframework/web/observation/HttpRequestsObservation.java +++ b/spring-web/src/main/java/org/springframework/web/observation/HttpRequestsObservationDocumentation.java @@ -19,7 +19,7 @@ package org.springframework.web.observation; import io.micrometer.common.docs.KeyName; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationConvention; -import io.micrometer.observation.docs.DocumentedObservation; +import io.micrometer.observation.docs.ObservationDocumentation; /** * Documented {@link io.micrometer.common.KeyValue KeyValues} for the HTTP server observations @@ -28,7 +28,7 @@ import io.micrometer.observation.docs.DocumentedObservation; * @author Brian Clozel * @since 6.0 */ -public enum HttpRequestsObservation implements DocumentedObservation { +public enum HttpRequestsObservationDocumentation implements ObservationDocumentation { /** * HTTP server request observations. diff --git a/spring-web/src/main/java/org/springframework/web/observation/HttpRequestsObservationFilter.java b/spring-web/src/main/java/org/springframework/web/observation/HttpRequestsObservationFilter.java index 9dc78c5be7..fc6fab6363 100644 --- a/spring-web/src/main/java/org/springframework/web/observation/HttpRequestsObservationFilter.java +++ b/spring-web/src/main/java/org/springframework/web/observation/HttpRequestsObservationFilter.java @@ -125,8 +125,8 @@ public class HttpRequestsObservationFilter extends OncePerRequestFilter { Observation observation = (Observation) request.getAttribute(CURRENT_OBSERVATION_ATTRIBUTE); if (observation == null) { HttpRequestsObservationContext context = new HttpRequestsObservationContext(request, response); - observation = HttpRequestsObservation.HTTP_REQUESTS.observation(this.observationConvention, - DEFAULT_OBSERVATION_CONVENTION, context, this.observationRegistry).start(); + observation = HttpRequestsObservationDocumentation.HTTP_REQUESTS.observation(this.observationConvention, + DEFAULT_OBSERVATION_CONVENTION, () -> context, this.observationRegistry).start(); request.setAttribute(CURRENT_OBSERVATION_ATTRIBUTE, observation); request.setAttribute(CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE, observation.getContext()); } 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 b117637e3b..259eb07bfc 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 @@ -34,21 +34,21 @@ public class DefaultHttpRequestsObservationConvention implements HttpRequestsObs private static final String DEFAULT_NAME = "http.server.requests"; - private static final KeyValue METHOD_UNKNOWN = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.METHOD, "UNKNOWN"); + private static final KeyValue METHOD_UNKNOWN = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.METHOD, "UNKNOWN"); - private static final KeyValue STATUS_UNKNOWN = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.STATUS, "UNKNOWN"); + private static final KeyValue STATUS_UNKNOWN = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.STATUS, "UNKNOWN"); - private static final KeyValue URI_UNKNOWN = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.URI, "UNKNOWN"); + private static final KeyValue URI_UNKNOWN = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.URI, "UNKNOWN"); - private static final KeyValue URI_ROOT = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.URI, "root"); + private static final KeyValue URI_ROOT = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.URI, "root"); - private static final KeyValue URI_NOT_FOUND = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.URI, "NOT_FOUND"); + private static final KeyValue URI_NOT_FOUND = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.URI, "NOT_FOUND"); - private static final KeyValue URI_REDIRECTION = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.URI, "REDIRECTION"); + private static final KeyValue URI_REDIRECTION = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.URI, "REDIRECTION"); - private static final KeyValue EXCEPTION_NONE = KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.EXCEPTION, "none"); + private static final KeyValue EXCEPTION_NONE = KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.EXCEPTION, "none"); - private static final KeyValue HTTP_URL_UNKNOWN = KeyValue.of(HttpRequestsObservation.HighCardinalityKeyNames.HTTP_URL, "UNKNOWN"); + private static final KeyValue HTTP_URL_UNKNOWN = KeyValue.of(HttpRequestsObservationDocumentation.HighCardinalityKeyNames.HTTP_URL, "UNKNOWN"); private final String name; @@ -89,14 +89,14 @@ public class DefaultHttpRequestsObservationConvention implements HttpRequestsObs } protected KeyValue method(HttpRequestsObservationContext context) { - return (context.getCarrier() != null) ? KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.METHOD, context.getCarrier().getMethod().name()) : METHOD_UNKNOWN; + return (context.getCarrier() != null) ? KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.METHOD, context.getCarrier().getMethod().name()) : METHOD_UNKNOWN; } protected KeyValue status(HttpRequestsObservationContext context) { if (context.isConnectionAborted()) { return STATUS_UNKNOWN; } - return (context.getResponse() != null) ? KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.STATUS, Integer.toString(context.getResponse().getStatusCode().value())) : STATUS_UNKNOWN; + return (context.getResponse() != null) ? KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.STATUS, Integer.toString(context.getResponse().getStatusCode().value())) : STATUS_UNKNOWN; } protected KeyValue uri(HttpRequestsObservationContext context) { @@ -124,12 +124,13 @@ public class DefaultHttpRequestsObservationConvention implements HttpRequestsObs } protected KeyValue exception(HttpRequestsObservationContext context) { - return context.getError().map(throwable -> { - String simpleName = throwable.getClass().getSimpleName(); - return KeyValue.of(HttpRequestsObservation.LowCardinalityKeyNames.EXCEPTION, - StringUtils.hasText(simpleName) ? simpleName : throwable.getClass().getName()); - }) - .orElse(EXCEPTION_NONE); + Throwable error = context.getError(); + if (error != null) { + String simpleName = error.getClass().getSimpleName(); + return KeyValue.of(HttpRequestsObservationDocumentation.LowCardinalityKeyNames.EXCEPTION, + StringUtils.hasText(simpleName) ? simpleName : error.getClass().getName()); + } + return EXCEPTION_NONE; } protected KeyValue outcome(HttpRequestsObservationContext context) { @@ -146,7 +147,7 @@ public class DefaultHttpRequestsObservationConvention implements HttpRequestsObs protected KeyValue httpUrl(HttpRequestsObservationContext context) { if (context.getCarrier() != null) { String uriExpanded = context.getCarrier().getPath().toString(); - return KeyValue.of(HttpRequestsObservation.HighCardinalityKeyNames.HTTP_URL, uriExpanded); + return KeyValue.of(HttpRequestsObservationDocumentation.HighCardinalityKeyNames.HTTP_URL, uriExpanded); } return HTTP_URL_UNKNOWN; } diff --git a/spring-web/src/main/java/org/springframework/web/observation/reactive/HttpRequestsObservation.java b/spring-web/src/main/java/org/springframework/web/observation/reactive/HttpRequestsObservationDocumentation.java similarity index 95% rename from spring-web/src/main/java/org/springframework/web/observation/reactive/HttpRequestsObservation.java rename to spring-web/src/main/java/org/springframework/web/observation/reactive/HttpRequestsObservationDocumentation.java index e71a182f65..2bd8485d81 100644 --- a/spring-web/src/main/java/org/springframework/web/observation/reactive/HttpRequestsObservation.java +++ b/spring-web/src/main/java/org/springframework/web/observation/reactive/HttpRequestsObservationDocumentation.java @@ -19,7 +19,7 @@ package org.springframework.web.observation.reactive; import io.micrometer.common.docs.KeyName; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationConvention; -import io.micrometer.observation.docs.DocumentedObservation; +import io.micrometer.observation.docs.ObservationDocumentation; /** * Documented {@link io.micrometer.common.KeyValue KeyValues} for the HTTP server observations @@ -28,7 +28,7 @@ import io.micrometer.observation.docs.DocumentedObservation; * @author Brian Clozel * @since 6.0 */ -public enum HttpRequestsObservation implements DocumentedObservation { +public enum HttpRequestsObservationDocumentation implements ObservationDocumentation { /** * HTTP server request observations. diff --git a/spring-web/src/main/java/org/springframework/web/observation/reactive/HttpRequestsObservationWebFilter.java b/spring-web/src/main/java/org/springframework/web/observation/reactive/HttpRequestsObservationWebFilter.java index 6f8cfb7c74..8e5bd463b5 100644 --- a/spring-web/src/main/java/org/springframework/web/observation/reactive/HttpRequestsObservationWebFilter.java +++ b/spring-web/src/main/java/org/springframework/web/observation/reactive/HttpRequestsObservationWebFilter.java @@ -97,7 +97,7 @@ public class HttpRequestsObservationWebFilter implements WebFilter { } private Publisher filter(ServerWebExchange exchange, HttpRequestsObservationContext observationContext, Mono call) { - Observation observation = HttpRequestsObservation.HTTP_REQUESTS.createNotStarted(this.observationConvention, + Observation observation = HttpRequestsObservationDocumentation.HTTP_REQUESTS.observation(this.observationConvention, DEFAULT_OBSERVATION_CONVENTION, () -> observationContext, this.observationRegistry); observation.start(); return call.doOnEach(signal -> { diff --git a/spring-web/src/test/java/org/springframework/web/observation/HttpRequestsObservationFilterTests.java b/spring-web/src/test/java/org/springframework/web/observation/HttpRequestsObservationFilterTests.java index d587f2308f..8f2e59874d 100644 --- a/spring-web/src/test/java/org/springframework/web/observation/HttpRequestsObservationFilterTests.java +++ b/spring-web/src/test/java/org/springframework/web/observation/HttpRequestsObservationFilterTests.java @@ -68,7 +68,7 @@ class HttpRequestsObservationFilterTests { HttpRequestsObservationContext context = (HttpRequestsObservationContext) this.request .getAttribute(HttpRequestsObservationFilter.CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE); - assertThat(context.getError()).get().isEqualTo(customError); + assertThat(context.getError()).isEqualTo(customError); assertThatHttpObservation().hasLowCardinalityKeyValue("outcome", "SERVER_ERROR"); } @@ -83,7 +83,7 @@ class HttpRequestsObservationFilterTests { }).isInstanceOf(ServletException.class); HttpRequestsObservationContext context = (HttpRequestsObservationContext) this.request .getAttribute(HttpRequestsObservationFilter.CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE); - assertThat(context.getError()).get().isEqualTo(customError); + assertThat(context.getError()).isEqualTo(customError); assertThatHttpObservation().hasLowCardinalityKeyValue("outcome", "SUCCESS"); } diff --git a/spring-web/src/test/java/org/springframework/web/observation/reactive/HttpRequestsObservationWebFilterTests.java b/spring-web/src/test/java/org/springframework/web/observation/reactive/HttpRequestsObservationWebFilterTests.java index 5fb307b2cc..b091f3b219 100644 --- a/spring-web/src/test/java/org/springframework/web/observation/reactive/HttpRequestsObservationWebFilterTests.java +++ b/spring-web/src/test/java/org/springframework/web/observation/reactive/HttpRequestsObservationWebFilterTests.java @@ -69,7 +69,7 @@ class HttpRequestsObservationWebFilterTests { .expectError(IllegalArgumentException.class) .verify(); Optional observationContext = HttpRequestsObservationWebFilter.findObservationContext(exchange); - assertThat(observationContext.get().getError()).get().isInstanceOf(IllegalArgumentException.class); + assertThat(observationContext.get().getError()).isInstanceOf(IllegalArgumentException.class); assertThatHttpObservation().hasLowCardinalityKeyValue("outcome", "SERVER_ERROR"); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ClientObservation.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ClientObservationDocumentation.java similarity index 90% rename from spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ClientObservation.java rename to spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ClientObservationDocumentation.java index 75c4d727f3..855578bf9d 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ClientObservation.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/ClientObservationDocumentation.java @@ -19,7 +19,7 @@ package org.springframework.web.reactive.function.client; import io.micrometer.common.docs.KeyName; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationConvention; -import io.micrometer.observation.docs.DocumentedObservation; +import io.micrometer.observation.docs.ObservationDocumentation; /** * Documented {@link io.micrometer.common.KeyValue KeyValues} for the {@link WebClient} observations. @@ -27,7 +27,7 @@ import io.micrometer.observation.docs.DocumentedObservation; * @author Brian Clozel * @since 6.0 */ -public enum ClientObservation implements DocumentedObservation { +public enum ClientObservationDocumentation implements ObservationDocumentation { /** * Observation created for an HTTP client exchange. @@ -40,12 +40,12 @@ public enum ClientObservation implements DocumentedObservation { @Override public KeyName[] getLowCardinalityKeyNames() { - return ClientObservation.LowCardinalityKeyNames.values(); + return ClientObservationDocumentation.LowCardinalityKeyNames.values(); } @Override public KeyName[] getHighCardinalityKeyNames() { - return ClientObservation.HighCardinalityKeyNames.values(); + return ClientObservationDocumentation.HighCardinalityKeyNames.values(); } }; 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 35591ff360..080c2eea84 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 @@ -22,7 +22,7 @@ import io.micrometer.common.KeyValue; import io.micrometer.common.KeyValues; import io.micrometer.observation.ObservationConvention; -import org.springframework.http.client.observation.ClientHttpObservation; +import org.springframework.http.client.observation.ClientHttpObservationDocumentation; import org.springframework.http.observation.HttpOutcome; import org.springframework.util.StringUtils; @@ -37,19 +37,19 @@ public class DefaultClientObservationConvention implements ClientObservationConv private static final String DEFAULT_NAME = "http.client.requests"; - private static final KeyValue URI_NONE = KeyValue.of(ClientObservation.LowCardinalityKeyNames.URI, "none"); + private static final KeyValue URI_NONE = KeyValue.of(ClientObservationDocumentation.LowCardinalityKeyNames.URI, "none"); - private static final KeyValue METHOD_NONE = KeyValue.of(ClientObservation.LowCardinalityKeyNames.METHOD, "none"); + private static final KeyValue METHOD_NONE = KeyValue.of(ClientObservationDocumentation.LowCardinalityKeyNames.METHOD, "none"); - private static final KeyValue STATUS_IO_ERROR = KeyValue.of(ClientHttpObservation.LowCardinalityKeyNames.STATUS, "IO_ERROR"); + private static final KeyValue STATUS_IO_ERROR = KeyValue.of(ClientHttpObservationDocumentation.LowCardinalityKeyNames.STATUS, "IO_ERROR"); - private static final KeyValue STATUS_CLIENT_ERROR = KeyValue.of(ClientHttpObservation.LowCardinalityKeyNames.STATUS, "CLIENT_ERROR"); + private static final KeyValue STATUS_CLIENT_ERROR = KeyValue.of(ClientHttpObservationDocumentation.LowCardinalityKeyNames.STATUS, "CLIENT_ERROR"); - private static final KeyValue EXCEPTION_NONE = KeyValue.of(ClientObservation.LowCardinalityKeyNames.EXCEPTION, "none"); + private static final KeyValue EXCEPTION_NONE = KeyValue.of(ClientObservationDocumentation.LowCardinalityKeyNames.EXCEPTION, "none"); - private static final KeyValue HTTP_URL_NONE = KeyValue.of(ClientHttpObservation.HighCardinalityKeyNames.HTTP_URL, "none"); + private static final KeyValue HTTP_URL_NONE = KeyValue.of(ClientHttpObservationDocumentation.HighCardinalityKeyNames.HTTP_URL, "none"); - private static final KeyValue CLIENT_NAME_NONE = KeyValue.of(ClientHttpObservation.HighCardinalityKeyNames.CLIENT_NAME, "none"); + private static final KeyValue CLIENT_NAME_NONE = KeyValue.of(ClientHttpObservationDocumentation.HighCardinalityKeyNames.CLIENT_NAME, "none"); private final String name; @@ -86,14 +86,14 @@ public class DefaultClientObservationConvention implements ClientObservationConv protected KeyValue uri(ClientObservationContext context) { if (context.getUriTemplate() != null) { - return KeyValue.of(ClientObservation.LowCardinalityKeyNames.URI, context.getUriTemplate()); + return KeyValue.of(ClientObservationDocumentation.LowCardinalityKeyNames.URI, context.getUriTemplate()); } return URI_NONE; } protected KeyValue method(ClientObservationContext context) { if (context.getCarrier() != null) { - return KeyValue.of(ClientObservation.LowCardinalityKeyNames.METHOD, context.getCarrier().method().name()); + return KeyValue.of(ClientObservationDocumentation.LowCardinalityKeyNames.METHOD, context.getCarrier().method().name()); } else { return METHOD_NONE; @@ -106,20 +106,22 @@ public class DefaultClientObservationConvention implements ClientObservationConv } ClientResponse response = context.getResponse(); if (response != null) { - return KeyValue.of(ClientObservation.LowCardinalityKeyNames.STATUS, String.valueOf(response.statusCode().value())); + return KeyValue.of(ClientObservationDocumentation.LowCardinalityKeyNames.STATUS, String.valueOf(response.statusCode().value())); } - if (context.getError().isPresent() && context.getError().get() instanceof IOException) { + if (context.getError() != null && context.getError() instanceof IOException) { return STATUS_IO_ERROR; } return STATUS_CLIENT_ERROR; } protected KeyValue exception(ClientObservationContext context) { - return context.getError().map(exception -> { - String simpleName = exception.getClass().getSimpleName(); - return KeyValue.of(ClientObservation.LowCardinalityKeyNames.EXCEPTION, - StringUtils.hasText(simpleName) ? simpleName : exception.getClass().getName()); - }).orElse(EXCEPTION_NONE); + Throwable error = context.getError(); + if (error != null) { + String simpleName = error.getClass().getSimpleName(); + return KeyValue.of(ClientObservationDocumentation.LowCardinalityKeyNames.EXCEPTION, + StringUtils.hasText(simpleName) ? simpleName : error.getClass().getName()); + } + return EXCEPTION_NONE; } protected KeyValue outcome(ClientObservationContext context) { @@ -140,14 +142,14 @@ public class DefaultClientObservationConvention implements ClientObservationConv protected KeyValue httpUrl(ClientObservationContext context) { if (context.getCarrier() != null) { - return KeyValue.of(ClientObservation.HighCardinalityKeyNames.HTTP_URL, context.getCarrier().url().toASCIIString()); + return KeyValue.of(ClientObservationDocumentation.HighCardinalityKeyNames.HTTP_URL, context.getCarrier().url().toASCIIString()); } return HTTP_URL_NONE; } protected KeyValue clientName(ClientObservationContext context) { if (context.getCarrier() != null && context.getCarrier().url().getHost() != null) { - return KeyValue.of(ClientObservation.HighCardinalityKeyNames.CLIENT_NAME, context.getCarrier().url().getHost()); + return KeyValue.of(ClientObservationDocumentation.HighCardinalityKeyNames.CLIENT_NAME, context.getCarrier().url().getHost()); } return CLIENT_NAME_NONE; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java index 07797110f7..3eea475007 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java @@ -460,8 +460,8 @@ class DefaultWebClient implements WebClient { initRequestBuilder().body(this.inserter).build() : initRequestBuilder().build()); return Mono.defer(() -> { - Observation observation = ClientObservation.HTTP_REQUEST.observation(observationConvention, - DEFAULT_OBSERVATION_CONVENTION, observationContext, observationRegistry).start(); + Observation observation = ClientObservationDocumentation.HTTP_REQUEST.observation(observationConvention, + DEFAULT_OBSERVATION_CONVENTION, () -> observationContext, observationRegistry).start(); observationContext.setCarrier(request); observationContext.setUriTemplate((String) request.attribute(URI_TEMPLATE_ATTRIBUTE).orElse(null)); Mono responseMono = exchangeFunction.exchange(request)