Skip to content

Commit f5203cf

Browse files
committed
Merge pull request #50235 from kwondh5217
* fix/remove-meter-registry-from-global-on-context-close: Remove MeterRegistry from global registry on context close Closes gh-50235
2 parents 46330c2 + 9d7b21a commit f5203cf

2 files changed

Lines changed: 38 additions & 3 deletions

File tree

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfiguration.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.micrometer.core.annotation.Timed;
2020
import io.micrometer.core.instrument.Clock;
2121
import io.micrometer.core.instrument.MeterRegistry;
22+
import io.micrometer.core.instrument.Metrics;
2223
import io.micrometer.core.instrument.binder.MeterBinder;
2324
import io.micrometer.core.instrument.config.MeterFilter;
2425

@@ -70,8 +71,8 @@ public PropertiesMeterFilter propertiesMeterFilter(MetricsProperties properties)
7071
}
7172

7273
@Bean
73-
MeterRegistryCloser meterRegistryCloser(ApplicationContext context) {
74-
return new MeterRegistryCloser(context);
74+
MeterRegistryCloser meterRegistryCloser(ApplicationContext context, MetricsProperties properties) {
75+
return new MeterRegistryCloser(context, properties.isUseGlobalRegistry());
7576
}
7677

7778
/**
@@ -84,15 +85,21 @@ static class MeterRegistryCloser implements ApplicationListener<ContextClosedEve
8485

8586
private final Iterable<MeterRegistry> meterRegistries;
8687

87-
MeterRegistryCloser(ApplicationContext context) {
88+
private final boolean useGlobalRegistry;
89+
90+
MeterRegistryCloser(ApplicationContext context, boolean useGlobalRegistry) {
8891
this.meterRegistries = context.getBeansOfType(MeterRegistry.class).values();
8992
this.context = context;
93+
this.useGlobalRegistry = useGlobalRegistry;
9094
}
9195

9296
@Override
9397
public void onApplicationEvent(ContextClosedEvent event) {
9498
if (this.context.equals(event.getApplicationContext())) {
9599
for (MeterRegistry meterRegistry : this.meterRegistries) {
100+
if (this.useGlobalRegistry) {
101+
Metrics.globalRegistry.remove(meterRegistry);
102+
}
96103
if (!meterRegistry.isClosed()) {
97104
meterRegistry.close();
98105
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationTests.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.micrometer.core.instrument.Clock;
2020
import io.micrometer.core.instrument.Meter;
2121
import io.micrometer.core.instrument.MeterRegistry;
22+
import io.micrometer.core.instrument.Metrics;
2223
import io.micrometer.core.instrument.binder.MeterBinder;
2324
import io.micrometer.core.instrument.config.MeterFilter;
2425
import io.micrometer.core.instrument.config.MeterFilterReply;
@@ -90,6 +91,33 @@ void meterRegistryCloserShouldCloseRegistryOnShutdown() {
9091
});
9192
}
9293

94+
@Test
95+
void meterRegistryCloserShouldRemoveRegistryFromGlobalRegistryOnShutdown() {
96+
this.contextRunner.withUserConfiguration(MeterRegistryConfiguration.class).run((context) -> {
97+
MeterRegistry meterRegistry = context.getBean(MeterRegistry.class);
98+
assertThat(Metrics.globalRegistry.getRegistries()).contains(meterRegistry);
99+
context.close();
100+
assertThat(Metrics.globalRegistry.getRegistries()).doesNotContain(meterRegistry);
101+
});
102+
}
103+
104+
@Test
105+
void meterRegistryCloserShouldNotRemoveRegistryFromGlobalRegistryWhenUseGlobalRegistryIsFalse() {
106+
this.contextRunner.withUserConfiguration(MeterRegistryConfiguration.class)
107+
.withPropertyValues("management.metrics.use-global-registry=false")
108+
.run((context) -> {
109+
MeterRegistry meterRegistry = context.getBean(MeterRegistry.class);
110+
Metrics.globalRegistry.add(meterRegistry);
111+
try {
112+
context.close();
113+
assertThat(Metrics.globalRegistry.getRegistries()).contains(meterRegistry);
114+
}
115+
finally {
116+
Metrics.globalRegistry.remove(meterRegistry);
117+
}
118+
});
119+
}
120+
93121
@Test
94122
void meterRegistryCloserShouldOnlyCloseRegistriesBelongingToContextBeingClosed() {
95123
MeterRegistry parentMeterRegistry = new SimpleMeterRegistry();

0 commit comments

Comments
 (0)