Skip to content

Commit fd237f8

Browse files
jkschneiderphilwebb
authored andcommitted
Extract common micrometer test setup
Create `MetricsRun` that can be used to apply common micrometer test configuration to a `ApplicationContextRunner`. Closes gh-11804
1 parent d1de1cd commit fd237f8

File tree

7 files changed

+119
-77
lines changed

7 files changed

+119
-77
lines changed

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

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
import io.micrometer.core.instrument.MeterRegistry;
2020
import org.junit.Test;
2121

22-
import org.springframework.boot.autoconfigure.AutoConfigurations;
23-
import org.springframework.boot.context.annotation.UserConfigurations;
2422
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2523
import org.springframework.context.annotation.Bean;
2624

@@ -34,25 +32,22 @@
3432
*/
3533
public class MeterRegistryConfigurerTests {
3634

35+
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
36+
.with(MetricsRun.simple());
37+
3738
@Test
3839
public void commonTagsAreAppliedToAutoConfiguredBinders() {
39-
new ApplicationContextRunner()
40-
.withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class))
41-
.withConfiguration(
42-
UserConfigurations.of(MeterRegistryConfigurerConfiguration.class))
43-
.withPropertyValues("management.metrics.use-global-registry=false")
40+
this.contextRunner
41+
.withUserConfiguration(MeterRegistryConfigurerConfiguration.class)
4442
.run((context) -> assertThat(context.getBean(MeterRegistry.class)
4543
.get("jvm.memory.used").tags("region", "us-east-1").gauge())
4644
.isNotNull());
4745
}
4846

4947
@Test
5048
public void commonTagsAreAppliedBeforeRegistryIsInjectableElsewhere() {
51-
new ApplicationContextRunner()
52-
.withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class))
53-
.withConfiguration(
54-
UserConfigurations.of(MeterRegistryConfigurerConfiguration.class))
55-
.withPropertyValues("management.metrics.use-global-registry=false")
49+
this.contextRunner
50+
.withUserConfiguration(MeterRegistryConfigurerConfiguration.class)
5651
.run((context) -> assertThat(context.getBean(MeterRegistry.class)
5752
.get("my.thing").tags("region", "us-east-1").gauge())
5853
.isNotNull());
@@ -72,6 +67,7 @@ public MyThing myThing(MeterRegistry registry) {
7267
}
7368

7469
class MyThing {
70+
7571
}
7672

7773
}

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

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import javax.sql.DataSource;
2222

2323
import io.micrometer.core.instrument.MeterRegistry;
24-
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
2524
import org.junit.Test;
2625

2726
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -40,10 +39,8 @@
4039
*/
4140
public class MetricsAutoConfigurationTests {
4241

43-
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
44-
.withPropertyValues("management.metrics.use-global-registry=false")
45-
.withUserConfiguration(RegistryConfiguration.class)
46-
.withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class));
42+
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
43+
.with(MetricsRun.simple());
4744

4845
@Test
4946
public void autoConfiguredDataSourceIsInstrumented() {
@@ -107,16 +104,6 @@ public void allDataSourcesCanBeInstrumented() {
107104
});
108105
}
109106

110-
@Configuration
111-
static class RegistryConfiguration {
112-
113-
@Bean
114-
public MeterRegistry meterRegistry() {
115-
return new SimpleMeterRegistry();
116-
}
117-
118-
}
119-
120107
@Configuration
121108
static class TwoDataSourcesConfiguration {
122109

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
* Copyright 2012-2018 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.actuate.autoconfigure.metrics;
18+
19+
import java.util.ArrayList;
20+
import java.util.Arrays;
21+
import java.util.Collections;
22+
import java.util.LinkedHashSet;
23+
import java.util.List;
24+
import java.util.Set;
25+
import java.util.function.Function;
26+
27+
import org.springframework.boot.autoconfigure.AutoConfigurations;
28+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
29+
30+
/**
31+
* Additional metrics configuration and settings that can be applied to a
32+
* {@link ApplicationContextRunner} when running a metrics test.
33+
*
34+
* @author Jon Schneider
35+
* @author Phillip Webb
36+
*/
37+
public final class MetricsRun {
38+
39+
private static final Set<String> IMPLEMENTATIONS = Collections
40+
.unmodifiableSet(new LinkedHashSet<>(Arrays.asList("atlas", "datadog",
41+
"ganglia", "graphite", "influx", "jmx", "prometheus", "statsd",
42+
"newrelic", "signalfx", "wavefront", "simple")));
43+
44+
private MetricsRun() {
45+
}
46+
47+
/**
48+
* Return a function that configures the run to be limited to the {@code simple}
49+
* implementation.
50+
* @return the function to apply
51+
*/
52+
public static Function<ApplicationContextRunner, ApplicationContextRunner> simple() {
53+
return limitedTo("simple");
54+
}
55+
56+
/**
57+
* Return a function that configures the run to be limited to the specified
58+
* implementations.
59+
* @param implementations the implementations to include
60+
* @return the function to apply
61+
*/
62+
public static Function<ApplicationContextRunner, ApplicationContextRunner> limitedTo(
63+
String... implementations) {
64+
return (contextRunner) -> apply(contextRunner, implementations);
65+
}
66+
67+
private static ApplicationContextRunner apply(ApplicationContextRunner contextRunner,
68+
String[] implementations) {
69+
return contextRunner.withPropertyValues(getPropertyValues(implementations))
70+
.withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class));
71+
}
72+
73+
private static String[] getPropertyValues(String[] implementations) {
74+
List<String> propertyValues = new ArrayList<>();
75+
propertyValues.add("management.metrics.use-global-registry=false");
76+
List<String> keep = Arrays.asList(implementations);
77+
IMPLEMENTATIONS.stream()
78+
.filter((implementation) -> !keep.contains(implementations))
79+
.map(MetricsRun::disableExport).forEach(propertyValues::add);
80+
return propertyValues.toArray(new String[0]);
81+
}
82+
83+
private static String disableExport(String implementation) {
84+
return "management.metrics.export." + implementation + ".enabled=false";
85+
}
86+
87+
}

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

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,12 @@
1717
package org.springframework.boot.actuate.autoconfigure.metrics.amqp;
1818

1919
import io.micrometer.core.instrument.MeterRegistry;
20-
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
2120
import org.junit.Test;
2221

23-
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
22+
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsRun;
2423
import org.springframework.boot.autoconfigure.AutoConfigurations;
2524
import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
2625
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
27-
import org.springframework.context.annotation.Bean;
28-
import org.springframework.context.annotation.Configuration;
2926

3027
import static org.assertj.core.api.Assertions.assertThat;
3128

@@ -37,10 +34,8 @@
3734
public class RabbitMetricsConfigurationTests {
3835

3936
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
40-
.withUserConfiguration(RegistryConfiguration.class)
41-
.withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class,
42-
RabbitAutoConfiguration.class))
43-
.withPropertyValues("management.metrics.use-global-registry=false");
37+
.with(MetricsRun.simple())
38+
.withConfiguration(AutoConfigurations.of(RabbitAutoConfiguration.class));
4439

4540
@Test
4641
public void autoConfiguredConnectionFactoryIsInstrumented() {
@@ -71,14 +66,4 @@ public void rabbitmqNativeConnectionFactoryInstrumentationCanBeDisabled() {
7166
});
7267
}
7368

74-
@Configuration
75-
static class RegistryConfiguration {
76-
77-
@Bean
78-
public MeterRegistry meterRegistry() {
79-
return new SimpleMeterRegistry();
80-
}
81-
82-
}
83-
8469
}

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

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,13 @@
1717
package org.springframework.boot.actuate.autoconfigure.metrics.cache;
1818

1919
import io.micrometer.core.instrument.MeterRegistry;
20-
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
2120
import org.junit.Test;
2221

23-
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
22+
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsRun;
2423
import org.springframework.boot.autoconfigure.AutoConfigurations;
2524
import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration;
2625
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2726
import org.springframework.cache.annotation.EnableCaching;
28-
import org.springframework.context.annotation.Bean;
2927
import org.springframework.context.annotation.Configuration;
3028

3129
import static org.assertj.core.api.Assertions.assertThat;
@@ -38,10 +36,8 @@
3836
public class CacheMetricsConfigurationTests {
3937

4038
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
41-
.withUserConfiguration(RegistryConfiguration.class)
42-
.withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class,
43-
CacheAutoConfiguration.class))
44-
.withPropertyValues("management.metrics.use-global-registry=false");
39+
.with(MetricsRun.simple()).withUserConfiguration(CachingConfiguration.class)
40+
.withConfiguration(AutoConfigurations.of(CacheAutoConfiguration.class));
4541

4642
@Test
4743
public void autoConfiguredCacheManagerIsInstrumented() {
@@ -93,12 +89,7 @@ public void cacheInstrumentationCanBeDisabled() {
9389

9490
@Configuration
9591
@EnableCaching
96-
static class RegistryConfiguration {
97-
98-
@Bean
99-
public MeterRegistry meterRegistry() {
100-
return new SimpleMeterRegistry();
101-
}
92+
static class CachingConfiguration {
10293

10394
}
10495

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/RestTemplateMetricsConfigurationTests.java

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,14 @@
1717
package org.springframework.boot.actuate.autoconfigure.metrics.web.client;
1818

1919
import io.micrometer.core.instrument.MeterRegistry;
20-
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
2120
import org.junit.Test;
2221

23-
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
22+
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsRun;
2423
import org.springframework.boot.actuate.metrics.web.client.MetricsRestTemplateCustomizer;
2524
import org.springframework.boot.autoconfigure.AutoConfigurations;
2625
import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration;
2726
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2827
import org.springframework.boot.web.client.RestTemplateBuilder;
29-
import org.springframework.context.annotation.Bean;
30-
import org.springframework.context.annotation.Configuration;
3128
import org.springframework.http.HttpStatus;
3229
import org.springframework.test.web.client.MockRestServiceServer;
3330
import org.springframework.web.client.RestTemplate;
@@ -44,10 +41,8 @@
4441
public class RestTemplateMetricsConfigurationTests {
4542

4643
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
47-
.withPropertyValues("management.metrics.use-global-registry=false")
48-
.withConfiguration(AutoConfigurations.of(RestTemplateAutoConfiguration.class,
49-
MetricsAutoConfiguration.class))
50-
.withUserConfiguration(RegistryConfiguration.class);
44+
.with(MetricsRun.simple()).withConfiguration(
45+
AutoConfigurations.of(RestTemplateAutoConfiguration.class));
5146

5247
@Test
5348
public void restTemplateCreatedWithBuilderIsInstrumented() {
@@ -80,14 +75,4 @@ private void validateRestTemplate(RestTemplate restTemplate, MeterRegistry regis
8075
registry.get("http.client.requests").meter();
8176
}
8277

83-
@Configuration
84-
static class RegistryConfiguration {
85-
86-
@Bean
87-
public MeterRegistry registry() {
88-
return new SimpleMeterRegistry();
89-
}
90-
91-
}
92-
9378
}

spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunner.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2017 the original author or authors.
2+
* Copyright 2012-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
1919
import java.util.ArrayList;
2020
import java.util.Collections;
2121
import java.util.List;
22+
import java.util.function.Function;
2223
import java.util.function.Supplier;
2324

2425
import org.springframework.boot.context.annotation.Configurations;
@@ -220,6 +221,16 @@ public SELF withConfiguration(Configurations configurations) {
220221
add(this.configurations, configurations));
221222
}
222223

224+
/**
225+
* Apply customization to this runner.
226+
* @param customizer the customizer to call
227+
* @return a new instance with the customizations applied
228+
*/
229+
@SuppressWarnings("unchecked")
230+
public SELF with(Function<SELF, SELF> customizer) {
231+
return customizer.apply((SELF) this);
232+
}
233+
223234
private <T> List<T> add(List<T> list, T element) {
224235
List<T> result = new ArrayList<>(list);
225236
result.add(element);

0 commit comments

Comments
 (0)