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 cc9aa828dcf5..7a4d06b7fee7 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 @@ -19,6 +19,7 @@ import io.micrometer.core.annotation.Timed; import io.micrometer.core.instrument.Clock; import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.binder.MeterBinder; import io.micrometer.core.instrument.composite.CompositeMeterRegistry; import io.micrometer.core.instrument.config.MeterFilter; @@ -76,8 +77,8 @@ PropertiesMeterFilter propertiesMeterFilter(MetricsProperties properties) { } @Bean - MeterRegistryCloser meterRegistryCloser(ApplicationContext context) { - return new MeterRegistryCloser(context); + MeterRegistryCloser meterRegistryCloser(ApplicationContext context, MetricsProperties properties) { + return new MeterRegistryCloser(context, properties.isUseGlobalRegistry()); } @Bean @@ -103,15 +104,21 @@ static class MeterRegistryCloser implements ApplicationListener meterRegistries; - MeterRegistryCloser(ApplicationContext context) { + private final boolean useGlobalRegistry; + + MeterRegistryCloser(ApplicationContext context, boolean useGlobalRegistry) { this.meterRegistries = context.getBeansOfType(MeterRegistry.class).values(); this.context = context; + this.useGlobalRegistry = useGlobalRegistry; } @Override public void onApplicationEvent(ContextClosedEvent event) { if (this.context.equals(event.getApplicationContext())) { for (MeterRegistry meterRegistry : this.meterRegistries) { + if (this.useGlobalRegistry) { + Metrics.globalRegistry.remove(meterRegistry); + } 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 40d059b5d7f8..5146b80fb4a2 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 @@ -19,6 +19,7 @@ import io.micrometer.core.instrument.Clock; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.binder.MeterBinder; import io.micrometer.core.instrument.config.MeterFilter; import io.micrometer.core.instrument.config.MeterFilterReply; @@ -96,6 +97,33 @@ void meterRegistryCloserShouldCloseRegistryOnShutdown() { }); } + @Test + void meterRegistryCloserShouldRemoveRegistryFromGlobalRegistryOnShutdown() { + this.contextRunner.withUserConfiguration(MeterRegistryConfiguration.class).run((context) -> { + MeterRegistry meterRegistry = context.getBean(MeterRegistry.class); + assertThat(Metrics.globalRegistry.getRegistries()).contains(meterRegistry); + context.close(); + assertThat(Metrics.globalRegistry.getRegistries()).doesNotContain(meterRegistry); + }); + } + + @Test + void meterRegistryCloserShouldNotRemoveRegistryFromGlobalRegistryWhenUseGlobalRegistryIsFalse() { + this.contextRunner.withUserConfiguration(MeterRegistryConfiguration.class) + .withPropertyValues("management.metrics.use-global-registry=false") + .run((context) -> { + MeterRegistry meterRegistry = context.getBean(MeterRegistry.class); + Metrics.globalRegistry.add(meterRegistry); + try { + context.close(); + assertThat(Metrics.globalRegistry.getRegistries()).contains(meterRegistry); + } + finally { + Metrics.globalRegistry.remove(meterRegistry); + } + }); + } + @Test void meterRegistryCloserShouldOnlyCloseRegistriesBelongingToContextBeingClosed() { MeterRegistry parentMeterRegistry = new SimpleMeterRegistry();