From 1fce46294437d7393ac8cf319816b857e4049cd2 Mon Sep 17 00:00:00 2001 From: Jon Schneider Date: Wed, 4 Apr 2018 12:42:42 -0500 Subject: [PATCH 1/2] Apply MeterRegistryCustomizer to composites Update `MeterRegistryConfigurer` to also apply customizers to composite meter registries. Prior to this commit composites were skipped due to the incorrect assumption that did not contain their own state. Closes gh-12762 --- .../metrics/MeterRegistryConfigurer.java | 3 -- ...terRegistryConfigurerIntegrationTests.java | 45 +++++++++++++++++++ .../metrics/MeterRegistryConfigurerTests.java | 9 ++-- .../metrics/MeterRegistryCustomizerTests.java | 39 +++++++++++----- 4 files changed, 77 insertions(+), 19 deletions(-) create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryConfigurerIntegrationTests.java 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 index 42041ddcea4..a0f1a0d10b2 100644 --- 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 @@ -59,9 +59,6 @@ class MeterRegistryConfigurer { } void configure(MeterRegistry registry) { - if (registry instanceof CompositeMeterRegistry) { - return; - } // Customizers must be applied before binders, as they may add custom // tags or alter timer or summary configuration. customize(registry); 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/MeterRegistryConfigurerIntegrationTests.java new file mode 100644 index 00000000000..37219e6b06c --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryConfigurerIntegrationTests.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2018 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 + * + * http://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.composite.CompositeMeterRegistry; +import org.junit.Test; + +import org.springframework.boot.actuate.autoconfigure.metrics.export.atlas.AtlasMetricsExportAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus.PrometheusMetricsExportAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +public class MeterRegistryConfigurerIntegrationTests { + private ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .with(MetricsRun.limitedTo(AtlasMetricsExportAutoConfiguration.class, + PrometheusMetricsExportAutoConfiguration.class)); + + @Test + public void binderMetricsAreSearchableFromTheComposite() { + this.contextRunner + .run((context) -> { + CompositeMeterRegistry composite = context.getBean(CompositeMeterRegistry.class); + composite.get("jvm.memory.used").gauge(); + + for (MeterRegistry registry : context.getBeansOfType(MeterRegistry.class).values()) { + registry.get("jvm.memory.used").gauge(); + } + }); + } +} 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 76951880a2e..9bd41e76c67 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 @@ -35,7 +35,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; /** * Tests for {@link MeterRegistryConfigurer}. @@ -73,13 +72,13 @@ public class MeterRegistryConfigurerTests { } @Test - public void configureWhenCompositeShouldSkip() { - this.binders.add(this.mockBinder); + public void configureWhenCompositeShouldApplyCustomizer() { this.customizers.add(this.mockCustomizer); MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(this.binders, this.filters, this.customizers, false); - configurer.configure(new CompositeMeterRegistry()); - verifyZeroInteractions(this.mockBinder, this.mockCustomizer); + CompositeMeterRegistry composite = new CompositeMeterRegistry(); + configurer.configure(composite); + verify(this.mockCustomizer).customize(composite); } @Test diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryCustomizerTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryCustomizerTests.java index e21ad0c6208..5cd0fa5767f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryCustomizerTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryCustomizerTests.java @@ -16,10 +16,13 @@ package org.springframework.boot.actuate.autoconfigure.metrics; +import io.micrometer.atlas.AtlasMeterRegistry; import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.core.instrument.MeterRegistry.Config; +import io.micrometer.prometheus.PrometheusMeterRegistry; import org.junit.Test; +import org.springframework.boot.actuate.autoconfigure.metrics.export.atlas.AtlasMetricsExportAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus.PrometheusMetricsExportAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; @@ -36,7 +39,8 @@ import static org.assertj.core.api.Assertions.assertThat; public class MeterRegistryCustomizerTests { private ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .with(MetricsRun.simple()); + .with(MetricsRun.limitedTo(AtlasMetricsExportAutoConfiguration.class, + PrometheusMetricsExportAutoConfiguration.class)); @Test public void commonTagsAreAppliedToAutoConfiguredBinders() { @@ -44,8 +48,7 @@ public class MeterRegistryCustomizerTests { .withUserConfiguration(MeterRegistryCustomizerConfiguration.class) .run((context) -> { MeterRegistry registry = context.getBean(MeterRegistry.class); - assertThat(registry.get("jvm.memory.used").tags("region", "us-east-1") - .gauge()).isNotNull(); + registry.get("jvm.memory.used").tags("region", "us-east-1").gauge(); }); } @@ -55,9 +58,21 @@ public class MeterRegistryCustomizerTests { .withUserConfiguration(MeterRegistryCustomizerConfiguration.class) .run((context) -> { MeterRegistry registry = context.getBean(MeterRegistry.class); - assertThat( - registry.get("my.thing").tags("region", "us-east-1").gauge()) - .isNotNull(); + registry.get("my.thing").tags("region", "us-east-1").gauge(); + }); + } + + @Test + public void customizersCanBeAppliedToSpecificRegistryTypes() { + this.contextRunner + .withUserConfiguration(MeterRegistryCustomizerConfiguration.class) + .run((context) -> { + MeterRegistry prometheus = context.getBean(PrometheusMeterRegistry.class); + prometheus.get("jvm.memory.used").tags("job", "myjob").gauge(); + + MeterRegistry atlas = context.getBean(AtlasMeterRegistry.class); + assertThat(atlas.find("jvm.memory.used").tags("job", "myjob") + .gauge()).isNull(); }); } @@ -66,10 +81,12 @@ public class MeterRegistryCustomizerTests { @Bean public MeterRegistryCustomizer commonTags() { - return (registry) -> { - Config config = registry.config(); - config.commonTags("region", "us-east-1"); - }; + return (registry) -> registry.config().commonTags("region", "us-east-1"); + } + + @Bean + public MeterRegistryCustomizer prometehusOnlyCommonTags() { + return (registry) -> registry.config().commonTags("job", "myjob"); } @Bean From ce9ca6ae708cc95f02faff6734207a79e5d3af48 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 4 Apr 2018 16:00:53 -0700 Subject: [PATCH 2/2] Polish "Apply MeterRegistryCustomizer to composites" Closes gh-12762 --- ...terRegistryConfigurerIntegrationTests.java | 23 +++++++++++-------- .../metrics/MeterRegistryCustomizerTests.java | 8 +++---- 2 files changed, 18 insertions(+), 13 deletions(-) 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/MeterRegistryConfigurerIntegrationTests.java index 37219e6b06c..3836341a5fe 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/MeterRegistryConfigurerIntegrationTests.java @@ -25,21 +25,26 @@ import org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus. import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +/** + * Integration tests for {@link MeterRegistryConfigurer}. + * + * @author Jon Schneider + */ public class MeterRegistryConfigurerIntegrationTests { + private ApplicationContextRunner contextRunner = new ApplicationContextRunner() .with(MetricsRun.limitedTo(AtlasMetricsExportAutoConfiguration.class, PrometheusMetricsExportAutoConfiguration.class)); @Test public void binderMetricsAreSearchableFromTheComposite() { - this.contextRunner - .run((context) -> { - CompositeMeterRegistry composite = context.getBean(CompositeMeterRegistry.class); - composite.get("jvm.memory.used").gauge(); - - for (MeterRegistry registry : context.getBeansOfType(MeterRegistry.class).values()) { - registry.get("jvm.memory.used").gauge(); - } - }); + this.contextRunner.run((context) -> { + CompositeMeterRegistry composite = context + .getBean(CompositeMeterRegistry.class); + composite.get("jvm.memory.used").gauge(); + context.getBeansOfType(MeterRegistry.class) + .forEach((name, registry) -> registry.get("jvm.memory.used").gauge()); + }); } + } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryCustomizerTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryCustomizerTests.java index 5cd0fa5767f..4aebdd4f153 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryCustomizerTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryCustomizerTests.java @@ -67,12 +67,12 @@ public class MeterRegistryCustomizerTests { this.contextRunner .withUserConfiguration(MeterRegistryCustomizerConfiguration.class) .run((context) -> { - MeterRegistry prometheus = context.getBean(PrometheusMeterRegistry.class); + MeterRegistry prometheus = context + .getBean(PrometheusMeterRegistry.class); prometheus.get("jvm.memory.used").tags("job", "myjob").gauge(); - MeterRegistry atlas = context.getBean(AtlasMeterRegistry.class); - assertThat(atlas.find("jvm.memory.used").tags("job", "myjob") - .gauge()).isNull(); + assertThat(atlas.find("jvm.memory.used").tags("job", "myjob").gauge()) + .isNull(); }); }