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
pull/12767/merge
Jon Schneider 7 years ago committed by Phillip Webb
parent d49a1024bd
commit 1fce462944

@ -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);

@ -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();
}
});
}
}

@ -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

@ -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<MeterRegistry> 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<PrometheusMeterRegistry> prometehusOnlyCommonTags() {
return (registry) -> registry.config().commonTags("job", "myjob");
}
@Bean

Loading…
Cancel
Save