7
7
8
8
import io .micrometer .core .instrument .Clock ;
9
9
import io .micrometer .core .instrument .MeterRegistry ;
10
+ import io .micrometer .core .instrument .composite .CompositeMeterRegistry ;
10
11
import io .opentelemetry .javaagent .instrumentation .micrometer .v1_5 .MicrometerSingletons ;
12
+ import java .util .ArrayList ;
13
+ import java .util .Collections ;
14
+ import java .util .Comparator ;
15
+ import java .util .LinkedHashSet ;
16
+ import java .util .List ;
17
+ import java .util .Set ;
18
+ import org .springframework .beans .factory .config .BeanPostProcessor ;
11
19
import org .springframework .boot .actuate .autoconfigure .metrics .CompositeMeterRegistryAutoConfiguration ;
12
- import org .springframework .boot .actuate .autoconfigure .metrics .export .prometheus .PrometheusMetricsExportAutoConfiguration ;
13
20
import org .springframework .boot .actuate .autoconfigure .metrics .export .simple .SimpleMetricsExportAutoConfiguration ;
14
21
import org .springframework .boot .autoconfigure .AutoConfigureAfter ;
15
22
import org .springframework .boot .autoconfigure .AutoConfigureBefore ;
24
31
// configure after the SimpleMeterRegistry has initialized; it is normally the last MeterRegistry
25
32
// implementation to be configured, as it's used as a fallback
26
33
// the OTel registry should be added in addition to that fallback and not replace it
27
- @ AutoConfigureAfter ({
28
- SimpleMetricsExportAutoConfiguration .class ,
29
- PrometheusMetricsExportAutoConfiguration .class
30
- })
34
+ @ AutoConfigureAfter (SimpleMetricsExportAutoConfiguration .class )
31
35
@ ConditionalOnBean (Clock .class )
32
36
@ ConditionalOnClass (MeterRegistry .class )
33
37
public class OpenTelemetryMeterRegistryAutoConfiguration {
@@ -36,4 +40,30 @@ public class OpenTelemetryMeterRegistryAutoConfiguration {
36
40
public MeterRegistry otelMeterRegistry () {
37
41
return MicrometerSingletons .meterRegistry ();
38
42
}
43
+
44
+ @ Bean
45
+ static BeanPostProcessor postProcessCompositeMeterRegistry () {
46
+ return new BeanPostProcessor () {
47
+ @ Override
48
+ public Object postProcessAfterInitialization (Object bean , String beanName ) {
49
+ if (bean instanceof CompositeMeterRegistry ) {
50
+ CompositeMeterRegistry original = (CompositeMeterRegistry ) bean ;
51
+ List <MeterRegistry > list = new ArrayList <>(original .getRegistries ());
52
+ // sort otel registry last
53
+ list .sort (
54
+ Comparator .comparingInt (
55
+ value -> value == MicrometerSingletons .meterRegistry () ? 1 : 0 ));
56
+ Set <MeterRegistry > registries = new LinkedHashSet <>(list );
57
+ return new CompositeMeterRegistry (
58
+ original .config ().clock (), Collections .singletonList (original )) {
59
+ @ Override
60
+ public Set <MeterRegistry > getRegistries () {
61
+ return registries ;
62
+ }
63
+ };
64
+ }
65
+ return bean ;
66
+ }
67
+ };
68
+ }
39
69
}
0 commit comments