Ignore trailing slash when recording Web metrics
Fixes gh-18207
This commit is contained in:
@@ -243,6 +243,11 @@ public class MetricsProperties {
|
||||
*/
|
||||
private String metricName = "http.server.requests";
|
||||
|
||||
/**
|
||||
* Whether the trailing slash should be ignored when recording metrics.
|
||||
*/
|
||||
private boolean ignoreTrailingSlash = true;
|
||||
|
||||
/**
|
||||
* Auto-timed request settings.
|
||||
*/
|
||||
@@ -261,6 +266,14 @@ public class MetricsProperties {
|
||||
this.metricName = metricName;
|
||||
}
|
||||
|
||||
public boolean isIgnoreTrailingSlash() {
|
||||
return this.ignoreTrailingSlash;
|
||||
}
|
||||
|
||||
public void setIgnoreTrailingSlash(boolean ignoreTrailingSlash) {
|
||||
this.ignoreTrailingSlash = ignoreTrailingSlash;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -59,7 +59,8 @@ public class WebFluxMetricsAutoConfiguration {
|
||||
@Bean
|
||||
@ConditionalOnMissingBean(WebFluxTagsProvider.class)
|
||||
public DefaultWebFluxTagsProvider webfluxTagConfigurer() {
|
||||
return new DefaultWebFluxTagsProvider();
|
||||
return new DefaultWebFluxTagsProvider(
|
||||
this.properties.getWeb().getServer().getRequest().isIgnoreTrailingSlash());
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -71,7 +71,7 @@ public class WebMvcMetricsAutoConfiguration {
|
||||
@Bean
|
||||
@ConditionalOnMissingBean(WebMvcTagsProvider.class)
|
||||
public DefaultWebMvcTagsProvider webMvcTagsProvider() {
|
||||
return new DefaultWebMvcTagsProvider();
|
||||
return new DefaultWebMvcTagsProvider(this.properties.getWeb().getServer().getRequest().isIgnoreTrailingSlash());
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -33,6 +33,7 @@ import org.springframework.boot.test.system.CapturedOutput;
|
||||
import org.springframework.boot.test.system.OutputCaptureExtension;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
import org.springframework.test.web.reactive.server.WebTestClient;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
@@ -43,6 +44,7 @@ import static org.mockito.Mockito.mock;
|
||||
*
|
||||
* @author Brian Clozel
|
||||
* @author Dmytro Nosan
|
||||
* @author Madhura Bhave
|
||||
*/
|
||||
@ExtendWith(OutputCaptureExtension.class)
|
||||
class WebFluxMetricsAutoConfigurationTests {
|
||||
@@ -55,9 +57,21 @@ class WebFluxMetricsAutoConfigurationTests {
|
||||
this.contextRunner.run((context) -> {
|
||||
assertThat(context).getBeans(MetricsWebFilter.class).hasSize(1);
|
||||
assertThat(context).getBeans(DefaultWebFluxTagsProvider.class).hasSize(1);
|
||||
assertThat(ReflectionTestUtils.getField(context.getBean(DefaultWebFluxTagsProvider.class),
|
||||
"ignoreTrailingSlash")).isEqualTo(true);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void tagsProviderWhenIgnoreTrailingSlashIsFalse() {
|
||||
this.contextRunner.withPropertyValues("management.metrics.web.server.request.ignore-trailing-slash=false")
|
||||
.run((context) -> {
|
||||
assertThat(context).hasSingleBean(DefaultWebFluxTagsProvider.class);
|
||||
assertThat(ReflectionTestUtils.getField(context.getBean(DefaultWebFluxTagsProvider.class),
|
||||
"ignoreTrailingSlash")).isEqualTo(false);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void shouldNotOverrideCustomTagsProvider() {
|
||||
this.contextRunner.withUserConfiguration(CustomWebFluxTagsProviderConfig.class)
|
||||
|
||||
@@ -48,6 +48,7 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
import org.springframework.test.web.servlet.MockMvc;
|
||||
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
@@ -62,6 +63,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
|
||||
* @author Andy Wilkinson
|
||||
* @author Dmytro Nosan
|
||||
* @author Tadaya Tsuyukubo
|
||||
* @author Madhura Bhave
|
||||
*/
|
||||
@ExtendWith(OutputCaptureExtension.class)
|
||||
class WebMvcMetricsAutoConfigurationTests {
|
||||
@@ -79,12 +81,24 @@ class WebMvcMetricsAutoConfigurationTests {
|
||||
void definesTagsProviderAndFilterWhenMeterRegistryIsPresent() {
|
||||
this.contextRunner.run((context) -> {
|
||||
assertThat(context).hasSingleBean(DefaultWebMvcTagsProvider.class);
|
||||
assertThat(ReflectionTestUtils.getField(context.getBean(DefaultWebMvcTagsProvider.class),
|
||||
"ignoreTrailingSlash")).isEqualTo(true);
|
||||
assertThat(context).hasSingleBean(FilterRegistrationBean.class);
|
||||
assertThat(context.getBean(FilterRegistrationBean.class).getFilter())
|
||||
.isInstanceOf(WebMvcMetricsFilter.class);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void tagsProviderWhenIgnoreTrailingSlashIsFalse() {
|
||||
this.contextRunner.withPropertyValues("management.metrics.web.server.request.ignore-trailing-slash=false")
|
||||
.run((context) -> {
|
||||
assertThat(context).hasSingleBean(DefaultWebMvcTagsProvider.class);
|
||||
assertThat(ReflectionTestUtils.getField(context.getBean(DefaultWebMvcTagsProvider.class),
|
||||
"ignoreTrailingSlash")).isEqualTo(false);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void tagsProviderBacksOff() {
|
||||
this.contextRunner.withUserConfiguration(TagsProviderConfiguration.class).run((context) -> {
|
||||
|
||||
Reference in New Issue
Block a user