Skip to content

Commit b1830da

Browse files
onobcsnicoll
authored andcommitted
Disable metrics export in integration tests
This commit introduces a new property to globally disable metrics export. In integration tests, this property is automatically set to disable everything but in-memory metrics. This commit also introduces a `@AutoConfigureMetrics` annotation that can be used for integration tests that require metrics export to operate as they would in an application. See gh-21658
1 parent 9242ef4 commit b1830da

File tree

48 files changed

+706
-74
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+706
-74
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/appoptics/AppOpticsMetricsExportAutoConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@
2323

2424
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
2525
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
26+
import org.springframework.boot.actuate.autoconfigure.metrics.export.condition.ConditionalOnEnabledMetricsExport;
2627
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2728
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2829
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2930
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3031
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3132
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3233
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
33-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3434
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3535
import org.springframework.context.annotation.Bean;
3636
import org.springframework.context.annotation.Configuration;
@@ -47,8 +47,7 @@
4747
@AutoConfigureAfter(MetricsAutoConfiguration.class)
4848
@ConditionalOnBean(Clock.class)
4949
@ConditionalOnClass(AppOpticsMeterRegistry.class)
50-
@ConditionalOnProperty(prefix = "management.metrics.export.appoptics", name = "enabled", havingValue = "true",
51-
matchIfMissing = true)
50+
@ConditionalOnEnabledMetricsExport("appoptics")
5251
@EnableConfigurationProperties(AppOpticsProperties.class)
5352
public class AppOpticsMetricsExportAutoConfiguration {
5453

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/atlas/AtlasMetricsExportAutoConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222

2323
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
2424
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
25+
import org.springframework.boot.actuate.autoconfigure.metrics.export.condition.ConditionalOnEnabledMetricsExport;
2526
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2627
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2728
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2829
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2930
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3031
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3132
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
32-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3333
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3434
import org.springframework.context.annotation.Bean;
3535
import org.springframework.context.annotation.Configuration;
@@ -46,8 +46,7 @@
4646
@AutoConfigureAfter(MetricsAutoConfiguration.class)
4747
@ConditionalOnBean(Clock.class)
4848
@ConditionalOnClass(AtlasMeterRegistry.class)
49-
@ConditionalOnProperty(prefix = "management.metrics.export.atlas", name = "enabled", havingValue = "true",
50-
matchIfMissing = true)
49+
@ConditionalOnEnabledMetricsExport("atlas")
5150
@EnableConfigurationProperties(AtlasProperties.class)
5251
public class AtlasMetricsExportAutoConfiguration {
5352

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright 2012-2019 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+
* https://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.export.condition;
18+
19+
import java.lang.annotation.Documented;
20+
import java.lang.annotation.ElementType;
21+
import java.lang.annotation.Retention;
22+
import java.lang.annotation.RetentionPolicy;
23+
import java.lang.annotation.Target;
24+
25+
import org.springframework.context.annotation.Conditional;
26+
27+
/**
28+
* {@link Conditional @Conditional} that checks whether or not a particular metrics
29+
* exporter is enabled. If the {@code management.metrics.export.<name>.enabled} property
30+
* is configured then its value is used to determine if it matches. Otherwise, matches if
31+
* the value of the {@code management.metrics.export.enabled} property is {@code true} or
32+
* if it is not configured.
33+
*
34+
* @author Chris Bono
35+
* @since 2.4.0
36+
*/
37+
@Retention(RetentionPolicy.RUNTIME)
38+
@Target({ ElementType.TYPE, ElementType.METHOD })
39+
@Documented
40+
@Conditional(OnMetricsExportEnabledCondition.class)
41+
public @interface ConditionalOnEnabledMetricsExport {
42+
43+
/**
44+
* The name of the metrics exporter, typically derived from the name of the
45+
* corresponding auto-configuration class which follows the typical naming scheme of
46+
* {@code <name>MetricsExportAutoConfiguration}. For example, the
47+
* {@code DatadogMetricsExportAutoConfiguration} would have a name of 'datadog'.
48+
* @return the name of the metrics exporter
49+
*/
50+
String value();
51+
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* Copyright 2012-2019 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+
* https://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.export.condition;
18+
19+
import java.lang.annotation.Annotation;
20+
21+
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
22+
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
23+
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
24+
import org.springframework.context.annotation.ConditionContext;
25+
import org.springframework.core.annotation.AnnotationAttributes;
26+
import org.springframework.core.env.Environment;
27+
import org.springframework.core.type.AnnotatedTypeMetadata;
28+
29+
/**
30+
* Metrics exporter enabled condition. All exporters can be disabled globally via the
31+
* {@code management.metrics.export.enabled} property or individually via the
32+
* {@code management.metrics.export.<name>.enabled} property (where {@code <name>} is the
33+
* name of the exporter.
34+
*
35+
* @author Chris Bono
36+
* @since 2.4.0
37+
*/
38+
public class OnMetricsExportEnabledCondition extends SpringBootCondition {
39+
40+
private static final String PREFIX = "management.metrics.export";
41+
42+
private static final Class<? extends Annotation> ANNOTATION_TYPE = ConditionalOnEnabledMetricsExport.class;
43+
44+
@Override
45+
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
46+
AnnotationAttributes annotationAttributes = AnnotationAttributes
47+
.fromMap(metadata.getAnnotationAttributes(this.ANNOTATION_TYPE.getName()));
48+
String exporterName = annotationAttributes.getString("value");
49+
ConditionOutcome outcome = getSpecificExporterOutcome(context, exporterName);
50+
if (outcome != null) {
51+
return outcome;
52+
}
53+
return getGlobalExporterOutcome(context);
54+
}
55+
56+
protected ConditionOutcome getSpecificExporterOutcome(ConditionContext context, String exporterName) {
57+
Environment environment = context.getEnvironment();
58+
String enabledProperty = String.format("%s.%s.enabled", this.PREFIX, exporterName);
59+
if (!environment.containsProperty(enabledProperty)) {
60+
return null;
61+
}
62+
boolean match = environment.getProperty(enabledProperty, Boolean.class);
63+
return new ConditionOutcome(match, ConditionMessage.forCondition(this.ANNOTATION_TYPE)
64+
.because(String.format("%s is %b", enabledProperty, match)));
65+
}
66+
67+
protected ConditionOutcome getGlobalExporterOutcome(ConditionContext context) {
68+
Environment environment = context.getEnvironment();
69+
String enabledProperty = String.format("%s.enabled", this.PREFIX);
70+
boolean match = environment.getProperty(enabledProperty, Boolean.class, true);
71+
return new ConditionOutcome(match, ConditionMessage.forCondition(this.ANNOTATION_TYPE)
72+
.because(String.format("%s is considered %b", enabledProperty, match)));
73+
}
74+
75+
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/datadog/DatadogMetricsExportAutoConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@
2323

2424
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
2525
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
26+
import org.springframework.boot.actuate.autoconfigure.metrics.export.condition.ConditionalOnEnabledMetricsExport;
2627
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2728
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2829
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2930
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3031
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3132
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3233
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
33-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3434
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3535
import org.springframework.context.annotation.Bean;
3636
import org.springframework.context.annotation.Configuration;
@@ -47,8 +47,7 @@
4747
@AutoConfigureAfter(MetricsAutoConfiguration.class)
4848
@ConditionalOnBean(Clock.class)
4949
@ConditionalOnClass(DatadogMeterRegistry.class)
50-
@ConditionalOnProperty(prefix = "management.metrics.export.datadog", name = "enabled", havingValue = "true",
51-
matchIfMissing = true)
50+
@ConditionalOnEnabledMetricsExport("datadog")
5251
@EnableConfigurationProperties(DatadogProperties.class)
5352
public class DatadogMetricsExportAutoConfiguration {
5453

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/dynatrace/DynatraceMetricsExportAutoConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@
2323

2424
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
2525
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
26+
import org.springframework.boot.actuate.autoconfigure.metrics.export.condition.ConditionalOnEnabledMetricsExport;
2627
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2728
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2829
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2930
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3031
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3132
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3233
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
33-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3434
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3535
import org.springframework.context.annotation.Bean;
3636
import org.springframework.context.annotation.Configuration;
@@ -47,8 +47,7 @@
4747
@AutoConfigureAfter(MetricsAutoConfiguration.class)
4848
@ConditionalOnBean(Clock.class)
4949
@ConditionalOnClass(DynatraceMeterRegistry.class)
50-
@ConditionalOnProperty(prefix = "management.metrics.export.dynatrace", name = "enabled", havingValue = "true",
51-
matchIfMissing = true)
50+
@ConditionalOnEnabledMetricsExport("dynatrace")
5251
@EnableConfigurationProperties(DynatraceProperties.class)
5352
public class DynatraceMetricsExportAutoConfiguration {
5453

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/elastic/ElasticMetricsExportAutoConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@
2323

2424
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
2525
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
26+
import org.springframework.boot.actuate.autoconfigure.metrics.export.condition.ConditionalOnEnabledMetricsExport;
2627
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2728
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2829
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2930
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3031
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3132
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3233
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
33-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3434
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3535
import org.springframework.context.annotation.Bean;
3636
import org.springframework.context.annotation.Configuration;
@@ -47,8 +47,7 @@
4747
@AutoConfigureAfter(MetricsAutoConfiguration.class)
4848
@ConditionalOnBean(Clock.class)
4949
@ConditionalOnClass(ElasticMeterRegistry.class)
50-
@ConditionalOnProperty(prefix = "management.metrics.export.elastic", name = "enabled", havingValue = "true",
51-
matchIfMissing = true)
50+
@ConditionalOnEnabledMetricsExport("elastic")
5251
@EnableConfigurationProperties(ElasticProperties.class)
5352
public class ElasticMetricsExportAutoConfiguration {
5453

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/ganglia/GangliaMetricsExportAutoConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222

2323
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
2424
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
25+
import org.springframework.boot.actuate.autoconfigure.metrics.export.condition.ConditionalOnEnabledMetricsExport;
2526
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2627
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2728
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2829
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2930
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3031
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3132
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
32-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3333
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3434
import org.springframework.context.annotation.Bean;
3535
import org.springframework.context.annotation.Configuration;
@@ -45,8 +45,7 @@
4545
@AutoConfigureAfter(MetricsAutoConfiguration.class)
4646
@ConditionalOnBean(Clock.class)
4747
@ConditionalOnClass(GangliaMeterRegistry.class)
48-
@ConditionalOnProperty(prefix = "management.metrics.export.ganglia", name = "enabled", havingValue = "true",
49-
matchIfMissing = true)
48+
@ConditionalOnEnabledMetricsExport("ganglia")
5049
@EnableConfigurationProperties(GangliaProperties.class)
5150
public class GangliaMetricsExportAutoConfiguration {
5251

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/graphite/GraphiteMetricsExportAutoConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222

2323
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
2424
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
25+
import org.springframework.boot.actuate.autoconfigure.metrics.export.condition.ConditionalOnEnabledMetricsExport;
2526
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2627
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2728
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2829
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2930
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3031
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3132
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
32-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3333
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3434
import org.springframework.context.annotation.Bean;
3535
import org.springframework.context.annotation.Configuration;
@@ -45,8 +45,7 @@
4545
@AutoConfigureAfter(MetricsAutoConfiguration.class)
4646
@ConditionalOnBean(Clock.class)
4747
@ConditionalOnClass(GraphiteMeterRegistry.class)
48-
@ConditionalOnProperty(prefix = "management.metrics.export.graphite", name = "enabled", havingValue = "true",
49-
matchIfMissing = true)
48+
@ConditionalOnEnabledMetricsExport("graphite")
5049
@EnableConfigurationProperties(GraphiteProperties.class)
5150
public class GraphiteMetricsExportAutoConfiguration {
5251

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioMetricsExportAutoConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@
2323

2424
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
2525
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
26+
import org.springframework.boot.actuate.autoconfigure.metrics.export.condition.ConditionalOnEnabledMetricsExport;
2627
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2728
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2829
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2930
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3031
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3132
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3233
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
33-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3434
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3535
import org.springframework.context.annotation.Bean;
3636
import org.springframework.context.annotation.Configuration;
@@ -47,8 +47,7 @@
4747
@AutoConfigureAfter(MetricsAutoConfiguration.class)
4848
@ConditionalOnBean(Clock.class)
4949
@ConditionalOnClass(HumioMeterRegistry.class)
50-
@ConditionalOnProperty(prefix = "management.metrics.export.humio", name = "enabled", havingValue = "true",
51-
matchIfMissing = true)
50+
@ConditionalOnEnabledMetricsExport("humio")
5251
@EnableConfigurationProperties(HumioProperties.class)
5352
public class HumioMetricsExportAutoConfiguration {
5453

0 commit comments

Comments
 (0)