77
88import io .micrometer .core .instrument .Clock ;
99import io .micrometer .core .instrument .MeterRegistry ;
10+ import io .micrometer .core .instrument .composite .CompositeMeterRegistry ;
1011import 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 ;
1119import org .springframework .boot .actuate .autoconfigure .metrics .CompositeMeterRegistryAutoConfiguration ;
12- import org .springframework .boot .actuate .autoconfigure .metrics .export .prometheus .PrometheusMetricsExportAutoConfiguration ;
1320import org .springframework .boot .actuate .autoconfigure .metrics .export .simple .SimpleMetricsExportAutoConfiguration ;
1421import org .springframework .boot .autoconfigure .AutoConfigureAfter ;
1522import org .springframework .boot .autoconfigure .AutoConfigureBefore ;
2431// configure after the SimpleMeterRegistry has initialized; it is normally the last MeterRegistry
2532// implementation to be configured, as it's used as a fallback
2633// 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 )
3135@ ConditionalOnBean (Clock .class )
3236@ ConditionalOnClass (MeterRegistry .class )
3337public class OpenTelemetryMeterRegistryAutoConfiguration {
@@ -36,4 +40,30 @@ public class OpenTelemetryMeterRegistryAutoConfiguration {
3640 public MeterRegistry otelMeterRegistry () {
3741 return MicrometerSingletons .meterRegistry ();
3842 }
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+ }
3969}
0 commit comments