Ignore trailing slash when recording Web metrics

Fixes gh-18207
This commit is contained in:
Madhura Bhave
2020-01-13 13:31:16 -08:00
parent 8edffc8ed7
commit e60194c7d5
11 changed files with 139 additions and 10 deletions

View File

@@ -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;
}
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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) -> {