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 a24f2d67834..cc9aa828dcf 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; @@ -47,6 +45,7 @@ import org.springframework.core.annotation.Order; * @author Jon Schneider * @author Stephane Nicoll * @author Moritz Halbritter + * @author Michael Berry * @author Phillip Webb * @since 4.0.0 */ @@ -77,8 +76,8 @@ public final class MetricsAutoConfiguration { } @Bean - MeterRegistryCloser meterRegistryCloser(ObjectProvider meterRegistries) { - return new MeterRegistryCloser(meterRegistries.orderedStream().toList()); + MeterRegistryCloser meterRegistryCloser(ApplicationContext context) { + return new MeterRegistryCloser(context); } @Bean @@ -100,17 +99,22 @@ public final class MetricsAutoConfiguration { */ static class MeterRegistryCloser implements ApplicationListener { - private final List meterRegistries; + private final ApplicationContext context; + + private final Iterable meterRegistries; - MeterRegistryCloser(List meterRegistries) { - this.meterRegistries = 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/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 5225bcc4cdf..40d059b5d7f 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 @@ -46,6 +46,7 @@ import static org.mockito.Mockito.mock; * * @author Andy Wilkinson * @author Moritz Halbritter + * @author Michael Berry * @author Phillip Webb */ class MetricsAutoConfigurationTests { @@ -95,6 +96,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(); + } + @Test void supplyHandlerAndGroup() { this.contextRunner.run((context) -> {