From e1def637aefc4f49240b87a93b2ac4faa2a8082e Mon Sep 17 00:00:00 2001 From: Alessandro Ciccimarra Date: Mon, 11 Dec 2017 22:16:56 +0000 Subject: [PATCH] Apply configurers on MeterRegistry before injection MeterRegistryConfigurers are now applied within the Bean method creating the CompositeMeterRegistry, instead of applying them later in its lifecycle, when the bean itself could have been injected somewhere. Fixes gh-11319 --- .../metrics/MetricsAutoConfiguration.java | 8 ++++---- .../metrics/MeterRegistryConfigurerTests.java | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) 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 4e3f4be5c16..92d005e7c5e 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 @@ -79,8 +79,11 @@ public class MetricsAutoConfiguration { @Bean @ConditionalOnMissingBean(MeterRegistry.class) public CompositeMeterRegistry compositeMeterRegistry( - ObjectProvider> exporters) { + ObjectProvider> exporters, + ObjectProvider> configurers) { CompositeMeterRegistry composite = new CompositeMeterRegistry(); + configurers.getIfAvailable(Collections::emptyList) + .forEach((configurer) -> configurer.configureRegistry(composite)); exporters.getIfAvailable(Collections::emptyList).stream() .map(MetricsExporter::registry).forEach(composite::add); return composite; @@ -119,11 +122,8 @@ public class MetricsAutoConfiguration { static class MeterRegistryConfigurationSupport { MeterRegistryConfigurationSupport(MeterRegistry registry, - ObjectProvider> configurers, MetricsProperties config, ObjectProvider> binders) { - configurers.getIfAvailable(Collections::emptyList) - .forEach((configurer) -> configurer.configureRegistry(registry)); binders.getIfAvailable(Collections::emptyList) .forEach((binder) -> binder.bindTo(registry)); if (config.isUseGlobalRegistry()) { 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/MeterRegistryConfigurerTests.java index 3c21c63cbff..1f3cfa6c0ad 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/MeterRegistryConfigurerTests.java @@ -46,6 +46,18 @@ public class MeterRegistryConfigurerTests { .isPresent()); } + @Test + public void commonTagsAreAppliedBeforeRegistryIsInjectableElsewhere() { + new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class)) + .withConfiguration( + UserConfigurations.of(MeterRegistryConfigurerConfiguration.class)) + .withPropertyValues("metrics.use-global-registry=false") + .run((context) -> assertThat(context.getBean(MeterRegistry.class) + .find("my.thing").tags("region", "us-east-1").gauge()) + .isPresent()); + } + static class MeterRegistryConfigurerConfiguration { @Bean @@ -53,6 +65,14 @@ public class MeterRegistryConfigurerTests { return (registry) -> registry.config().commonTags("region", "us-east-1"); } + private class MyThing {} + + @Bean + public MyThing myThing(MeterRegistry registry) { + registry.gauge("my.thing", 0); + return new MyThing(); + } + } }