Browse Source

Simply test for async dispatch metrics filter registration

Previously, the test in MetricsAutoConfigurationIntegrationTests was
testing the functionality of WebMvcMetricsFilter to verify that the
auto-configuration had registered the filter for async dispatches.
This test was complex and covered the same code as a test in
WebMvcMetricsFilterTests.

This commit reworks the test to examine the dispatcher types on the
filter registration directly instead.

Closes gh-11826
pull/11834/head
Andy Wilkinson 8 years ago
parent
commit
9edcd25c25
  1. 2
      spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsConfiguration.java
  2. 59
      spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationIntegrationTests.java

2
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 { @@ -54,7 +54,7 @@ public class WebMvcMetricsConfiguration {
}
@Bean
public FilterRegistrationBean<WebMvcMetricsFilter> webMetricsFilter(
public FilterRegistrationBean<WebMvcMetricsFilter> webMvcMetricsFilter(
MeterRegistry registry, MetricsProperties properties,
WebMvcTagsProvider tagsProvider, WebApplicationContext context) {
Server serverProperties = properties.getWeb().getServer();

59
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; @@ -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; @@ -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; @@ -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; @@ -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 { @@ -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 { @@ -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<String, FilterRegistrationBean> filterRegistrations = this.context
.getBeansOfType(FilterRegistrationBean.class);
assertThat(filterRegistrations).containsKey("webMvcMetricsFilter");
FilterRegistrationBean registration = filterRegistrations
.get("webMvcMetricsFilter");
assertThat(registration.getFilter()).isInstanceOf(WebMvcMetricsFilter.class);
assertThat((Set<DispatcherType>) ReflectionTestUtils.getField(registration,
"dispatcherTypes")).containsExactlyInAnyOrder(DispatcherType.REQUEST,
DispatcherType.ASYNC);
}
@Configuration
@ -164,34 +160,11 @@ public class MetricsAutoConfigurationIntegrationTests { @@ -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<String> personName() {
return Collections.singleton("Jon");
}
@GetMapping("/api/async")
CompletableFuture<String> 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);
}
}
}
}

Loading…
Cancel
Save