Skip to content

Commit 97c44d1

Browse files
committed
Merge pull request #45204 from shakuzen
* pr/45204: Polish 'Auto-configure OtlpMetricsSender if available' Auto-configure OtlpMetricsSender if available Closes gh-45204
2 parents 752842a + 15c54b4 commit 97c44d1

File tree

3 files changed

+56
-7
lines changed

3 files changed

+56
-7
lines changed

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

+17-6
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,9 @@
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.OtlpMetricsSender;
2223

24+
import org.springframework.beans.factory.ObjectProvider;
2325
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
2426
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
2527
import org.springframework.boot.actuate.autoconfigure.metrics.export.ConditionalOnEnabledMetricsExport;
@@ -76,16 +78,25 @@ OtlpConfig otlpConfig(OpenTelemetryProperties openTelemetryProperties,
7678
@Bean
7779
@ConditionalOnMissingBean
7880
@ConditionalOnThreading(Threading.PLATFORM)
79-
public OtlpMeterRegistry otlpMeterRegistry(OtlpConfig otlpConfig, Clock clock) {
80-
return new OtlpMeterRegistry(otlpConfig, clock);
81+
public OtlpMeterRegistry otlpMeterRegistry(OtlpConfig otlpConfig, Clock clock,
82+
ObjectProvider<OtlpMetricsSender> metricsSender) {
83+
return builder(otlpConfig, clock, metricsSender).build();
8184
}
8285

8386
@Bean
8487
@ConditionalOnMissingBean
8588
@ConditionalOnThreading(Threading.VIRTUAL)
86-
public OtlpMeterRegistry otlpMeterRegistryVirtualThreads(OtlpConfig otlpConfig, Clock clock) {
87-
VirtualThreadTaskExecutor taskExecutor = new VirtualThreadTaskExecutor("otlp-meter-registry-");
88-
return new OtlpMeterRegistry(otlpConfig, clock, taskExecutor.getVirtualThreadFactory());
89+
public OtlpMeterRegistry otlpMeterRegistryVirtualThreads(OtlpConfig otlpConfig, Clock clock,
90+
ObjectProvider<OtlpMetricsSender> metricsSender) {
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);
98+
metricsSender.ifAvailable(builder::metricsSender);
99+
return builder;
89100
}
90101

91102
/**

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

+37-1
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.
@@ -21,12 +21,14 @@
2121
import io.micrometer.core.instrument.Clock;
2222
import io.micrometer.registry.otlp.OtlpConfig;
2323
import io.micrometer.registry.otlp.OtlpMeterRegistry;
24+
import io.micrometer.registry.otlp.OtlpMetricsSender;
2425
import org.junit.jupiter.api.Test;
2526
import org.junit.jupiter.api.condition.EnabledForJreRange;
2627
import org.junit.jupiter.api.condition.JRE;
2728

2829
import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration.PropertiesOtlpMetricsConnectionDetails;
2930
import org.springframework.boot.autoconfigure.AutoConfigurations;
31+
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
3032
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3133
import org.springframework.boot.testsupport.assertj.ScheduledExecutorServiceAssert;
3234
import org.springframework.context.annotation.Bean;
@@ -132,6 +134,27 @@ void testConnectionFactoryWithOverridesWhenUsingCustomConnectionDetails() {
132134
});
133135
}
134136

137+
@Test
138+
void allowsCustomMetricsSenderToBeUsed() {
139+
this.contextRunner.withUserConfiguration(BaseConfiguration.class, CustomMetricsSenderConfiguration.class)
140+
.run(this::assertHasCustomMetricsSender);
141+
}
142+
143+
@Test
144+
@EnabledForJreRange(min = JRE.JAVA_21)
145+
void allowsCustomMetricsSenderToBeUsedWithVirtualThreads() {
146+
this.contextRunner.withUserConfiguration(BaseConfiguration.class, CustomMetricsSenderConfiguration.class)
147+
.withPropertyValues("spring.threads.virtual.enabled=true")
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));
156+
}
157+
135158
@Configuration(proxyBeanMethods = false)
136159
static class BaseConfiguration {
137160

@@ -174,4 +197,17 @@ OtlpMetricsConnectionDetails otlpConnectionDetails() {
174197

175198
}
176199

200+
@Configuration(proxyBeanMethods = false)
201+
static class CustomMetricsSenderConfiguration {
202+
203+
static OtlpMetricsSender customMetricsSender = (request) -> {
204+
};
205+
206+
@Bean
207+
OtlpMetricsSender customMetricsSender() {
208+
return customMetricsSender;
209+
}
210+
211+
}
212+
177213
}

Diff for: spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/metrics.adoc

+2
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,8 @@ management:
522522

523523
Custom headers, for example for authentication, can also be provided using configprop:management.otlp.metrics.export.headers.*[] properties.
524524

525+
If an `OtlpMetricsSender` bean is available, it will be configured on the `OtlpMeterRegistry` that Spring Boot auto-configures.
526+
525527

526528

527529
[[actuator.metrics.export.prometheus]]

0 commit comments

Comments
 (0)