Restore configuration property for http requests names when using WebFlux

Closes gh-39083
This commit is contained in:
Moritz Halbritter 2024-01-11 16:15:42 +01:00
parent a5d3fb588b
commit a424ba2055
2 changed files with 47 additions and 5 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2012-2023 the original author or authors.
* Copyright 2012-2024 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.
@ -30,10 +30,13 @@ import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order;
import org.springframework.http.server.reactive.observation.DefaultServerRequestObservationConvention;
import org.springframework.http.server.reactive.observation.ServerRequestObservationConvention;
/**
* {@link EnableAutoConfiguration Auto-configuration} for instrumentation of Spring
@ -42,6 +45,7 @@ import org.springframework.core.annotation.Order;
* @author Brian Clozel
* @author Jon Schneider
* @author Dmytro Nosan
* @author Moritz Halbritter
* @since 3.0.0
*/
@AutoConfiguration(after = { SimpleMetricsExportAutoConfiguration.class, ObservationAutoConfiguration.class })
@ -51,15 +55,27 @@ import org.springframework.core.annotation.Order;
@EnableConfigurationProperties({ MetricsProperties.class, ObservationProperties.class })
public class WebFluxObservationAutoConfiguration {
private final ObservationProperties observationProperties;
WebFluxObservationAutoConfiguration(ObservationProperties observationProperties) {
this.observationProperties = observationProperties;
}
@Bean
@Order(0)
MeterFilter metricsHttpServerUriTagFilter(MetricsProperties metricsProperties,
ObservationProperties observationProperties) {
String name = observationProperties.getHttp().getServer().getRequests().getName();
MeterFilter metricsHttpServerUriTagFilter(MetricsProperties metricsProperties) {
String name = this.observationProperties.getHttp().getServer().getRequests().getName();
MeterFilter filter = new OnlyOnceLoggingDenyMeterFilter(
() -> "Reached the maximum number of URI tags for '%s'.".formatted(name));
return MeterFilter.maximumAllowableTags(name, "uri", metricsProperties.getWeb().getServer().getMaxUriTags(),
filter);
}
@Bean
@ConditionalOnMissingBean(ServerRequestObservationConvention.class)
DefaultServerRequestObservationConvention defaultServerRequestObservationConvention() {
return new DefaultServerRequestObservationConvention(
this.observationProperties.getHttp().getServer().getRequests().getName());
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2012-2023 the original author or authors.
* Copyright 2012-2024 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.
@ -33,8 +33,11 @@ import org.springframework.boot.test.context.assertj.AssertableReactiveWebApplic
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
import org.springframework.http.server.reactive.observation.DefaultServerRequestObservationConvention;
import org.springframework.http.server.reactive.observation.ServerRequestObservationConvention;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
/**
* Tests for {@link WebFluxObservationAutoConfiguration}
@ -42,6 +45,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* @author Brian Clozel
* @author Dmytro Nosan
* @author Madhura Bhave
* @author Moritz Halbritter
*/
@ExtendWith(OutputCaptureExtension.class)
class WebFluxObservationAutoConfigurationTests {
@ -91,6 +95,28 @@ class WebFluxObservationAutoConfigurationTests {
});
}
@Test
void shouldSupplyDefaultServerRequestObservationConvention() {
this.contextRunner.withPropertyValues("management.observations.http.server.requests.name=some-other-name")
.run((context) -> {
assertThat(context).hasSingleBean(DefaultServerRequestObservationConvention.class);
DefaultServerRequestObservationConvention bean = context
.getBean(DefaultServerRequestObservationConvention.class);
assertThat(bean.getName()).isEqualTo("some-other-name");
});
}
@Test
void shouldBackOffOnCustomServerRequestObservationConvention() {
this.contextRunner
.withBean("customServerRequestObservationConvention", ServerRequestObservationConvention.class,
() -> mock(ServerRequestObservationConvention.class))
.run((context) -> {
assertThat(context).hasBean("customServerRequestObservationConvention");
assertThat(context).hasSingleBean(ServerRequestObservationConvention.class);
});
}
private MeterRegistry getInitializedMeterRegistry(AssertableReactiveWebApplicationContext context) {
return getInitializedMeterRegistry(context, "http.server.requests");
}