Skip to content

Commit 84abdcc

Browse files
committed
sort the otel registry last explicitly
1 parent a5b122b commit 84abdcc

File tree

1 file changed

+35
-5
lines changed

1 file changed

+35
-5
lines changed

instrumentation/spring/spring-boot-actuator-autoconfigure-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/actuator/v2_0/OpenTelemetryMeterRegistryAutoConfiguration.java

+35-5
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,16 @@
77

88
import io.micrometer.core.instrument.Clock;
99
import io.micrometer.core.instrument.MeterRegistry;
10+
import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
1011
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;
1119
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
12-
import org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus.PrometheusMetricsExportAutoConfiguration;
1320
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
1421
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
1522
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
@@ -24,10 +31,7 @@
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)
3337
public 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

Comments
 (0)