diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryConfigurer.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryConfigurer.java deleted file mode 100644 index 726872e09b..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryConfigurer.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2012-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.actuate.autoconfigure.metrics; - -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; - -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.boot.util.LambdaSafe; - -/** - * Configurer to apply {@link MeterRegistryCustomizer customizers}, {@link MeterFilter - * filters}, {@link MeterBinder binders} and {@link Metrics#addRegistry global - * registration} to {@link MeterRegistry meter registries}. - * - * @author Jon Schneider - * @author Phillip Webb - */ -class MeterRegistryConfigurer { - - private final ObjectProvider> customizers; - - private final ObjectProvider filters; - - private final ObjectProvider binders; - - private final boolean addToGlobalRegistry; - - private final boolean hasCompositeMeterRegistry; - - MeterRegistryConfigurer(ObjectProvider> customizers, ObjectProvider filters, - ObjectProvider binders, boolean addToGlobalRegistry, boolean hasCompositeMeterRegistry) { - this.customizers = customizers; - this.filters = filters; - this.binders = binders; - this.addToGlobalRegistry = addToGlobalRegistry; - this.hasCompositeMeterRegistry = hasCompositeMeterRegistry; - } - - void configure(MeterRegistry registry) { - // Customizers must be applied before binders, as they may add custom - // tags or alter timer or summary configuration. - customize(registry); - if (!(registry instanceof AutoConfiguredCompositeMeterRegistry)) { - addFilters(registry); - } - if (!this.hasCompositeMeterRegistry || registry instanceof CompositeMeterRegistry) { - addBinders(registry); - } - if (this.addToGlobalRegistry && registry != Metrics.globalRegistry) { - Metrics.addRegistry(registry); - } - } - - @SuppressWarnings("unchecked") - private void customize(MeterRegistry registry) { - LambdaSafe.callbacks(MeterRegistryCustomizer.class, this.customizers.orderedStream().toList(), registry) - .withLogger(MeterRegistryConfigurer.class).invoke((customizer) -> customizer.customize(registry)); - } - - private void addFilters(MeterRegistry registry) { - this.filters.orderedStream().forEach(registry.config()::meterFilter); - } - - private void addBinders(MeterRegistry registry) { - this.binders.orderedStream().forEach((binder) -> binder.bindTo(registry)); - } - -} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryPostProcessor.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryPostProcessor.java index 860dceac86..d5e279b1c2 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryPostProcessor.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryPostProcessor.java @@ -16,65 +16,138 @@ package org.springframework.boot.actuate.autoconfigure.metrics; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + 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; import org.springframework.beans.BeansException; import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.boot.util.LambdaSafe; import org.springframework.context.ApplicationContext; /** - * {@link BeanPostProcessor} that delegates to a lazily created - * {@link MeterRegistryConfigurer} to post-process {@link MeterRegistry} beans. + * {@link BeanPostProcessor} for {@link MeterRegistry} beans. * * @author Jon Schneider * @author Phillip Webb * @author Andy Wilkinson */ -class MeterRegistryPostProcessor implements BeanPostProcessor { +class MeterRegistryPostProcessor implements BeanPostProcessor, SmartInitializingSingleton { - private final ObjectProvider meterBinders; + private final boolean hasNoCompositeMeterRegistryBeans; - private final ObjectProvider meterFilters; + private final boolean useGlobalRegistry; - private final ObjectProvider> meterRegistryCustomizers; + private final ObjectProvider> customizers; - private final ObjectProvider metricsProperties; + private final ObjectProvider filters; - private volatile MeterRegistryConfigurer configurer; + private final ObjectProvider binders; - private final ApplicationContext applicationContext; + private volatile boolean deferBinding = true; + + private final Set deferredBindings = new LinkedHashSet<>(); + + MeterRegistryPostProcessor(ApplicationContext applicationContext, MetricsProperties metricsProperties, + ObjectProvider> customizers, ObjectProvider filters, + ObjectProvider binders) { + this(hasNoCompositeMeterRegistryBeans(applicationContext), metricsProperties.isUseGlobalRegistry(), customizers, + filters, binders); + } + + private static boolean hasNoCompositeMeterRegistryBeans(ApplicationContext applicationContext) { + return applicationContext.getBeanNamesForType(CompositeMeterRegistry.class, false, false).length == 0; + } + + MeterRegistryPostProcessor(boolean hasNoCompositeMeterRegistryBeans, boolean useGlobalRegistry, + ObjectProvider> customizers, ObjectProvider filters, + ObjectProvider binders) { + this.hasNoCompositeMeterRegistryBeans = hasNoCompositeMeterRegistryBeans; + this.useGlobalRegistry = useGlobalRegistry; + this.customizers = customizers; + this.filters = filters; + this.binders = binders; - MeterRegistryPostProcessor(ObjectProvider meterBinders, ObjectProvider meterFilters, - ObjectProvider> meterRegistryCustomizers, - ObjectProvider metricsProperties, ApplicationContext applicationContext) { - this.meterBinders = meterBinders; - this.meterFilters = meterFilters; - this.meterRegistryCustomizers = meterRegistryCustomizers; - this.metricsProperties = metricsProperties; - this.applicationContext = applicationContext; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof MeterRegistry meterRegistry) { - getConfigurer().configure(meterRegistry); + postProcessMeterRegistry(meterRegistry); } return bean; } - private MeterRegistryConfigurer getConfigurer() { - if (this.configurer == null) { - boolean hasCompositeMeterRegistry = this.applicationContext - .getBeanNamesForType(CompositeMeterRegistry.class, false, false).length != 0; - this.configurer = new MeterRegistryConfigurer(this.meterRegistryCustomizers, this.meterFilters, - this.meterBinders, this.metricsProperties.getObject().isUseGlobalRegistry(), - hasCompositeMeterRegistry); + @Override + public void afterSingletonsInstantiated() { + synchronized (this.deferredBindings) { + this.deferBinding = false; + this.deferredBindings.forEach(this::applyBinders); } - return this.configurer; + } + + private void postProcessMeterRegistry(MeterRegistry meterRegistry) { + // Customizers must be applied before binders, as they may add custom tags or + // alter timer or summary configuration. + applyCustomizers(meterRegistry); + applyFilters(meterRegistry); + addToGlobalRegistryIfNecessary(meterRegistry); + if (isBindable(meterRegistry)) { + applyBinders(meterRegistry); + } + } + + @SuppressWarnings("unchecked") + private void applyCustomizers(MeterRegistry meterRegistry) { + List> customizers = this.customizers.orderedStream().toList(); + LambdaSafe.callbacks(MeterRegistryCustomizer.class, customizers, meterRegistry) + .withLogger(MeterRegistryPostProcessor.class) + .invoke((customizer) -> customizer.customize(meterRegistry)); + } + + private void applyFilters(MeterRegistry meterRegistry) { + if (meterRegistry instanceof AutoConfiguredCompositeMeterRegistry) { + return; + } + this.filters.orderedStream().forEach(meterRegistry.config()::meterFilter); + } + + private void addToGlobalRegistryIfNecessary(MeterRegistry meterRegistry) { + if (this.useGlobalRegistry && !isGlobalRegistry(meterRegistry)) { + Metrics.addRegistry(meterRegistry); + } + } + + private boolean isGlobalRegistry(MeterRegistry meterRegistry) { + return meterRegistry == Metrics.globalRegistry; + } + + private boolean isBindable(MeterRegistry meterRegistry) { + return this.hasNoCompositeMeterRegistryBeans || isCompositeMeterRegistry(meterRegistry); + } + + private boolean isCompositeMeterRegistry(MeterRegistry meterRegistry) { + return meterRegistry instanceof CompositeMeterRegistry; + } + + void applyBinders(MeterRegistry meterRegistry) { + if (this.deferBinding) { + synchronized (this.deferredBindings) { + if (this.deferBinding) { + this.deferredBindings.add(meterRegistry); + return; + } + } + } + this.binders.orderedStream().forEach((binder) -> binder.bindTo(meterRegistry)); } } 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 aff0d3ec3e..3cc668e257 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 @@ -50,12 +50,11 @@ public class MetricsAutoConfiguration { } @Bean - public static MeterRegistryPostProcessor meterRegistryPostProcessor(ObjectProvider meterBinders, - ObjectProvider meterFilters, - ObjectProvider> meterRegistryCustomizers, - ObjectProvider metricsProperties, ApplicationContext applicationContext) { - return new MeterRegistryPostProcessor(meterBinders, meterFilters, meterRegistryCustomizers, metricsProperties, - applicationContext); + public static MeterRegistryPostProcessor meterRegistryPostProcessor(ApplicationContext applicationContext, + MetricsProperties metricsProperties, ObjectProvider> meterRegistryCustomizers, + ObjectProvider meterFilters, ObjectProvider meterBinders) { + return new MeterRegistryPostProcessor(applicationContext, metricsProperties, meterRegistryCustomizers, + meterFilters, meterBinders); } @Bean diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/amqp/RabbitMetricsAutoConfigurationMeterBinderCycleIntegrationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/amqp/RabbitMetricsAutoConfigurationMeterBinderCycleIntegrationTests.java new file mode 100644 index 0000000000..e98b0991c7 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/amqp/RabbitMetricsAutoConfigurationMeterBinderCycleIntegrationTests.java @@ -0,0 +1,66 @@ +/* + * Copyright 2012-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.autoconfigure.amqp; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.binder.MeterBinder; +import org.junit.jupiter.api.Test; + +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.metrics.amqp.RabbitMetricsAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration; +import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * Integration test to check that {@link RabbitMetricsAutoConfiguration} does not cause a + * dependency cycle when used with {@link MeterBinder}. + * + * @author Phillip Webb + * @see gh-30636 + */ +class RabbitMetricsAutoConfigurationMeterBinderCycleIntegrationTests { + + @Test + void doesNotFormCycle() { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class); + context.getBean(TestService.class); + context.close(); + } + + @Configuration + @Import({ TestService.class, RabbitAutoConfiguration.class, MetricsAutoConfiguration.class, + SimpleMetricsExportAutoConfiguration.class, RabbitMetricsAutoConfiguration.class }) + static class TestConfig { + + } + + static class TestService implements MeterBinder { + + TestService(RabbitTemplate rabbitTemplate) { + } + + @Override + public void bindTo(MeterRegistry registry) { + } + + } + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryConfigurerTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryPostProcessorTests.java similarity index 52% rename from spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryConfigurerTests.java rename to spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryPostProcessorTests.java index b7fbc5eaca..dc3166a259 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryConfigurerTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryPostProcessorTests.java @@ -40,28 +40,28 @@ import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; /** - * Tests for {@link MeterRegistryConfigurer}. + * Tests for {@link MeterRegistryPostProcessor}. * * @author Phillip Webb * @author Andy Wilkinson */ @ExtendWith(MockitoExtension.class) -class MeterRegistryConfigurerTests { - - private List binders = new ArrayList<>(); - - private List filters = new ArrayList<>(); +class MeterRegistryPostProcessorTests { private List> customizers = new ArrayList<>(); + private List filters = new ArrayList<>(); + + private List binders = new ArrayList<>(); + @Mock - private MeterBinder mockBinder; + private MeterRegistryCustomizer mockCustomizer; @Mock private MeterFilter mockFilter; @Mock - private MeterRegistryCustomizer mockCustomizer; + private MeterBinder mockBinder; @Mock private MeterRegistry mockRegistry; @@ -70,73 +70,79 @@ class MeterRegistryConfigurerTests { private Config mockConfig; @Test - void configureWhenCompositeShouldApplyCustomizer() { + void postProcessAndInitializeWhenCompositeAppliesCustomizer() { this.customizers.add(this.mockCustomizer); - MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(createObjectProvider(this.customizers), - createObjectProvider(this.filters), createObjectProvider(this.binders), false, false); + MeterRegistryPostProcessor processor = new MeterRegistryPostProcessor(false, false, + createObjectProvider(this.customizers), createObjectProvider(this.filters), + createObjectProvider(this.binders)); CompositeMeterRegistry composite = new CompositeMeterRegistry(); - configurer.configure(composite); + postProcessAndInitialize(processor, composite); then(this.mockCustomizer).should().customize(composite); } @Test - void configureShouldApplyCustomizer() { + void postProcessAndInitializeAppliesCustomizer() { given(this.mockRegistry.config()).willReturn(this.mockConfig); this.customizers.add(this.mockCustomizer); - MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(createObjectProvider(this.customizers), - createObjectProvider(this.filters), createObjectProvider(this.binders), false, false); - configurer.configure(this.mockRegistry); + MeterRegistryPostProcessor processor = new MeterRegistryPostProcessor(true, false, + createObjectProvider(this.customizers), createObjectProvider(this.filters), + createObjectProvider(this.binders)); + postProcessAndInitialize(processor, this.mockRegistry); then(this.mockCustomizer).should().customize(this.mockRegistry); } @Test - void configureShouldApplyFilter() { + void postProcessAndInitializeAppliesFilter() { given(this.mockRegistry.config()).willReturn(this.mockConfig); this.filters.add(this.mockFilter); - MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(createObjectProvider(this.customizers), - createObjectProvider(this.filters), createObjectProvider(this.binders), false, false); - configurer.configure(this.mockRegistry); + MeterRegistryPostProcessor processor = new MeterRegistryPostProcessor(true, false, + createObjectProvider(this.customizers), createObjectProvider(this.filters), + createObjectProvider(this.binders)); + postProcessAndInitialize(processor, this.mockRegistry); then(this.mockConfig).should().meterFilter(this.mockFilter); } @Test - void configureShouldApplyBinder() { + void postProcessAndInitializeBindsTo() { given(this.mockRegistry.config()).willReturn(this.mockConfig); this.binders.add(this.mockBinder); - MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(createObjectProvider(this.customizers), - createObjectProvider(this.filters), createObjectProvider(this.binders), false, false); - configurer.configure(this.mockRegistry); + MeterRegistryPostProcessor processor = new MeterRegistryPostProcessor(true, false, + createObjectProvider(this.customizers), createObjectProvider(this.filters), + createObjectProvider(this.binders)); + postProcessAndInitialize(processor, this.mockRegistry); then(this.mockBinder).should().bindTo(this.mockRegistry); } @Test - void configureShouldApplyBinderToComposite() { + void postProcessAndInitializeWhenCompositeBindsTo() { this.binders.add(this.mockBinder); - MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(createObjectProvider(this.customizers), - createObjectProvider(this.filters), createObjectProvider(this.binders), false, true); + MeterRegistryPostProcessor processor = new MeterRegistryPostProcessor(false, false, + createObjectProvider(this.customizers), createObjectProvider(this.filters), + createObjectProvider(this.binders)); CompositeMeterRegistry composite = new CompositeMeterRegistry(); - configurer.configure(composite); + postProcessAndInitialize(processor, composite); then(this.mockBinder).should().bindTo(composite); } @Test - void configureShouldNotApplyBinderWhenCompositeExists() { + void postProcessAndInitializeWhenCompositeExistsDoesNotBindTo() { given(this.mockRegistry.config()).willReturn(this.mockConfig); - MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(createObjectProvider(this.customizers), - createObjectProvider(this.filters), null, false, true); - configurer.configure(this.mockRegistry); + MeterRegistryPostProcessor processor = new MeterRegistryPostProcessor(false, false, + createObjectProvider(this.customizers), createObjectProvider(this.filters), null); + postProcessAndInitialize(processor, this.mockRegistry); then(this.mockBinder).shouldHaveNoInteractions(); } @Test - void configureShouldBeCalledInOrderCustomizerFilterBinder() { + void postProcessAndInitializeBeOrderedCustomizerThenFilterThenBindTo() { given(this.mockRegistry.config()).willReturn(this.mockConfig); this.customizers.add(this.mockCustomizer); this.filters.add(this.mockFilter); this.binders.add(this.mockBinder); - MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(createObjectProvider(this.customizers), - createObjectProvider(this.filters), createObjectProvider(this.binders), false, false); - configurer.configure(this.mockRegistry); + MeterRegistryPostProcessor processor = new MeterRegistryPostProcessor(true, false, + createObjectProvider(this.customizers), createObjectProvider(this.filters), + createObjectProvider(this.binders)); + postProcessAndInitialize(processor, this.mockRegistry); InOrder ordered = inOrder(this.mockBinder, this.mockConfig, this.mockCustomizer); then(this.mockCustomizer).should(ordered).customize(this.mockRegistry); then(this.mockConfig).should(ordered).meterFilter(this.mockFilter); @@ -144,12 +150,13 @@ class MeterRegistryConfigurerTests { } @Test - void configureWhenAddToGlobalRegistryShouldAddToGlobalRegistry() { + void postProcessAndInitializeWhenUseGlobalRegistryTrueAddsToGlobalRegistry() { given(this.mockRegistry.config()).willReturn(this.mockConfig); - MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(createObjectProvider(this.customizers), - createObjectProvider(this.filters), createObjectProvider(this.binders), true, false); + MeterRegistryPostProcessor processor = new MeterRegistryPostProcessor(true, true, + createObjectProvider(this.customizers), createObjectProvider(this.filters), + createObjectProvider(this.binders)); try { - configurer.configure(this.mockRegistry); + postProcessAndInitialize(processor, this.mockRegistry); assertThat(Metrics.globalRegistry.getRegistries()).contains(this.mockRegistry); } finally { @@ -158,14 +165,33 @@ class MeterRegistryConfigurerTests { } @Test - void configureWhenNotAddToGlobalRegistryShouldAddToGlobalRegistry() { + void postProcessAndInitializeWhenUseGlobalRegistryFalseDoesNotAddToGlobalRegistry() { given(this.mockRegistry.config()).willReturn(this.mockConfig); - MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(createObjectProvider(this.customizers), - createObjectProvider(this.filters), createObjectProvider(this.binders), false, false); - configurer.configure(this.mockRegistry); + MeterRegistryPostProcessor processor = new MeterRegistryPostProcessor(true, false, + createObjectProvider(this.customizers), createObjectProvider(this.filters), + createObjectProvider(this.binders)); + postProcessAndInitialize(processor, this.mockRegistry); assertThat(Metrics.globalRegistry.getRegistries()).doesNotContain(this.mockRegistry); } + @Test + void postProcessDoesNotBindToUntilSingletonsInitialized() { + given(this.mockRegistry.config()).willReturn(this.mockConfig); + this.binders.add(this.mockBinder); + MeterRegistryPostProcessor processor = new MeterRegistryPostProcessor(true, false, + createObjectProvider(this.customizers), createObjectProvider(this.filters), + createObjectProvider(this.binders)); + processor.postProcessAfterInitialization(this.mockRegistry, "meterRegistry"); + then(this.mockBinder).shouldHaveNoInteractions(); + processor.afterSingletonsInstantiated(); + then(this.mockBinder).should().bindTo(this.mockRegistry); + } + + private void postProcessAndInitialize(MeterRegistryPostProcessor processor, MeterRegistry registry) { + processor.postProcessAfterInitialization(registry, "meterRegistry"); + processor.afterSingletonsInstantiated(); + } + @SuppressWarnings("unchecked") private ObjectProvider createObjectProvider(List objects) { ObjectProvider objectProvider = mock(ObjectProvider.class); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryConfigurerIntegrationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationMeterRegistryPostProcessorIntegrationTests.java similarity index 96% rename from spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryConfigurerIntegrationTests.java rename to spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationMeterRegistryPostProcessorIntegrationTests.java index 35588249d8..e182f0bd70 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryConfigurerIntegrationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationMeterRegistryPostProcessorIntegrationTests.java @@ -41,11 +41,12 @@ import org.springframework.context.annotation.Configuration; import static org.assertj.core.api.Assertions.assertThat; /** - * Integration tests for {@link MeterRegistryConfigurer}. + * Integration tests for {@link MeterRegistryPostProcessor} configured by + * {@link MetricsAutoConfiguration}. * * @author Jon Schneider */ -class MeterRegistryConfigurerIntegrationTests { +class MetricsAutoConfigurationMeterRegistryPostProcessorIntegrationTests { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .with(MetricsRun.limitedTo(AtlasMetricsExportAutoConfiguration.class, @@ -68,7 +69,6 @@ class MeterRegistryConfigurerIntegrationTests { .withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class)) .withUserConfiguration(TestConfiguration.class).run((context) -> { - }); } diff --git a/src/checkstyle/checkstyle-suppressions.xml b/src/checkstyle/checkstyle-suppressions.xml index f90e4ab54f..ece96d22d6 100644 --- a/src/checkstyle/checkstyle-suppressions.xml +++ b/src/checkstyle/checkstyle-suppressions.xml @@ -11,7 +11,7 @@ - +