Skip to content

Commit de59981

Browse files
committed
Merge branch '2.1.x'
2 parents 903d940 + 33fb1fa commit de59981

File tree

4 files changed

+137
-38
lines changed

4 files changed

+137
-38
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryConfigurer.java

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.metrics;
1818

19-
import java.util.Collection;
20-
import java.util.Collections;
19+
import java.util.List;
20+
import java.util.stream.Collectors;
2121

2222
import io.micrometer.core.instrument.MeterRegistry;
2323
import io.micrometer.core.instrument.Metrics;
2424
import io.micrometer.core.instrument.binder.MeterBinder;
2525
import io.micrometer.core.instrument.config.MeterFilter;
2626

27+
import org.springframework.beans.factory.ObjectProvider;
2728
import org.springframework.boot.util.LambdaSafe;
2829

2930
/**
@@ -36,21 +37,20 @@
3637
*/
3738
class MeterRegistryConfigurer {
3839

39-
private final Collection<MeterRegistryCustomizer<?>> customizers;
40+
private final ObjectProvider<MeterRegistryCustomizer<?>> customizers;
4041

41-
private final Collection<MeterFilter> filters;
42+
private final ObjectProvider<MeterFilter> filters;
4243

43-
private final Collection<MeterBinder> binders;
44+
private final ObjectProvider<MeterBinder> binders;
4445

4546
private final boolean addToGlobalRegistry;
4647

47-
MeterRegistryConfigurer(Collection<MeterBinder> binders,
48-
Collection<MeterFilter> filters,
49-
Collection<MeterRegistryCustomizer<?>> customizers,
48+
MeterRegistryConfigurer(ObjectProvider<MeterRegistryCustomizer<?>> customizers,
49+
ObjectProvider<MeterFilter> filters, ObjectProvider<MeterBinder> binders,
5050
boolean addToGlobalRegistry) {
51-
this.binders = (binders != null) ? binders : Collections.emptyList();
52-
this.filters = (filters != null) ? filters : Collections.emptyList();
53-
this.customizers = (customizers != null) ? customizers : Collections.emptyList();
51+
this.customizers = customizers;
52+
this.filters = filters;
53+
this.binders = binders;
5454
this.addToGlobalRegistry = addToGlobalRegistry;
5555
}
5656

@@ -67,17 +67,23 @@ void configure(MeterRegistry registry) {
6767

6868
@SuppressWarnings("unchecked")
6969
private void customize(MeterRegistry registry) {
70-
LambdaSafe.callbacks(MeterRegistryCustomizer.class, this.customizers, registry)
70+
LambdaSafe
71+
.callbacks(MeterRegistryCustomizer.class, asOrderedList(this.customizers),
72+
registry)
7173
.withLogger(MeterRegistryConfigurer.class)
7274
.invoke((customizer) -> customizer.customize(registry));
7375
}
7476

7577
private void addFilters(MeterRegistry registry) {
76-
this.filters.forEach(registry.config()::meterFilter);
78+
this.filters.orderedStream().forEach(registry.config()::meterFilter);
7779
}
7880

7981
private void addBinders(MeterRegistry registry) {
80-
this.binders.forEach((binder) -> binder.bindTo(registry));
82+
this.binders.orderedStream().forEach((binder) -> binder.bindTo(registry));
83+
}
84+
85+
private <T> List<T> asOrderedList(ObjectProvider<T> provider) {
86+
return provider.orderedStream().collect(Collectors.toList());
8187
}
8288

8389
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MeterRegistryPostProcessor.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.metrics;
1818

19-
import java.util.List;
20-
import java.util.stream.Collectors;
21-
2219
import io.micrometer.core.instrument.MeterRegistry;
2320
import io.micrometer.core.instrument.binder.MeterBinder;
2421
import io.micrometer.core.instrument.config.MeterFilter;
@@ -68,16 +65,11 @@ public Object postProcessAfterInitialization(Object bean, String beanName)
6865

6966
private MeterRegistryConfigurer getConfigurer() {
7067
if (this.configurer == null) {
71-
this.configurer = new MeterRegistryConfigurer(
72-
asOrderedList(this.meterBinders), asOrderedList(this.meterFilters),
73-
asOrderedList(this.meterRegistryCustomizers),
68+
this.configurer = new MeterRegistryConfigurer(this.meterRegistryCustomizers,
69+
this.meterFilters, this.meterBinders,
7470
this.metricsProperties.getObject().isUseGlobalRegistry());
7571
}
7672
return this.configurer;
7773
}
7874

79-
private <T> List<T> asOrderedList(ObjectProvider<T> provider) {
80-
return provider.orderedStream().collect(Collectors.toList());
81-
}
82-
8375
}

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

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

1919
import io.micrometer.core.instrument.MeterRegistry;
20+
import io.micrometer.core.instrument.binder.MeterBinder;
2021
import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
2122
import org.junit.Test;
2223

24+
import org.springframework.beans.BeansException;
25+
import org.springframework.beans.factory.config.BeanPostProcessor;
2326
import org.springframework.boot.actuate.autoconfigure.metrics.export.atlas.AtlasMetricsExportAutoConfiguration;
2427
import org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus.PrometheusMetricsExportAutoConfiguration;
28+
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2529
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
2630
import org.springframework.boot.autoconfigure.AutoConfigurations;
2731
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
32+
import org.springframework.context.ApplicationContext;
33+
import org.springframework.context.annotation.Bean;
34+
import org.springframework.context.annotation.Configuration;
2835

2936
/**
3037
* Integration tests for {@link MeterRegistryConfigurer}.
@@ -49,4 +56,74 @@ public void binderMetricsAreSearchableFromTheComposite() {
4956
});
5057
}
5158

59+
@Test
60+
public void customizersAreAppliedBeforeBindersAreCreated() {
61+
new ApplicationContextRunner()
62+
.withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class,
63+
SimpleMetricsExportAutoConfiguration.class))
64+
.withUserConfiguration(TestConfiguration.class).run((context) -> {
65+
66+
});
67+
}
68+
69+
@Configuration
70+
static class TestConfiguration {
71+
72+
@Bean
73+
MeterBinder testBinder(Alpha thing) {
74+
return (registry) -> {
75+
};
76+
}
77+
78+
@Bean
79+
MeterRegistryCustomizer<?> testCustomizer() {
80+
return (registry) -> {
81+
registry.config().commonTags("testTag", "testValue");
82+
};
83+
}
84+
85+
@Bean
86+
Alpha alpha() {
87+
return new Alpha();
88+
}
89+
90+
@Bean
91+
Bravo bravo(Alpha alpha) {
92+
return new Bravo(alpha);
93+
}
94+
95+
@Bean
96+
static BeanPostProcessor testPostProcessor(ApplicationContext context) {
97+
return new BeanPostProcessor() {
98+
99+
@Override
100+
public Object postProcessAfterInitialization(Object bean, String beanName)
101+
throws BeansException {
102+
if (bean instanceof Bravo) {
103+
MeterRegistry meterRegistry = context
104+
.getBean(MeterRegistry.class);
105+
meterRegistry.gauge("test", 1);
106+
System.out.println(
107+
meterRegistry.find("test").gauge().getId().getTags());
108+
}
109+
return bean;
110+
}
111+
112+
};
113+
}
114+
115+
}
116+
117+
static class Alpha {
118+
119+
}
120+
121+
static class Bravo {
122+
123+
Bravo(Alpha alpha) {
124+
125+
}
126+
127+
}
128+
52129
}

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

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,12 @@
3131
import org.mockito.Mock;
3232
import org.mockito.MockitoAnnotations;
3333

34+
import org.springframework.beans.factory.ObjectProvider;
35+
3436
import static org.assertj.core.api.Assertions.assertThat;
3537
import static org.mockito.BDDMockito.given;
3638
import static org.mockito.Mockito.inOrder;
39+
import static org.mockito.Mockito.mock;
3740
import static org.mockito.Mockito.verify;
3841

3942
/**
@@ -74,8 +77,10 @@ public void setup() {
7477
@Test
7578
public void configureWhenCompositeShouldApplyCustomizer() {
7679
this.customizers.add(this.mockCustomizer);
77-
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(this.binders,
78-
this.filters, this.customizers, false);
80+
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(
81+
createObjectProvider(this.customizers),
82+
createObjectProvider(this.filters), createObjectProvider(this.binders),
83+
false);
7984
CompositeMeterRegistry composite = new CompositeMeterRegistry();
8085
configurer.configure(composite);
8186
verify(this.mockCustomizer).customize(composite);
@@ -84,26 +89,32 @@ public void configureWhenCompositeShouldApplyCustomizer() {
8489
@Test
8590
public void configureShouldApplyCustomizer() {
8691
this.customizers.add(this.mockCustomizer);
87-
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(this.binders,
88-
this.filters, this.customizers, false);
92+
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(
93+
createObjectProvider(this.customizers),
94+
createObjectProvider(this.filters), createObjectProvider(this.binders),
95+
false);
8996
configurer.configure(this.mockRegistry);
9097
verify(this.mockCustomizer).customize(this.mockRegistry);
9198
}
9299

93100
@Test
94101
public void configureShouldApplyFilter() {
95102
this.filters.add(this.mockFilter);
96-
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(this.binders,
97-
this.filters, this.customizers, false);
103+
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(
104+
createObjectProvider(this.customizers),
105+
createObjectProvider(this.filters), createObjectProvider(this.binders),
106+
false);
98107
configurer.configure(this.mockRegistry);
99108
verify(this.mockConfig).meterFilter(this.mockFilter);
100109
}
101110

102111
@Test
103112
public void configureShouldApplyBinder() {
104113
this.binders.add(this.mockBinder);
105-
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(this.binders,
106-
this.filters, this.customizers, false);
114+
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(
115+
createObjectProvider(this.customizers),
116+
createObjectProvider(this.filters), createObjectProvider(this.binders),
117+
false);
107118
configurer.configure(this.mockRegistry);
108119
verify(this.mockBinder).bindTo(this.mockRegistry);
109120
}
@@ -113,8 +124,10 @@ public void configureShouldBeCalledInOrderCustomizerFilterBinder() {
113124
this.customizers.add(this.mockCustomizer);
114125
this.filters.add(this.mockFilter);
115126
this.binders.add(this.mockBinder);
116-
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(this.binders,
117-
this.filters, this.customizers, false);
127+
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(
128+
createObjectProvider(this.customizers),
129+
createObjectProvider(this.filters), createObjectProvider(this.binders),
130+
false);
118131
configurer.configure(this.mockRegistry);
119132
InOrder ordered = inOrder(this.mockBinder, this.mockConfig, this.mockCustomizer);
120133
ordered.verify(this.mockCustomizer).customize(this.mockRegistry);
@@ -124,8 +137,10 @@ public void configureShouldBeCalledInOrderCustomizerFilterBinder() {
124137

125138
@Test
126139
public void configureWhenAddToGlobalRegistryShouldAddToGlobalRegistry() {
127-
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(this.binders,
128-
this.filters, this.customizers, true);
140+
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(
141+
createObjectProvider(this.customizers),
142+
createObjectProvider(this.filters), createObjectProvider(this.binders),
143+
true);
129144
try {
130145
configurer.configure(this.mockRegistry);
131146
assertThat(Metrics.globalRegistry.getRegistries())
@@ -138,11 +153,20 @@ public void configureWhenAddToGlobalRegistryShouldAddToGlobalRegistry() {
138153

139154
@Test
140155
public void configureWhenNotAddToGlobalRegistryShouldAddToGlobalRegistry() {
141-
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(this.binders,
142-
this.filters, this.customizers, false);
156+
MeterRegistryConfigurer configurer = new MeterRegistryConfigurer(
157+
createObjectProvider(this.customizers),
158+
createObjectProvider(this.filters), createObjectProvider(this.binders),
159+
false);
143160
configurer.configure(this.mockRegistry);
144161
assertThat(Metrics.globalRegistry.getRegistries())
145162
.doesNotContain(this.mockRegistry);
146163
}
147164

165+
@SuppressWarnings("unchecked")
166+
private <T> ObjectProvider<T> createObjectProvider(List<T> objects) {
167+
ObjectProvider<T> objectProvider = mock(ObjectProvider.class);
168+
given(objectProvider.orderedStream()).willReturn(objects.stream());
169+
return objectProvider;
170+
}
171+
148172
}

0 commit comments

Comments
 (0)