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 eba0a0e8b5..43690b8497 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 @@ -21,10 +21,13 @@ import io.micrometer.common.KeyValues; import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatusCode; +import org.springframework.http.observation.ServerHttpObservationDocumentation.HighCardinalityKeyNames; +import org.springframework.http.observation.ServerHttpObservationDocumentation.LowCardinalityKeyNames; import org.springframework.util.StringUtils; /** * Default {@link ServerRequestObservationConvention}. + * * @author Brian Clozel * @since 6.0 */ @@ -32,28 +35,30 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO private static final String DEFAULT_NAME = "http.server.requests"; - private static final KeyValue METHOD_UNKNOWN = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.METHOD, "UNKNOWN"); + private static final KeyValue METHOD_UNKNOWN = KeyValue.of(LowCardinalityKeyNames.METHOD, "UNKNOWN"); + + private static final KeyValue STATUS_UNKNOWN = KeyValue.of(LowCardinalityKeyNames.STATUS, "UNKNOWN"); - private static final KeyValue STATUS_UNKNOWN = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.STATUS, "UNKNOWN"); + private static final KeyValue HTTP_OUTCOME_SUCCESS = KeyValue.of(LowCardinalityKeyNames.OUTCOME, "SUCCESS"); - private static final KeyValue HTTP_OUTCOME_SUCCESS = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.OUTCOME, "SUCCESS"); + private static final KeyValue HTTP_OUTCOME_UNKNOWN = KeyValue.of(LowCardinalityKeyNames.OUTCOME, "UNKNOWN"); - private static final KeyValue HTTP_OUTCOME_UNKNOWN = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.OUTCOME, "UNKNOWN"); + private static final KeyValue URI_UNKNOWN = KeyValue.of(LowCardinalityKeyNames.URI, "UNKNOWN"); - private static final KeyValue URI_UNKNOWN = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.URI, "UNKNOWN"); + private static final KeyValue URI_ROOT = KeyValue.of(LowCardinalityKeyNames.URI, "root"); - private static final KeyValue URI_ROOT = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.URI, "root"); + private static final KeyValue URI_NOT_FOUND = KeyValue.of(LowCardinalityKeyNames.URI, "NOT_FOUND"); - private static final KeyValue URI_NOT_FOUND = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.URI, "NOT_FOUND"); + private static final KeyValue URI_REDIRECTION = KeyValue.of(LowCardinalityKeyNames.URI, "REDIRECTION"); - private static final KeyValue URI_REDIRECTION = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.URI, "REDIRECTION"); + private static final KeyValue EXCEPTION_NONE = KeyValue.of(LowCardinalityKeyNames.EXCEPTION, KeyValue.NONE_VALUE); - private static final KeyValue EXCEPTION_NONE = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.EXCEPTION, KeyValue.NONE_VALUE); + private static final KeyValue HTTP_URL_UNKNOWN = KeyValue.of(HighCardinalityKeyNames.HTTP_URL, "UNKNOWN"); - private static final KeyValue HTTP_URL_UNKNOWN = KeyValue.of(ServerHttpObservationDocumentation.HighCardinalityKeyNames.HTTP_URL, "UNKNOWN"); private final String name; + /** * Create a convention with the default name {@code "http.server.requests"}. */ @@ -69,6 +74,7 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO this.name = name; } + @Override public String getName() { return this.name; @@ -76,11 +82,11 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO @Override public String getContextualName(ServerRequestObservationContext context) { + String httpMethod = context.getCarrier().getMethod().toLowerCase(); if (context.getPathPattern() != null) { - return String.format("http %s %s", context.getCarrier().getMethod().toLowerCase(), - context.getPathPattern()); + return "http %s %s".formatted(httpMethod, context.getPathPattern()); } - return "http " + context.getCarrier().getMethod().toLowerCase(); + return "http " + httpMethod; } @Override @@ -94,11 +100,15 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO } protected KeyValue method(ServerRequestObservationContext context) { - return (context.getCarrier() != null) ? KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.METHOD, context.getCarrier().getMethod()) : METHOD_UNKNOWN; + return (context.getCarrier() != null) ? + KeyValue.of(LowCardinalityKeyNames.METHOD, context.getCarrier().getMethod()) : + METHOD_UNKNOWN; } protected KeyValue status(ServerRequestObservationContext context) { - return (context.getResponse() != null) ? KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.STATUS, Integer.toString(context.getResponse().getStatus())) : STATUS_UNKNOWN; + return (context.getResponse() != null) ? + KeyValue.of(LowCardinalityKeyNames.STATUS, Integer.toString(context.getResponse().getStatus())) : + STATUS_UNKNOWN; } protected KeyValue uri(ServerRequestObservationContext context) { @@ -108,7 +118,7 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO if (pattern.isEmpty()) { return URI_ROOT; } - return KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.URI, pattern); + return KeyValue.of(LowCardinalityKeyNames.URI, pattern); } if (context.getResponse() != null) { HttpStatus status = HttpStatus.resolve(context.getResponse().getStatus()); @@ -129,7 +139,7 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO Throwable error = context.getError(); if (error != null) { String simpleName = error.getClass().getSimpleName(); - return KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.EXCEPTION, + return KeyValue.of(LowCardinalityKeyNames.EXCEPTION, StringUtils.hasText(simpleName) ? simpleName : error.getClass().getName()); } return EXCEPTION_NONE; @@ -145,7 +155,7 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO protected KeyValue httpUrl(ServerRequestObservationContext context) { if (context.getCarrier() != null) { - return KeyValue.of(ServerHttpObservationDocumentation.HighCardinalityKeyNames.HTTP_URL, context.getCarrier().getRequestURI()); + return KeyValue.of(HighCardinalityKeyNames.HTTP_URL, context.getCarrier().getRequestURI()); } return HTTP_URL_UNKNOWN; } @@ -158,7 +168,7 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO return HTTP_OUTCOME_SUCCESS; } else if (statusCode instanceof HttpStatus status) { - return KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.OUTCOME, status.series().name()); + return KeyValue.of(LowCardinalityKeyNames.OUTCOME, status.series().name()); } else { return HTTP_OUTCOME_UNKNOWN; 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 55170a6b23..51e7efb75d 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 @@ -21,6 +21,8 @@ import io.micrometer.common.KeyValues; import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatusCode; +import org.springframework.http.observation.reactive.ServerHttpObservationDocumentation.HighCardinalityKeyNames; +import org.springframework.http.observation.reactive.ServerHttpObservationDocumentation.LowCardinalityKeyNames; import org.springframework.util.StringUtils; import org.springframework.web.util.pattern.PathPattern; @@ -34,28 +36,30 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO private static final String DEFAULT_NAME = "http.server.requests"; - private static final KeyValue METHOD_UNKNOWN = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.METHOD, "UNKNOWN"); + private static final KeyValue METHOD_UNKNOWN = KeyValue.of(LowCardinalityKeyNames.METHOD, "UNKNOWN"); - private static final KeyValue STATUS_UNKNOWN = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.STATUS, "UNKNOWN"); + private static final KeyValue STATUS_UNKNOWN = KeyValue.of(LowCardinalityKeyNames.STATUS, "UNKNOWN"); - private static final KeyValue HTTP_OUTCOME_SUCCESS = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.OUTCOME, "SUCCESS"); + private static final KeyValue HTTP_OUTCOME_SUCCESS = KeyValue.of(LowCardinalityKeyNames.OUTCOME, "SUCCESS"); - private static final KeyValue HTTP_OUTCOME_UNKNOWN = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.OUTCOME, "UNKNOWN"); + private static final KeyValue HTTP_OUTCOME_UNKNOWN = KeyValue.of(LowCardinalityKeyNames.OUTCOME, "UNKNOWN"); - private static final KeyValue URI_UNKNOWN = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.URI, "UNKNOWN"); + private static final KeyValue URI_UNKNOWN = KeyValue.of(LowCardinalityKeyNames.URI, "UNKNOWN"); - private static final KeyValue URI_ROOT = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.URI, "root"); + private static final KeyValue URI_ROOT = KeyValue.of(LowCardinalityKeyNames.URI, "root"); - private static final KeyValue URI_NOT_FOUND = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.URI, "NOT_FOUND"); + private static final KeyValue URI_NOT_FOUND = KeyValue.of(LowCardinalityKeyNames.URI, "NOT_FOUND"); - private static final KeyValue URI_REDIRECTION = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.URI, "REDIRECTION"); + private static final KeyValue URI_REDIRECTION = KeyValue.of(LowCardinalityKeyNames.URI, "REDIRECTION"); - private static final KeyValue EXCEPTION_NONE = KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.EXCEPTION, KeyValue.NONE_VALUE); + private static final KeyValue EXCEPTION_NONE = KeyValue.of(LowCardinalityKeyNames.EXCEPTION, KeyValue.NONE_VALUE); + + private static final KeyValue HTTP_URL_UNKNOWN = KeyValue.of(HighCardinalityKeyNames.HTTP_URL, "UNKNOWN"); - private static final KeyValue HTTP_URL_UNKNOWN = KeyValue.of(ServerHttpObservationDocumentation.HighCardinalityKeyNames.HTTP_URL, "UNKNOWN"); private final String name; + /** * Create a convention with the default name {@code "http.server.requests"}. */ @@ -65,13 +69,13 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO /** * Create a convention with a custom name. - * * @param name the observation name */ public DefaultServerRequestObservationConvention(String name) { this.name = name; } + @Override public String getName() { return this.name; @@ -79,11 +83,11 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO @Override public String getContextualName(ServerRequestObservationContext context) { + String httpMethod = context.getCarrier().getMethod().name().toLowerCase(); if (context.getPathPattern() != null) { - return String.format("http %s %s", context.getCarrier().getMethod().name().toLowerCase(), - context.getPathPattern().toString()); + return "http %s %s".formatted(httpMethod, context.getPathPattern()); } - return "http " + context.getCarrier().getMethod().name().toLowerCase(); + return "http " + httpMethod; } @Override @@ -97,7 +101,9 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO } protected KeyValue method(ServerRequestObservationContext context) { - return (context.getCarrier() != null) ? KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.METHOD, context.getCarrier().getMethod().name()) : METHOD_UNKNOWN; + return (context.getCarrier() != null) ? + KeyValue.of(LowCardinalityKeyNames.METHOD, context.getCarrier().getMethod().name()) : + METHOD_UNKNOWN; } protected KeyValue status(ServerRequestObservationContext context) { @@ -105,7 +111,8 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO return STATUS_UNKNOWN; } return (context.getResponse() != null && context.getResponse().getStatusCode() != null) ? - KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.STATUS, Integer.toString(context.getResponse().getStatusCode().value())) : STATUS_UNKNOWN; + KeyValue.of(LowCardinalityKeyNames.STATUS, Integer.toString(context.getResponse().getStatusCode().value())) : + STATUS_UNKNOWN; } protected KeyValue uri(ServerRequestObservationContext context) { @@ -115,7 +122,7 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO if (pattern.toString().isEmpty()) { return URI_ROOT; } - return KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.URI, pattern.toString()); + return KeyValue.of(LowCardinalityKeyNames.URI, pattern.toString()); } if (context.getResponse() != null && context.getResponse().getStatusCode() != null) { HttpStatus status = HttpStatus.resolve(context.getResponse().getStatusCode().value()); @@ -136,8 +143,8 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO Throwable error = context.getError(); if (error != null) { String simpleName = error.getClass().getSimpleName(); - return KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.EXCEPTION, - StringUtils.hasText(simpleName) ? simpleName : error.getClass().getName()); + return KeyValue.of(LowCardinalityKeyNames.EXCEPTION, StringUtils.hasText(simpleName) ? + simpleName : error.getClass().getName()); } return EXCEPTION_NONE; } @@ -154,11 +161,12 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO protected KeyValue httpUrl(ServerRequestObservationContext context) { if (context.getCarrier() != null) { - return KeyValue.of(ServerHttpObservationDocumentation.HighCardinalityKeyNames.HTTP_URL, context.getCarrier().getPath().toString()); + return KeyValue.of(HighCardinalityKeyNames.HTTP_URL, context.getCarrier().getPath().toString()); } return HTTP_URL_UNKNOWN; } + static class HttpOutcome { static KeyValue forStatus(HttpStatusCode statusCode) { @@ -166,7 +174,7 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO return HTTP_OUTCOME_SUCCESS; } else if (statusCode instanceof HttpStatus status) { - return KeyValue.of(ServerHttpObservationDocumentation.LowCardinalityKeyNames.OUTCOME, status.series().name()); + return KeyValue.of(LowCardinalityKeyNames.OUTCOME, status.series().name()); } else { return HTTP_OUTCOME_UNKNOWN;