From 49e61f138f5b2f5ff3ae18e5036fbc4b582523c5 Mon Sep 17 00:00:00 2001 From: sebastiankirsch Date: Mon, 19 Jun 2017 21:07:21 +0200 Subject: [PATCH] Fixes #4405 --- .../autoconfigure/MetricFilterProperties.java | 18 ++++++++++ .../actuate/autoconfigure/MetricsFilter.java | 3 ++ .../MetricFilterAutoConfigurationTests.java | 33 +++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricFilterProperties.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricFilterProperties.java index 8f9ae456d660..b34de5d570f2 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricFilterProperties.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricFilterProperties.java @@ -42,10 +42,16 @@ public class MetricFilterProperties { */ private Set counterSubmissions; + /** + * Submissions that should be made to the timer. + */ + private Set timerSubmissions; + public MetricFilterProperties() { this.gaugeSubmissions = new HashSet<>(EnumSet.of(MetricsFilterSubmission.MERGED)); this.counterSubmissions = new HashSet<>( EnumSet.of(MetricsFilterSubmission.MERGED)); + this.timerSubmissions = new HashSet<>(); } public Set getGaugeSubmissions() { @@ -64,6 +70,14 @@ public void setCounterSubmissions(Set counterSubmission this.counterSubmissions = counterSubmissions; } + public Set getTimerSubmissions() { + return this.timerSubmissions; + } + + public void setTimerSubmissions(Set timerSubmissions) { + this.timerSubmissions = timerSubmissions; + } + boolean shouldSubmitToGauge(MetricsFilterSubmission submission) { return shouldSubmit(this.gaugeSubmissions, submission); } @@ -72,6 +86,10 @@ boolean shouldSubmitToCounter(MetricsFilterSubmission submission) { return shouldSubmit(this.counterSubmissions, submission); } + boolean shouldSubmitToTimer(MetricsFilterSubmission submission) { + return shouldSubmit(this.timerSubmissions, submission); + } + private boolean shouldSubmit(Set submissions, MetricsFilterSubmission submission) { return submissions != null && submissions.contains(submission); diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricsFilter.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricsFilter.java index f9a2bec5eef3..96eae2fa9bdf 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricsFilter.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricsFilter.java @@ -195,6 +195,9 @@ private void submitMetrics(MetricsFilterSubmission submission, if (this.properties.shouldSubmitToCounter(submission)) { incrementCounter(getKey("status." + prefix + status + suffix)); } + if (this.properties.shouldSubmitToTimer(submission)) { + submitToGauge(getKey("timer.response." + prefix + suffix), time); + } } private String getKey(String string) { diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfigurationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfigurationTests.java index 4b6ce78750bc..634dab4b3b59 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfigurationTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfigurationTests.java @@ -67,6 +67,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; @@ -89,6 +90,7 @@ public void defaultMetricFilterAutoConfigurationProperties() { .containsExactly(MetricsFilterSubmission.MERGED); assertThat(properties.getCounterSubmissions()) .containsExactly(MetricsFilterSubmission.MERGED); + assertThat(properties.getTimerSubmissions()).isEmpty(); } @Test @@ -409,6 +411,37 @@ public Object answer(InvocationOnMock invocation) throws Throwable { context.close(); } + @Test + public void recordsTimerMetricsIfConfigured() throws Exception { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + context.register(Config.class, MetricFilterAutoConfiguration.class); + TestPropertyValues.of("endpoints.metrics.filter.gauge-submissions=", + "endpoints.metrics.filter.counter-submissions=", + "endpoints.metrics.filter.timer-submissions=merged,per-http-method" + ).applyTo(context); + context.refresh(); + Filter filter = context.getBean(Filter.class); + final MockHttpServletRequest request = new MockHttpServletRequest("PUT", + "/test/path"); + final MockHttpServletResponse response = new MockHttpServletResponse(); + FilterChain chain = mock(FilterChain.class); + willAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + response.setStatus(200); + return null; + } + }).given(chain).doFilter(request, response); + filter.doFilter(request, response, chain); + verify(context.getBean(GaugeService.class)).submit(eq("timer.response.test.path"), + anyDouble()); + verify(context.getBean(GaugeService.class)).submit(eq("timer.response.PUT.test.path"), + anyDouble()); + verifyNoMoreInteractions(context.getBean(GaugeService.class)); + verify(context.getBean(CounterService.class), never()).increment(anyString()); + context.close(); + } + @Test public void whenExceptionIsThrownResponseStatusIsUsedWhenResponseHasBeenCommitted() throws Exception {