From a57d0f08536169778fe06824a4ba165ca8abb6c5 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 17 Jul 2018 19:14:17 +0100 Subject: [PATCH] Reinstate order of WebMvcMetricsFilter Closes gh-13781 --- .../WebMvcMetricsAutoConfiguration.java | 2 + .../WebMvcMetricsAutoConfigurationTests.java | 131 ++++++++++++++++++ .../web/servlet/WebMvcMetricsFilter.java | 3 - 3 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/web/servlet/WebMvcMetricsAutoConfigurationTests.java diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.java index 2b73965916..566307f263 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.java @@ -37,6 +37,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties 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.web.context.WebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; @@ -72,6 +73,7 @@ public class WebMvcMetricsAutoConfiguration { serverProperties.isAutoTimeRequests()); FilterRegistrationBean registration = new FilterRegistrationBean<>( filter); + registration.setOrder(Ordered.HIGHEST_PRECEDENCE + 1); registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC); return registration; } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/web/servlet/WebMvcMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/web/servlet/WebMvcMetricsAutoConfigurationTests.java new file mode 100644 index 0000000000..671ddbf51b --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/web/servlet/WebMvcMetricsAutoConfigurationTests.java @@ -0,0 +1,131 @@ +/* + * Copyright 2012-2018 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.autoconfigure.web.servlet; + +import java.util.Collections; +import java.util.EnumSet; + +import javax.servlet.DispatcherType; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Tag; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import org.junit.Test; + +import org.springframework.boot.actuate.autoconfigure.metrics.web.servlet.WebMvcMetricsAutoConfiguration; +import org.springframework.boot.actuate.metrics.web.servlet.DefaultWebMvcTagsProvider; +import org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter; +import org.springframework.boot.actuate.metrics.web.servlet.WebMvcTagsProvider; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.WebApplicationContextRunner; +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 static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link WebMvcMetricsAutoConfiguration}. + * + * @author Andy Wilkinson + */ +public class WebMvcMetricsAutoConfigurationTests { + + private WebApplicationContextRunner contextRunner = new WebApplicationContextRunner() + .withConfiguration( + AutoConfigurations.of(WebMvcMetricsAutoConfiguration.class)); + + @Test + public void backsOffWhenMeterRegistryIsMissing() { + this.contextRunner.run((context) -> assertThat(context) + .doesNotHaveBean(WebMvcMetricsAutoConfiguration.class)); + } + + @Test + public void definesTagsProviderAndFilterWhenMeterRegistryIsPresent() { + this.contextRunner.withUserConfiguration(MeterRegistryConfiguration.class) + .run((context) -> { + assertThat(context).hasSingleBean(DefaultWebMvcTagsProvider.class); + assertThat(context).hasSingleBean(FilterRegistrationBean.class); + assertThat(context.getBean(FilterRegistrationBean.class).getFilter()) + .isInstanceOf(WebMvcMetricsFilter.class); + }); + } + + @Test + public void tagsProviderBacksOff() { + this.contextRunner.withUserConfiguration(MeterRegistryConfiguration.class, + TagsProviderConfiguration.class).run((context) -> { + assertThat(context).doesNotHaveBean(DefaultWebMvcTagsProvider.class); + assertThat(context).hasSingleBean(TestWebMvcTagsProvider.class); + }); + } + + @Test + public void filterRegistrationHasExpectedDispatcherTypesAndOrder() { + this.contextRunner.withUserConfiguration(MeterRegistryConfiguration.class) + .run((context) -> { + FilterRegistrationBean registration = context + .getBean(FilterRegistrationBean.class); + assertThat(registration).hasFieldOrPropertyWithValue( + "dispatcherTypes", + EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC)); + assertThat(registration.getOrder()) + .isEqualTo(Ordered.HIGHEST_PRECEDENCE + 1); + }); + } + + @Configuration + static class MeterRegistryConfiguration { + + @Bean + public MeterRegistry meterRegistry() { + return new SimpleMeterRegistry(); + } + + } + + @Configuration + static class TagsProviderConfiguration { + + @Bean + public TestWebMvcTagsProvider tagsProvider() { + return new TestWebMvcTagsProvider(); + } + + } + + private static final class TestWebMvcTagsProvider implements WebMvcTagsProvider { + + @Override + public Iterable getTags(HttpServletRequest request, + HttpServletResponse response, Object handler, Throwable exception) { + return Collections.emptyList(); + } + + @Override + public Iterable getLongRequestTags(HttpServletRequest request, + Object handler) { + return Collections.emptyList(); + } + + } + +} diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilter.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilter.java index 033b7cbd1d..47ce2ca18f 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilter.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilter.java @@ -42,9 +42,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; -import org.springframework.core.Ordered; import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.method.HandlerMethod; @@ -63,7 +61,6 @@ import org.springframework.web.util.NestedServletException; * @author Phillip Webb * @since 2.0.0 */ -@Order(Ordered.HIGHEST_PRECEDENCE + 1) public class WebMvcMetricsFilter extends OncePerRequestFilter { private static final Logger logger = LoggerFactory