diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfiguration.java index 2d262a75bfa..8aba3d98311 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfiguration.java @@ -16,8 +16,6 @@ package org.springframework.boot.actuate.autoconfigure.metrics; -import java.util.List; - import io.micrometer.core.annotation.Timed; import io.micrometer.core.instrument.Clock; import io.micrometer.core.instrument.MeterRegistry; @@ -42,6 +40,7 @@ import org.springframework.core.annotation.Order; * @author Jon Schneider * @author Stephane Nicoll * @author Moritz Halbritter + * @author Michael Berry * @since 2.0.0 */ @AutoConfiguration(before = CompositeMeterRegistryAutoConfiguration.class) @@ -71,8 +70,8 @@ public class MetricsAutoConfiguration { } @Bean - MeterRegistryCloser meterRegistryCloser(ObjectProvider meterRegistries) { - return new MeterRegistryCloser(meterRegistries.orderedStream().toList()); + MeterRegistryCloser meterRegistryCloser(ApplicationContext context) { + return new MeterRegistryCloser(context); } /** @@ -81,17 +80,22 @@ public class MetricsAutoConfiguration { */ static class MeterRegistryCloser implements ApplicationListener { - private final List meterRegistries; + private final ApplicationContext context; - MeterRegistryCloser(List meterRegistries) { - this.meterRegistries = meterRegistries; + private final Iterable meterRegistries; + + MeterRegistryCloser(ApplicationContext context) { + this.meterRegistries = context.getBeansOfType(MeterRegistry.class).values(); + this.context = context; } @Override public void onApplicationEvent(ContextClosedEvent event) { - for (MeterRegistry meterRegistry : this.meterRegistries) { - if (!meterRegistry.isClosed()) { - meterRegistry.close(); + if (this.context.equals(event.getApplicationContext())) { + for (MeterRegistry meterRegistry : this.meterRegistries) { + if (!meterRegistry.isClosed()) { + meterRegistry.close(); + } } } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationTests.java index aa9fa98ee43..000860e2214 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationTests.java @@ -42,6 +42,7 @@ import static org.mockito.Mockito.mock; * * @author Andy Wilkinson * @author Moritz Halbritter + * @author Michael Berry */ class MetricsAutoConfigurationTests { @@ -89,6 +90,24 @@ class MetricsAutoConfigurationTests { }); } + @Test + void meterRegistryCloserShouldOnlyCloseRegistriesBelongingToContextBeingClosed() { + MeterRegistry parentMeterRegistry = new SimpleMeterRegistry(); + MeterRegistry childMeterRegistry = new SimpleMeterRegistry(); + this.contextRunner.withBean(MeterRegistry.class, () -> parentMeterRegistry).run((parent) -> { + this.contextRunner.withBean(MeterRegistry.class, () -> childMeterRegistry) + .withParent(parent) + .run((child) -> { + assertThat(childMeterRegistry.isClosed()).isFalse(); + assertThat(parentMeterRegistry.isClosed()).isFalse(); + }); + assertThat(childMeterRegistry.isClosed()).isTrue(); + assertThat(parentMeterRegistry.isClosed()).isFalse(); + }); + assertThat(childMeterRegistry.isClosed()).isTrue(); + assertThat(parentMeterRegistry.isClosed()).isTrue(); + } + @Configuration(proxyBeanMethods = false) static class CustomClockConfiguration {