diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/server/WebFluxTags.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/server/WebFluxTags.java index 993676c5bc7..0229f32298f 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/server/WebFluxTags.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/server/WebFluxTags.java @@ -21,6 +21,7 @@ import io.micrometer.core.instrument.Tag; import org.springframework.http.HttpStatus; import org.springframework.util.StringUtils; import org.springframework.web.reactive.HandlerMapping; +import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.util.pattern.PathPattern; @@ -86,7 +87,9 @@ public final class WebFluxTags { /** * Creates a {@code uri} tag based on the URI of the given {@code exchange}. Uses the - * {@link HandlerMapping#BEST_MATCHING_PATTERN_ATTRIBUTE} best matching pattern. + * {@link HandlerMapping#BEST_MATCHING_PATTERN_ATTRIBUTE} best matching pattern from + * WebFlux annotation or {@link RouterFunctions#MATCHING_PATTERN_ATTRIBUTE} from + * WebFlux Fn. * @param exchange the exchange * @return the uri tag derived from the exchange */ @@ -96,6 +99,11 @@ public final class WebFluxTags { if (pathPattern != null) { return Tag.of("uri", pathPattern.getPatternString()); } + String matchingPattern = exchange + .getAttribute(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE); + if (matchingPattern != null) { + return Tag.of("uri", matchingPattern); + } HttpStatus status = exchange.getResponse().getStatusCode(); if (status != null) { if (status.is3xxRedirection()) { diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/server/WebFluxTagsTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/server/WebFluxTagsTests.java index 83d042239c2..989dc7e3bcb 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/server/WebFluxTagsTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/server/WebFluxTagsTests.java @@ -25,6 +25,7 @@ import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.web.server.MockServerWebExchange; import org.springframework.web.reactive.HandlerMapping; +import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.util.pattern.PathPatternParser; @@ -58,6 +59,15 @@ public class WebFluxTagsTests { assertThat(tag.getValue()).isEqualTo("/spring"); } + @Test + public void uriTagValueIsFnMatchingPatternWhenAvailable() { + this.exchange.getAttributes().put(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE, + "/spring"); + this.exchange.getResponse().setStatusCode(HttpStatus.MOVED_PERMANENTLY); + Tag tag = WebFluxTags.uri(this.exchange); + assertThat(tag.getValue()).isEqualTo("/spring"); + } + @Test public void uriTagValueIsRedirectionWhenResponseStatusIs3xx() { this.exchange.getResponse().setStatusCode(HttpStatus.MOVED_PERMANENTLY);