Move WebFlux observation auto-config into spring-boot-webflux

Issue: 46138
This commit is contained in:
Andy Wilkinson 2025-05-30 10:03:37 +01:00 committed by Phillip Webb
parent 54991f4212
commit 791fd90359
8 changed files with 39 additions and 12 deletions

View File

@ -16,7 +16,6 @@ org.springframework.boot.actuate.autoconfigure.management.ThreadDumpEndpointAuto
org.springframework.boot.actuate.autoconfigure.metrics.data.RepositoryMetricsAutoConfiguration org.springframework.boot.actuate.autoconfigure.metrics.data.RepositoryMetricsAutoConfiguration
org.springframework.boot.actuate.autoconfigure.metrics.task.TaskExecutorMetricsAutoConfiguration org.springframework.boot.actuate.autoconfigure.metrics.task.TaskExecutorMetricsAutoConfiguration
org.springframework.boot.actuate.autoconfigure.observability.ObservabilityAutoConfiguration org.springframework.boot.actuate.autoconfigure.observability.ObservabilityAutoConfiguration
org.springframework.boot.actuate.autoconfigure.observation.web.reactive.WebFluxObservationAutoConfiguration
org.springframework.boot.actuate.autoconfigure.observation.web.servlet.WebMvcObservationAutoConfiguration org.springframework.boot.actuate.autoconfigure.observation.web.servlet.WebMvcObservationAutoConfiguration
org.springframework.boot.actuate.autoconfigure.sbom.SbomEndpointAutoConfiguration org.springframework.boot.actuate.autoconfigure.sbom.SbomEndpointAutoConfiguration
org.springframework.boot.actuate.autoconfigure.scheduling.ScheduledTasksEndpointAutoConfiguration org.springframework.boot.actuate.autoconfigure.scheduling.ScheduledTasksEndpointAutoConfiguration

View File

@ -35,7 +35,6 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.observability.ObservabilityAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.observability.ObservabilityAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.observation.web.reactive.WebFluxObservationAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.observation.web.servlet.WebMvcObservationAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.observation.web.servlet.WebMvcObservationAutoConfiguration;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.http.converter.autoconfigure.HttpMessageConvertersAutoConfiguration; import org.springframework.boot.http.converter.autoconfigure.HttpMessageConvertersAutoConfiguration;
@ -55,6 +54,7 @@ import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.tomcat.autoconfigure.servlet.TomcatServletWebServerAutoConfiguration; import org.springframework.boot.tomcat.autoconfigure.servlet.TomcatServletWebServerAutoConfiguration;
import org.springframework.boot.web.server.test.client.TestRestTemplate; import org.springframework.boot.web.server.test.client.TestRestTemplate;
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.webflux.observation.autoconfigure.WebFluxObservationAutoConfiguration;
import org.springframework.boot.webmvc.autoconfigure.DispatcherServletAutoConfiguration; import org.springframework.boot.webmvc.autoconfigure.DispatcherServletAutoConfiguration;
import org.springframework.boot.webmvc.autoconfigure.WebMvcAutoConfiguration; import org.springframework.boot.webmvc.autoconfigure.WebMvcAutoConfiguration;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;

View File

@ -35,6 +35,8 @@ dependencies {
optional(project(":spring-boot-project:spring-boot-actuator")) optional(project(":spring-boot-project:spring-boot-actuator"))
optional(project(":spring-boot-project:spring-boot-autoconfigure")) optional(project(":spring-boot-project:spring-boot-autoconfigure"))
optional(project(":spring-boot-project:spring-boot-metrics"))
optional(project(":spring-boot-project:spring-boot-micrometer-observation"))
optional(project(":spring-boot-project:spring-boot-validation")) optional(project(":spring-boot-project:spring-boot-validation"))
testFixturesApi(testFixtures(project(":spring-boot-project:spring-boot-actuator"))) testFixturesApi(testFixtures(project(":spring-boot-project:spring-boot-actuator")))

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.boot.actuate.autoconfigure.observation.web.reactive; package org.springframework.boot.webflux.observation.autoconfigure;
import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.config.MeterFilter; import io.micrometer.core.instrument.config.MeterFilter;
@ -30,8 +30,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplicat
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.metrics.OnlyOnceLoggingDenyMeterFilter; import org.springframework.boot.metrics.OnlyOnceLoggingDenyMeterFilter;
import org.springframework.boot.metrics.autoconfigure.MetricsProperties; import org.springframework.boot.metrics.autoconfigure.MetricsProperties;
import org.springframework.boot.metrics.autoconfigure.export.simple.SimpleMetricsExportAutoConfiguration;
import org.springframework.boot.micrometer.observation.autoconfigure.ObservationAutoConfiguration;
import org.springframework.boot.micrometer.observation.autoconfigure.ObservationProperties; import org.springframework.boot.micrometer.observation.autoconfigure.ObservationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
@ -46,9 +44,11 @@ import org.springframework.http.server.reactive.observation.ServerRequestObserva
* @author Jon Schneider * @author Jon Schneider
* @author Dmytro Nosan * @author Dmytro Nosan
* @author Moritz Halbritter * @author Moritz Halbritter
* @since 3.0.0 * @since 4.0.0
*/ */
@AutoConfiguration(after = { SimpleMetricsExportAutoConfiguration.class, ObservationAutoConfiguration.class }) @AutoConfiguration(afterName = {
"org.springframework.boot.metrics.autoconfigure.export.simple.SimpleMetricsExportAutoConfiguration",
"org.springframework.boot.micrometer.observation.autoconfigure.ObservationAutoConfiguration" })
@ConditionalOnClass({ Observation.class, MeterRegistry.class }) @ConditionalOnClass({ Observation.class, MeterRegistry.class })
@ConditionalOnBean({ ObservationRegistry.class, MeterRegistry.class }) @ConditionalOnBean({ ObservationRegistry.class, MeterRegistry.class })
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE) @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)

View File

@ -17,4 +17,4 @@
/** /**
* Auto-configuration for WebFlux actuator observations. * Auto-configuration for WebFlux actuator observations.
*/ */
package org.springframework.boot.actuate.autoconfigure.observation.web.reactive; package org.springframework.boot.webflux.observation.autoconfigure;

View File

@ -3,3 +3,4 @@ org.springframework.boot.webflux.autoconfigure.ReactiveMultipartAutoConfiguratio
org.springframework.boot.webflux.autoconfigure.WebFluxAutoConfiguration org.springframework.boot.webflux.autoconfigure.WebFluxAutoConfiguration
org.springframework.boot.webflux.autoconfigure.WebSessionIdResolverAutoConfiguration org.springframework.boot.webflux.autoconfigure.WebSessionIdResolverAutoConfiguration
org.springframework.boot.webflux.autoconfigure.error.ErrorWebFluxAutoConfiguration org.springframework.boot.webflux.autoconfigure.error.ErrorWebFluxAutoConfiguration
org.springframework.boot.webflux.observation.autoconfigure.WebFluxObservationAutoConfiguration

View File

@ -14,17 +14,16 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.boot.actuate.autoconfigure.observation.web.reactive; package org.springframework.boot.webflux.observation.autoconfigure;
import java.time.Duration; import java.time.Duration;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
import org.springframework.boot.actuate.autoconfigure.metrics.web.TestController;
import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.metrics.autoconfigure.MetricsAutoConfiguration; import org.springframework.boot.metrics.autoconfigure.MetricsAutoConfiguration;
import org.springframework.boot.micrometer.observation.autoconfigure.ObservationAutoConfiguration; import org.springframework.boot.micrometer.observation.autoconfigure.ObservationAutoConfiguration;
@ -35,6 +34,8 @@ import org.springframework.boot.test.system.OutputCaptureExtension;
import org.springframework.boot.webflux.autoconfigure.WebFluxAutoConfiguration; import org.springframework.boot.webflux.autoconfigure.WebFluxAutoConfiguration;
import org.springframework.http.server.reactive.observation.DefaultServerRequestObservationConvention; import org.springframework.http.server.reactive.observation.DefaultServerRequestObservationConvention;
import org.springframework.http.server.reactive.observation.ServerRequestObservationConvention; import org.springframework.http.server.reactive.observation.ServerRequestObservationConvention;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@ -51,7 +52,7 @@ import static org.mockito.Mockito.mock;
class WebFluxObservationAutoConfigurationTests { class WebFluxObservationAutoConfigurationTests {
private final ReactiveWebApplicationContextRunner contextRunner = new ReactiveWebApplicationContextRunner() private final ReactiveWebApplicationContextRunner contextRunner = new ReactiveWebApplicationContextRunner()
.with(MetricsRun.simple()) .withBean(SimpleMeterRegistry.class)
.withConfiguration( .withConfiguration(
AutoConfigurations.of(ObservationAutoConfiguration.class, WebFluxObservationAutoConfiguration.class)); AutoConfigurations.of(ObservationAutoConfiguration.class, WebFluxObservationAutoConfiguration.class));
@ -130,4 +131,24 @@ class WebFluxObservationAutoConfigurationTests {
return meterRegistry; return meterRegistry;
} }
@RestController
static class TestController {
@GetMapping("test0")
String test0() {
return "test0";
}
@GetMapping("test1")
String test1() {
return "test1";
}
@GetMapping("test2")
String test2() {
return "test2";
}
}
} }

View File

@ -61,6 +61,10 @@
<allow pkg="io.micrometer" /> <allow pkg="io.micrometer" />
</subpackage> </subpackage>
<subpackage name=".*\.observation" regex="true">
<allow pkg="io.micrometer" />
</subpackage>
<subpackage name="[^.]+\.actuate" regex="true"> <subpackage name="[^.]+\.actuate" regex="true">
<subpackage name="endpoint"> <subpackage name="endpoint">
<file name=".*Endpoint(WebExtension)?" regex="true"> <file name=".*Endpoint(WebExtension)?" regex="true">