Skip to content

Commit 15c54b4

Browse files
committed
Polish 'Auto-configure OtlpMetricsSender if available'
Update `OtlpMetricsExportAutoConfiguration` to use the new `OtlpMetricsSender`interface that allows users to customize the sending of OTLP metrics using the `OtlpMeterRegistry`. See gh-45204
1 parent 776d233 commit 15c54b4

File tree

2 files changed

+21
-25
lines changed

2 files changed

+21
-25
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfiguration.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2024 the original author or authors.
2+
* Copyright 2012-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,7 +19,6 @@
1919
import io.micrometer.core.instrument.Clock;
2020
import io.micrometer.registry.otlp.OtlpConfig;
2121
import io.micrometer.registry.otlp.OtlpMeterRegistry;
22-
import io.micrometer.registry.otlp.OtlpMeterRegistry.Builder;
2322
import io.micrometer.registry.otlp.OtlpMetricsSender;
2423

2524
import org.springframework.beans.factory.ObjectProvider;
@@ -81,22 +80,23 @@ OtlpConfig otlpConfig(OpenTelemetryProperties openTelemetryProperties,
8180
@ConditionalOnThreading(Threading.PLATFORM)
8281
public OtlpMeterRegistry otlpMeterRegistry(OtlpConfig otlpConfig, Clock clock,
8382
ObjectProvider<OtlpMetricsSender> metricsSender) {
84-
Builder builder = OtlpMeterRegistry.builder(otlpConfig).clock(clock);
85-
metricsSender.ifAvailable(builder::metricsSender);
86-
return builder.build();
83+
return builder(otlpConfig, clock, metricsSender).build();
8784
}
8885

8986
@Bean
9087
@ConditionalOnMissingBean
9188
@ConditionalOnThreading(Threading.VIRTUAL)
9289
public OtlpMeterRegistry otlpMeterRegistryVirtualThreads(OtlpConfig otlpConfig, Clock clock,
9390
ObjectProvider<OtlpMetricsSender> metricsSender) {
94-
VirtualThreadTaskExecutor taskExecutor = new VirtualThreadTaskExecutor("otlp-meter-registry-");
95-
Builder builder = OtlpMeterRegistry.builder(otlpConfig)
96-
.clock(clock)
97-
.threadFactory(taskExecutor.getVirtualThreadFactory());
91+
VirtualThreadTaskExecutor executor = new VirtualThreadTaskExecutor("otlp-meter-registry-");
92+
return builder(otlpConfig, clock, metricsSender).threadFactory(executor.getVirtualThreadFactory()).build();
93+
}
94+
95+
private OtlpMeterRegistry.Builder builder(OtlpConfig otlpConfig, Clock clock,
96+
ObjectProvider<OtlpMetricsSender> metricsSender) {
97+
OtlpMeterRegistry.Builder builder = OtlpMeterRegistry.builder(otlpConfig).clock(clock);
9898
metricsSender.ifAvailable(builder::metricsSender);
99-
return builder.build();
99+
return builder;
100100
}
101101

102102
/**

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfigurationTests.java

+11-15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2024 the original author or authors.
2+
* Copyright 2012-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@
2828

2929
import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration.PropertiesOtlpMetricsConnectionDetails;
3030
import org.springframework.boot.autoconfigure.AutoConfigurations;
31+
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
3132
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3233
import org.springframework.boot.testsupport.assertj.ScheduledExecutorServiceAssert;
3334
import org.springframework.context.annotation.Bean;
@@ -136,27 +137,22 @@ void testConnectionFactoryWithOverridesWhenUsingCustomConnectionDetails() {
136137
@Test
137138
void allowsCustomMetricsSenderToBeUsed() {
138139
this.contextRunner.withUserConfiguration(BaseConfiguration.class, CustomMetricsSenderConfiguration.class)
139-
.run((context) -> {
140-
assertThat(context).hasSingleBean(OtlpMeterRegistry.class);
141-
OtlpMeterRegistry registry = context.getBean(OtlpMeterRegistry.class);
142-
assertThat(registry).extracting("metricsSender")
143-
.satisfies((sender) -> assertThat(sender)
144-
.isSameAs(CustomMetricsSenderConfiguration.customMetricsSender));
145-
});
140+
.run(this::assertHasCustomMetricsSender);
146141
}
147142

148143
@Test
149144
@EnabledForJreRange(min = JRE.JAVA_21)
150145
void allowsCustomMetricsSenderToBeUsedWithVirtualThreads() {
151146
this.contextRunner.withUserConfiguration(BaseConfiguration.class, CustomMetricsSenderConfiguration.class)
152147
.withPropertyValues("spring.threads.virtual.enabled=true")
153-
.run((context) -> {
154-
assertThat(context).hasSingleBean(OtlpMeterRegistry.class);
155-
OtlpMeterRegistry registry = context.getBean(OtlpMeterRegistry.class);
156-
assertThat(registry).extracting("metricsSender")
157-
.satisfies((sender) -> assertThat(sender)
158-
.isSameAs(CustomMetricsSenderConfiguration.customMetricsSender));
159-
});
148+
.run(this::assertHasCustomMetricsSender);
149+
}
150+
151+
private void assertHasCustomMetricsSender(AssertableApplicationContext context) {
152+
assertThat(context).hasSingleBean(OtlpMeterRegistry.class);
153+
OtlpMeterRegistry registry = context.getBean(OtlpMeterRegistry.class);
154+
assertThat(registry).extracting("metricsSender")
155+
.satisfies((sender) -> assertThat(sender).isSameAs(CustomMetricsSenderConfiguration.customMetricsSender));
160156
}
161157

162158
@Configuration(proxyBeanMethods = false)

0 commit comments

Comments
 (0)