diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/web/reactive/WebFluxObservationAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/web/reactive/WebFluxObservationAutoConfiguration.java index 5c15a3958a..c3e483d769 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/web/reactive/WebFluxObservationAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/web/reactive/WebFluxObservationAutoConfiguration.java @@ -108,12 +108,15 @@ public class WebFluxObservationAutoConfiguration { @Bean @Order(0) - MeterFilter metricsHttpServerUriTagFilter(MetricsProperties properties) { - Server serverProperties = properties.getWeb().getServer(); - String metricName = serverProperties.getRequest().getMetricName(); + MeterFilter metricsHttpServerUriTagFilter(MetricsProperties metricsProperties, + ObservationProperties observationProperties) { + String observationName = observationProperties.getHttp().getServer().getRequests().getName(); + Server metricsServerProperties = metricsProperties.getWeb().getServer(); + String metricName = metricsServerProperties.getRequest().getMetricName(); + String name = (observationName != null) ? observationName : metricName; MeterFilter filter = new OnlyOnceLoggingDenyMeterFilter( - () -> "Reached the maximum number of URI tags for '%s'.".formatted(metricName)); - return MeterFilter.maximumAllowableTags(metricName, "uri", serverProperties.getMaxUriTags(), filter); + () -> "Reached the maximum number of URI tags for '%s'.".formatted(name)); + return MeterFilter.maximumAllowableTags(name, "uri", metricsServerProperties.getMaxUriTags(), filter); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/web/servlet/WebMvcObservationAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/web/servlet/WebMvcObservationAutoConfiguration.java index 3a17a20c89..1188d42b3e 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/web/servlet/WebMvcObservationAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/web/servlet/WebMvcObservationAutoConfiguration.java @@ -108,11 +108,14 @@ public class WebMvcObservationAutoConfiguration { @Bean @Order(0) - MeterFilter metricsHttpServerUriTagFilter(MetricsProperties properties) { - String metricName = properties.getWeb().getServer().getRequest().getMetricName(); + MeterFilter metricsHttpServerUriTagFilter(MetricsProperties metricsProperties, + ObservationProperties observationProperties) { + String observationName = observationProperties.getHttp().getServer().getRequests().getName(); + String metricName = metricsProperties.getWeb().getServer().getRequest().getMetricName(); + String name = (observationName != null) ? observationName : metricName; MeterFilter filter = new OnlyOnceLoggingDenyMeterFilter( - () -> String.format("Reached the maximum number of URI tags for '%s'.", metricName)); - return MeterFilter.maximumAllowableTags(metricName, "uri", properties.getWeb().getServer().getMaxUriTags(), + () -> String.format("Reached the maximum number of URI tags for '%s'.", name)); + return MeterFilter.maximumAllowableTags(name, "uri", metricsProperties.getWeb().getServer().getMaxUriTags(), filter); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/web/servlet/WebMvcObservationAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/web/servlet/WebMvcObservationAutoConfigurationTests.java index 5c9d12c251..297d862d9f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/web/servlet/WebMvcObservationAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/web/servlet/WebMvcObservationAutoConfigurationTests.java @@ -148,6 +148,34 @@ class WebMvcObservationAutoConfigurationTests { }); } + @Test + void afterMaxUrisReachedFurtherUrisAreDeniedWhenUsingCustomMetricName(CapturedOutput output) { + this.contextRunner.withUserConfiguration(TestController.class) + .withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class, + ObservationAutoConfiguration.class, WebMvcAutoConfiguration.class)) + .withPropertyValues("management.metrics.web.server.max-uri-tags=2", + "management.metrics.web.server.request.metric-name=my.http.server.requests") + .run((context) -> { + MeterRegistry registry = getInitializedMeterRegistry(context); + assertThat(registry.get("my.http.server.requests").meters().size()).isLessThanOrEqualTo(2); + assertThat(output).contains("Reached the maximum number of URI tags for 'my.http.server.requests'"); + }); + } + + @Test + void afterMaxUrisReachedFurtherUrisAreDeniedWhenUsingCustomObservationName(CapturedOutput output) { + this.contextRunner.withUserConfiguration(TestController.class) + .withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class, + ObservationAutoConfiguration.class, WebMvcAutoConfiguration.class)) + .withPropertyValues("management.metrics.web.server.max-uri-tags=2", + "management.observations.http.server.requests.name=my.http.server.requests") + .run((context) -> { + MeterRegistry registry = getInitializedMeterRegistry(context); + assertThat(registry.get("my.http.server.requests").meters().size()).isLessThanOrEqualTo(2); + assertThat(output).contains("Reached the maximum number of URI tags for 'my.http.server.requests'"); + }); + } + @Test void shouldNotDenyNorLogIfMaxUrisIsNotReached(CapturedOutput output) { this.contextRunner.withUserConfiguration(TestController.class)