Skip to content

Commit cb3745f

Browse files
committed
Restore configuration property for http requests names when using WebFlux
Closes gh-39083
1 parent 6f4a8cc commit cb3745f

File tree

2 files changed

+47
-5
lines changed

2 files changed

+47
-5
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/observation/web/reactive/WebFluxObservationAutoConfiguration.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 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.
@@ -30,10 +30,13 @@
3030
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3131
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3232
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
33+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3334
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
3435
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3536
import org.springframework.context.annotation.Bean;
3637
import org.springframework.core.annotation.Order;
38+
import org.springframework.http.server.reactive.observation.DefaultServerRequestObservationConvention;
39+
import org.springframework.http.server.reactive.observation.ServerRequestObservationConvention;
3740

3841
/**
3942
* {@link EnableAutoConfiguration Auto-configuration} for instrumentation of Spring
@@ -42,6 +45,7 @@
4245
* @author Brian Clozel
4346
* @author Jon Schneider
4447
* @author Dmytro Nosan
48+
* @author Moritz Halbritter
4549
* @since 3.0.0
4650
*/
4751
@AutoConfiguration(after = { SimpleMetricsExportAutoConfiguration.class, ObservationAutoConfiguration.class })
@@ -51,15 +55,27 @@
5155
@EnableConfigurationProperties({ MetricsProperties.class, ObservationProperties.class })
5256
public class WebFluxObservationAutoConfiguration {
5357

58+
private final ObservationProperties observationProperties;
59+
60+
WebFluxObservationAutoConfiguration(ObservationProperties observationProperties) {
61+
this.observationProperties = observationProperties;
62+
}
63+
5464
@Bean
5565
@Order(0)
56-
MeterFilter metricsHttpServerUriTagFilter(MetricsProperties metricsProperties,
57-
ObservationProperties observationProperties) {
58-
String name = observationProperties.getHttp().getServer().getRequests().getName();
66+
MeterFilter metricsHttpServerUriTagFilter(MetricsProperties metricsProperties) {
67+
String name = this.observationProperties.getHttp().getServer().getRequests().getName();
5968
MeterFilter filter = new OnlyOnceLoggingDenyMeterFilter(
6069
() -> "Reached the maximum number of URI tags for '%s'.".formatted(name));
6170
return MeterFilter.maximumAllowableTags(name, "uri", metricsProperties.getWeb().getServer().getMaxUriTags(),
6271
filter);
6372
}
6473

74+
@Bean
75+
@ConditionalOnMissingBean(ServerRequestObservationConvention.class)
76+
DefaultServerRequestObservationConvention defaultServerRequestObservationConvention() {
77+
return new DefaultServerRequestObservationConvention(
78+
this.observationProperties.getHttp().getServer().getRequests().getName());
79+
}
80+
6581
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/web/reactive/WebFluxObservationAutoConfigurationTests.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 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.
@@ -33,15 +33,19 @@
3333
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
3434
import org.springframework.boot.test.system.CapturedOutput;
3535
import org.springframework.boot.test.system.OutputCaptureExtension;
36+
import org.springframework.http.server.reactive.observation.DefaultServerRequestObservationConvention;
37+
import org.springframework.http.server.reactive.observation.ServerRequestObservationConvention;
3638

3739
import static org.assertj.core.api.Assertions.assertThat;
40+
import static org.mockito.Mockito.mock;
3841

3942
/**
4043
* Tests for {@link WebFluxObservationAutoConfiguration}
4144
*
4245
* @author Brian Clozel
4346
* @author Dmytro Nosan
4447
* @author Madhura Bhave
48+
* @author Moritz Halbritter
4549
*/
4650
@ExtendWith(OutputCaptureExtension.class)
4751
class WebFluxObservationAutoConfigurationTests {
@@ -91,6 +95,28 @@ void shouldNotDenyNorLogIfMaxUrisIsNotReached(CapturedOutput output) {
9195
});
9296
}
9397

98+
@Test
99+
void shouldSupplyDefaultServerRequestObservationConvention() {
100+
this.contextRunner.withPropertyValues("management.observations.http.server.requests.name=some-other-name")
101+
.run((context) -> {
102+
assertThat(context).hasSingleBean(DefaultServerRequestObservationConvention.class);
103+
DefaultServerRequestObservationConvention bean = context
104+
.getBean(DefaultServerRequestObservationConvention.class);
105+
assertThat(bean.getName()).isEqualTo("some-other-name");
106+
});
107+
}
108+
109+
@Test
110+
void shouldBackOffOnCustomServerRequestObservationConvention() {
111+
this.contextRunner
112+
.withBean("customServerRequestObservationConvention", ServerRequestObservationConvention.class,
113+
() -> mock(ServerRequestObservationConvention.class))
114+
.run((context) -> {
115+
assertThat(context).hasBean("customServerRequestObservationConvention");
116+
assertThat(context).hasSingleBean(ServerRequestObservationConvention.class);
117+
});
118+
}
119+
94120
private MeterRegistry getInitializedMeterRegistry(AssertableReactiveWebApplicationContext context) {
95121
return getInitializedMeterRegistry(context, "http.server.requests");
96122
}

0 commit comments

Comments
 (0)