From ce1efb02a1e75e86835f54d8d94c448305c46236 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 19 Dec 2025 11:25:32 +0100 Subject: [PATCH] Back off if spring-boot-micrometer-observation or spring-boot-micrometer-metrics is missing Closes gh-48581 --- .../WebMvcObservationAutoConfiguration.java | 7 ++++--- .../WebMvcObservationAutoConfigurationTests.java | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/module/spring-boot-webmvc/src/main/java/org/springframework/boot/webmvc/autoconfigure/WebMvcObservationAutoConfiguration.java b/module/spring-boot-webmvc/src/main/java/org/springframework/boot/webmvc/autoconfigure/WebMvcObservationAutoConfiguration.java index e81f63effea..492a80d756d 100644 --- a/module/spring-boot-webmvc/src/main/java/org/springframework/boot/webmvc/autoconfigure/WebMvcObservationAutoConfiguration.java +++ b/module/spring-boot-webmvc/src/main/java/org/springframework/boot/webmvc/autoconfigure/WebMvcObservationAutoConfiguration.java @@ -58,9 +58,9 @@ import org.springframework.web.servlet.DispatcherServlet; "org.springframework.boot.micrometer.metrics.autoconfigure.export.simple.SimpleMetricsExportAutoConfiguration", "org.springframework.boot.micrometer.observation.autoconfigure.ObservationAutoConfiguration" }) @ConditionalOnWebApplication(type = Type.SERVLET) -@ConditionalOnClass({ DispatcherServlet.class, Observation.class }) +@ConditionalOnClass({ DispatcherServlet.class, Observation.class, ObservationProperties.class }) @ConditionalOnBean(ObservationRegistry.class) -@EnableConfigurationProperties({ MetricsProperties.class, ObservationProperties.class }) +@EnableConfigurationProperties(ObservationProperties.class) public final class WebMvcObservationAutoConfiguration { @Bean @@ -79,8 +79,9 @@ public final class WebMvcObservationAutoConfiguration { } @Configuration(proxyBeanMethods = false) - @ConditionalOnClass(MeterRegistry.class) + @ConditionalOnClass({ MeterRegistry.class, MetricsProperties.class }) @ConditionalOnBean(MeterRegistry.class) + @EnableConfigurationProperties(MetricsProperties.class) static class MeterFilterConfiguration { @Bean diff --git a/module/spring-boot-webmvc/src/test/java/org/springframework/boot/webmvc/autoconfigure/WebMvcObservationAutoConfigurationTests.java b/module/spring-boot-webmvc/src/test/java/org/springframework/boot/webmvc/autoconfigure/WebMvcObservationAutoConfigurationTests.java index e8fc3100b03..2648e2f7449 100644 --- a/module/spring-boot-webmvc/src/test/java/org/springframework/boot/webmvc/autoconfigure/WebMvcObservationAutoConfigurationTests.java +++ b/module/spring-boot-webmvc/src/test/java/org/springframework/boot/webmvc/autoconfigure/WebMvcObservationAutoConfigurationTests.java @@ -31,8 +31,12 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.micrometer.metrics.MaximumAllowableTagsMeterFilter; import org.springframework.boot.micrometer.metrics.autoconfigure.MetricsAutoConfiguration; +import org.springframework.boot.micrometer.metrics.autoconfigure.MetricsProperties; import org.springframework.boot.micrometer.observation.autoconfigure.ObservationAutoConfiguration; +import org.springframework.boot.micrometer.observation.autoconfigure.ObservationProperties; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.boot.test.system.CapturedOutput; @@ -74,6 +78,12 @@ class WebMvcObservationAutoConfigurationTests { .run((context) -> assertThat(context).doesNotHaveBean(FilterRegistrationBean.class)); } + @Test + void backsOffWhenObservationPropertiesIsMissing() { + this.contextRunner.withClassLoader(new FilteredClassLoader(ObservationProperties.class)) + .run((context) -> assertThat(context).doesNotHaveBean(FilterRegistrationBean.class)); + } + @Test void definesFilterWhenRegistryIsPresent() { this.contextRunner.run((context) -> { @@ -171,6 +181,12 @@ class WebMvcObservationAutoConfigurationTests { }); } + @Test + void shouldBackOffIfMetricsPropertiesIsNotPresent() { + this.contextRunner.withClassLoader(new FilteredClassLoader(MetricsProperties.class)) + .run((context) -> assertThat(context).doesNotHaveBean(MaximumAllowableTagsMeterFilter.class)); + } + private MeterRegistry getInitializedMeterRegistry(AssertableWebApplicationContext context) { return getInitializedMeterRegistry(context, "/test0", "/test1", "/test2"); }