Merge pull request #45204 from shakuzen
* pr/45204: Polish 'Auto-configure OtlpMetricsSender if available' Auto-configure OtlpMetricsSender if available Closes gh-45204
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2024 the original author or authors.
|
||||
* Copyright 2012-2025 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -19,7 +19,9 @@ package org.springframework.boot.actuate.autoconfigure.metrics.export.otlp;
|
||||
import io.micrometer.core.instrument.Clock;
|
||||
import io.micrometer.registry.otlp.OtlpConfig;
|
||||
import io.micrometer.registry.otlp.OtlpMeterRegistry;
|
||||
import io.micrometer.registry.otlp.OtlpMetricsSender;
|
||||
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
|
||||
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
|
||||
import org.springframework.boot.actuate.autoconfigure.metrics.export.ConditionalOnEnabledMetricsExport;
|
||||
@@ -76,16 +78,25 @@ public class OtlpMetricsExportAutoConfiguration {
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
@ConditionalOnThreading(Threading.PLATFORM)
|
||||
public OtlpMeterRegistry otlpMeterRegistry(OtlpConfig otlpConfig, Clock clock) {
|
||||
return new OtlpMeterRegistry(otlpConfig, clock);
|
||||
public OtlpMeterRegistry otlpMeterRegistry(OtlpConfig otlpConfig, Clock clock,
|
||||
ObjectProvider<OtlpMetricsSender> metricsSender) {
|
||||
return builder(otlpConfig, clock, metricsSender).build();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
@ConditionalOnThreading(Threading.VIRTUAL)
|
||||
public OtlpMeterRegistry otlpMeterRegistryVirtualThreads(OtlpConfig otlpConfig, Clock clock) {
|
||||
VirtualThreadTaskExecutor taskExecutor = new VirtualThreadTaskExecutor("otlp-meter-registry-");
|
||||
return new OtlpMeterRegistry(otlpConfig, clock, taskExecutor.getVirtualThreadFactory());
|
||||
public OtlpMeterRegistry otlpMeterRegistryVirtualThreads(OtlpConfig otlpConfig, Clock clock,
|
||||
ObjectProvider<OtlpMetricsSender> metricsSender) {
|
||||
VirtualThreadTaskExecutor executor = new VirtualThreadTaskExecutor("otlp-meter-registry-");
|
||||
return builder(otlpConfig, clock, metricsSender).threadFactory(executor.getVirtualThreadFactory()).build();
|
||||
}
|
||||
|
||||
private OtlpMeterRegistry.Builder builder(OtlpConfig otlpConfig, Clock clock,
|
||||
ObjectProvider<OtlpMetricsSender> metricsSender) {
|
||||
OtlpMeterRegistry.Builder builder = OtlpMeterRegistry.builder(otlpConfig).clock(clock);
|
||||
metricsSender.ifAvailable(builder::metricsSender);
|
||||
return builder;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2024 the original author or authors.
|
||||
* Copyright 2012-2025 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -21,12 +21,14 @@ import java.util.concurrent.ScheduledExecutorService;
|
||||
import io.micrometer.core.instrument.Clock;
|
||||
import io.micrometer.registry.otlp.OtlpConfig;
|
||||
import io.micrometer.registry.otlp.OtlpMeterRegistry;
|
||||
import io.micrometer.registry.otlp.OtlpMetricsSender;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.condition.EnabledForJreRange;
|
||||
import org.junit.jupiter.api.condition.JRE;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration.PropertiesOtlpMetricsConnectionDetails;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.boot.testsupport.assertj.ScheduledExecutorServiceAssert;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
@@ -132,6 +134,27 @@ class OtlpMetricsExportAutoConfigurationTests {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void allowsCustomMetricsSenderToBeUsed() {
|
||||
this.contextRunner.withUserConfiguration(BaseConfiguration.class, CustomMetricsSenderConfiguration.class)
|
||||
.run(this::assertHasCustomMetricsSender);
|
||||
}
|
||||
|
||||
@Test
|
||||
@EnabledForJreRange(min = JRE.JAVA_21)
|
||||
void allowsCustomMetricsSenderToBeUsedWithVirtualThreads() {
|
||||
this.contextRunner.withUserConfiguration(BaseConfiguration.class, CustomMetricsSenderConfiguration.class)
|
||||
.withPropertyValues("spring.threads.virtual.enabled=true")
|
||||
.run(this::assertHasCustomMetricsSender);
|
||||
}
|
||||
|
||||
private void assertHasCustomMetricsSender(AssertableApplicationContext context) {
|
||||
assertThat(context).hasSingleBean(OtlpMeterRegistry.class);
|
||||
OtlpMeterRegistry registry = context.getBean(OtlpMeterRegistry.class);
|
||||
assertThat(registry).extracting("metricsSender")
|
||||
.satisfies((sender) -> assertThat(sender).isSameAs(CustomMetricsSenderConfiguration.customMetricsSender));
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class BaseConfiguration {
|
||||
|
||||
@@ -174,4 +197,17 @@ class OtlpMetricsExportAutoConfigurationTests {
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class CustomMetricsSenderConfiguration {
|
||||
|
||||
static OtlpMetricsSender customMetricsSender = (request) -> {
|
||||
};
|
||||
|
||||
@Bean
|
||||
OtlpMetricsSender customMetricsSender() {
|
||||
return customMetricsSender;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -522,6 +522,8 @@ management:
|
||||
|
||||
Custom headers, for example for authentication, can also be provided using configprop:management.otlp.metrics.export.headers.*[] properties.
|
||||
|
||||
If an `OtlpMetricsSender` bean is available, it will be configured on the `OtlpMeterRegistry` that Spring Boot auto-configures.
|
||||
|
||||
|
||||
|
||||
[[actuator.metrics.export.prometheus]]
|
||||
|
||||
Reference in New Issue
Block a user