Skip to content

Commit 1d51dec

Browse files
committed
Refactor multiple RegistryCustomizer into one bean
See spring-projectsgh-29666
1 parent 4fe6e9b commit 1d51dec

File tree

2 files changed

+97
-62
lines changed

2 files changed

+97
-62
lines changed

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

+6-62
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,17 @@
1616

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

19-
import java.util.ArrayList;
2019
import java.util.List;
2120

2221
import io.micrometer.core.instrument.MeterRegistry;
23-
import io.micrometer.core.instrument.observation.MeterObservationHandler;
2422
import io.micrometer.core.instrument.observation.Observation.GlobalTagsProvider;
2523
import io.micrometer.core.instrument.observation.ObservationHandler;
26-
import io.micrometer.core.instrument.observation.ObservationHandler.FirstMatchingCompositeObservationHandler;
2724
import io.micrometer.core.instrument.observation.ObservationPredicate;
28-
import io.micrometer.core.instrument.observation.TimerObservationHandler;
2925

3026
import org.springframework.boot.autoconfigure.AutoConfiguration;
3127
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3228
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
29+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3330
import org.springframework.context.annotation.Bean;
3431

3532
/**
@@ -42,65 +39,12 @@
4239
@ConditionalOnBean(MeterRegistry.class)
4340
public class ObservationAutoConfiguration {
4441

45-
/**
46-
* Enables {@link TimerObservationHandler} on the {@link MeterRegistry}.
47-
* @return meter registry customizer
48-
*/
4942
@Bean
50-
public MeterRegistryCustomizer<MeterRegistry> enableTimerObservationHandler() {
51-
return MeterRegistry::withTimerObservationHandler;
52-
}
53-
54-
/**
55-
* Registers {@link ObservationPredicate ObservationPredicates} into the
56-
* {@link MeterRegistry}.
57-
* @param predicates list of predicates
58-
* @return meter registry customizer
59-
*/
60-
@Bean
61-
public MeterRegistryCustomizer<MeterRegistry> registerObservationPredicates(List<ObservationPredicate> predicates) {
62-
return (registry) -> predicates
63-
.forEach((predicate) -> registry.observationConfig().observationPredicate(predicate));
64-
}
65-
66-
/**
67-
* Registers {@link GlobalTagsProvider GlobalTagsProviders} into the
68-
* {@link MeterRegistry}.
69-
* @param tagProviders list of tags providers
70-
* @return meter registry customizer
71-
*/
72-
@Bean
73-
public MeterRegistryCustomizer<MeterRegistry> registerGlobalTagsProvider(List<GlobalTagsProvider<?>> tagProviders) {
74-
return (registry) -> tagProviders
75-
.forEach((tagProvider) -> registry.observationConfig().tagsProvider(tagProvider));
76-
}
77-
78-
/**
79-
* Registers {@link ObservationHandler ObservationHandlers} into the
80-
* {@link MeterRegistry}.
81-
* @param handlers list of handlers
82-
* @return meter registry customizer
83-
*/
84-
@Bean
85-
public MeterRegistryCustomizer<MeterRegistry> registerObservationHandler(List<ObservationHandler<?>> handlers) {
86-
return (registry) -> registerObservationHandler(registry, handlers);
87-
}
88-
89-
@SuppressWarnings("rawtypes")
90-
private void registerObservationHandler(MeterRegistry registry, List<ObservationHandler<?>> handlers) {
91-
List<ObservationHandler> meterHandlers = new ArrayList<>();
92-
for (ObservationHandler<?> observationHandler : handlers) {
93-
if (observationHandler instanceof MeterObservationHandler) {
94-
meterHandlers.add(observationHandler);
95-
}
96-
else {
97-
registry.observationConfig().observationHandler(observationHandler);
98-
}
99-
}
100-
if (!meterHandlers.isEmpty()) {
101-
registry.observationConfig()
102-
.observationHandler(new FirstMatchingCompositeObservationHandler(meterHandlers));
103-
}
43+
@ConditionalOnMissingBean
44+
public ObservationMeterRegistryCustomizer enableTimerObservationHandler(
45+
List<ObservationPredicate> observationPredicates, List<GlobalTagsProvider<?>> tagProviders,
46+
List<ObservationHandler<?>> observationHandlers) {
47+
return new ObservationMeterRegistryCustomizer(observationPredicates, tagProviders, observationHandlers);
10448
}
10549

10650
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* Copyright 2012-2022 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;
18+
19+
import java.util.ArrayList;
20+
import java.util.List;
21+
22+
import io.micrometer.core.instrument.MeterRegistry;
23+
import io.micrometer.core.instrument.observation.MeterObservationHandler;
24+
import io.micrometer.core.instrument.observation.Observation.GlobalTagsProvider;
25+
import io.micrometer.core.instrument.observation.ObservationHandler;
26+
import io.micrometer.core.instrument.observation.ObservationHandler.FirstMatchingCompositeObservationHandler;
27+
import io.micrometer.core.instrument.observation.ObservationPredicate;
28+
29+
/**
30+
* Customizes a {@link MeterRegistry} for Micrometer Observation.
31+
*
32+
* @author Moritz Halbritter
33+
* @since 3.0.0
34+
*/
35+
public class ObservationMeterRegistryCustomizer implements MeterRegistryCustomizer<MeterRegistry> {
36+
37+
private final List<ObservationPredicate> observationPredicates;
38+
39+
private final List<GlobalTagsProvider<?>> tagProviders;
40+
41+
private final List<ObservationHandler<?>> observationHandlers;
42+
43+
public ObservationMeterRegistryCustomizer(List<ObservationPredicate> observationPredicates,
44+
List<GlobalTagsProvider<?>> tagProviders, List<ObservationHandler<?>> observationHandlers) {
45+
this.observationPredicates = observationPredicates;
46+
this.tagProviders = tagProviders;
47+
this.observationHandlers = observationHandlers;
48+
}
49+
50+
@Override
51+
public void customize(MeterRegistry registry) {
52+
enableTimerObservationHandler(registry);
53+
registerObservationPredicates(registry);
54+
registerGlobalTagsProvider(registry);
55+
registerObservationHandlers(registry);
56+
}
57+
58+
private void enableTimerObservationHandler(MeterRegistry registry) {
59+
registry.withTimerObservationHandler();
60+
}
61+
62+
private void registerObservationPredicates(MeterRegistry registry) {
63+
for (ObservationPredicate observationPredicate : this.observationPredicates) {
64+
registry.observationConfig().observationPredicate(observationPredicate);
65+
}
66+
}
67+
68+
private void registerGlobalTagsProvider(MeterRegistry registry) {
69+
for (GlobalTagsProvider<?> tagProvider : this.tagProviders) {
70+
registry.observationConfig().tagsProvider(tagProvider);
71+
}
72+
}
73+
74+
@SuppressWarnings("rawtypes")
75+
private void registerObservationHandlers(MeterRegistry registry) {
76+
List<ObservationHandler> meterHandlers = new ArrayList<>();
77+
for (ObservationHandler<?> observationHandler : this.observationHandlers) {
78+
if (observationHandler instanceof MeterObservationHandler) {
79+
meterHandlers.add(observationHandler);
80+
}
81+
else {
82+
registry.observationConfig().observationHandler(observationHandler);
83+
}
84+
}
85+
if (!meterHandlers.isEmpty()) {
86+
registry.observationConfig()
87+
.observationHandler(new FirstMatchingCompositeObservationHandler(meterHandlers));
88+
}
89+
}
90+
91+
}

0 commit comments

Comments
 (0)