diff --git a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/MetricsAutoConfiguration.java b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/MetricsAutoConfiguration.java index a24f2d678347..e041c79075c5 100644 --- a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/MetricsAutoConfiguration.java +++ b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/MetricsAutoConfiguration.java @@ -16,8 +16,6 @@ package org.springframework.boot.micrometer.metrics.autoconfigure; -import java.util.List; - import io.micrometer.core.annotation.Timed; import io.micrometer.core.instrument.Clock; import io.micrometer.core.instrument.MeterRegistry; @@ -48,6 +46,7 @@ * @author Stephane Nicoll * @author Moritz Halbritter * @author Phillip Webb + * @author Michael Berry * @since 4.0.0 */ @AutoConfiguration(before = CompositeMeterRegistryAutoConfiguration.class) @@ -77,8 +76,8 @@ PropertiesMeterFilter propertiesMeterFilter(MetricsProperties properties) { } @Bean - MeterRegistryCloser meterRegistryCloser(ObjectProvider meterRegistries) { - return new MeterRegistryCloser(meterRegistries.orderedStream().toList()); + MeterRegistryCloser meterRegistryCloser() { + return new MeterRegistryCloser(); } @Bean @@ -100,15 +99,9 @@ DefaultMeterObservationHandler defaultMeterObservationHandler(ObjectProvider { - private final List meterRegistries; - - MeterRegistryCloser(List meterRegistries) { - this.meterRegistries = meterRegistries; - } - @Override public void onApplicationEvent(ContextClosedEvent event) { - for (MeterRegistry meterRegistry : this.meterRegistries) { + for (MeterRegistry meterRegistry : event.getApplicationContext().getBeansOfType(MeterRegistry.class).values()) { if (!meterRegistry.isClosed()) { meterRegistry.close(); } diff --git a/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/MetricsAutoConfigurationTests.java b/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/MetricsAutoConfigurationTests.java index 5225bcc4cdf7..c274392eb2d5 100644 --- a/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/MetricsAutoConfigurationTests.java +++ b/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/MetricsAutoConfigurationTests.java @@ -31,9 +31,12 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.micrometer.metrics.autoconfigure.MetricsAutoConfiguration.MeterRegistryCloser; import org.springframework.boot.micrometer.observation.autoconfigure.ObservationHandlerGroup; +import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.annotation.Order; import org.springframework.test.util.ReflectionTestUtils; @@ -47,6 +50,7 @@ * @author Andy Wilkinson * @author Moritz Halbritter * @author Phillip Webb + * @author Michael Berry */ class MetricsAutoConfigurationTests { @@ -95,6 +99,21 @@ void meterRegistryCloserShouldCloseRegistryOnShutdown() { }); } + @Test + void meterRegistryCloserShouldNotCloseOnNonRootContextClosing() { + this.contextRunner.withUserConfiguration(MeterRegistryConfiguration.class).run((context) -> { + MeterRegistry meterRegistry = context.getBean(MeterRegistry.class); + GenericApplicationContext childContext = new GenericApplicationContext(); + childContext.setParent(context); + childContext.refresh(); + childContext.close(); + assertThat(meterRegistry.isClosed()).isFalse(); + context.close(); + assertThat(meterRegistry.isClosed()).isTrue(); + }); + } + + @Test void supplyHandlerAndGroup() { this.contextRunner.run((context) -> {