diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsConfiguration.java index e2c825a19c5..da4744d80b9 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsConfiguration.java @@ -54,7 +54,7 @@ public class WebMvcMetricsConfiguration { } @Bean - public FilterRegistrationBean webMetricsFilter( + public FilterRegistrationBean webMvcMetricsFilter( MeterRegistry registry, MetricsProperties properties, WebMvcTagsProvider tagsProvider, WebApplicationContext context) { Server serverProperties = properties.getWeb().getServer(); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationIntegrationTests.java index 569c6c01dba..2712edda74f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationIntegrationTests.java @@ -19,14 +19,12 @@ package org.springframework.boot.actuate.autoconfigure.metrics; import java.util.Collections; import java.util.Map; import java.util.Set; -import java.util.concurrent.BrokenBarrierException; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.CyclicBarrier; -import java.util.concurrent.TimeUnit; + +import javax.servlet.DispatcherType; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.MockClock; -import io.micrometer.core.instrument.Timer; import io.micrometer.core.instrument.binder.MeterBinder; import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; import io.micrometer.core.instrument.binder.logging.LogbackMetrics; @@ -36,6 +34,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; @@ -47,6 +46,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -55,6 +55,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -88,9 +89,6 @@ public class MetricsAutoConfigurationIntegrationTests { @Autowired private MeterRegistry registry; - @Autowired - private CyclicBarrier cyclicBarrier; - @SuppressWarnings("unchecked") @Test public void restTemplateIsInstrumented() { @@ -120,19 +118,17 @@ public class MetricsAutoConfigurationIntegrationTests { } @Test - public void asyncRequestMappingIsInstrumented() - throws InterruptedException, BrokenBarrierException { - Thread backgroundRequest = new Thread( - () -> this.loopback.getForObject("/api/async", String.class)); - backgroundRequest.start(); - this.cyclicBarrier.await(); - MockClock.clock(this.registry).addSeconds(2); - this.cyclicBarrier.await(); - backgroundRequest.join(); - Timer timer = this.registry.get("http.server.requests").tags("uri", "/api/async") - .timer(); - assertThat(timer.count()).isEqualTo(1); - assertThat(timer.totalTime(TimeUnit.SECONDS)).isEqualTo(2); + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void metricsFilterRegisteredForAsyncDispatches() { + Map filterRegistrations = this.context + .getBeansOfType(FilterRegistrationBean.class); + assertThat(filterRegistrations).containsKey("webMvcMetricsFilter"); + FilterRegistrationBean registration = filterRegistrations + .get("webMvcMetricsFilter"); + assertThat(registration.getFilter()).isInstanceOf(WebMvcMetricsFilter.class); + assertThat((Set) ReflectionTestUtils.getField(registration, + "dispatcherTypes")).containsExactlyInAnyOrder(DispatcherType.REQUEST, + DispatcherType.ASYNC); } @Configuration @@ -164,34 +160,11 @@ public class MetricsAutoConfigurationIntegrationTests { @RestController static class PersonController { - private final CyclicBarrier cyclicBarrier; - - PersonController(CyclicBarrier cyclicBarrier) { - this.cyclicBarrier = cyclicBarrier; - } - @GetMapping("/api/people") Set personName() { return Collections.singleton("Jon"); } - @GetMapping("/api/async") - CompletableFuture asyncHello() - throws BrokenBarrierException, InterruptedException { - this.cyclicBarrier.await(); - return CompletableFuture.supplyAsync(this::awaitAndHello); - } - - private String awaitAndHello() { - try { - this.cyclicBarrier.await(); - return "async-hello"; - } - catch (InterruptedException | BrokenBarrierException ex) { - throw new RuntimeException(ex); - } - } - } }