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 b99125c0ae..3f51d8c177 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 @@ -130,6 +130,10 @@ public class WebMvcMetricsFilter extends OncePerRequestFilter { record(timingContext, response, request, ex.getCause()); throw ex; } + catch (ServletException | IOException | RuntimeException ex) { + record(timingContext, response, request, ex); + throw ex; + } } private TimingContext startAndAttachTimingContext(HttpServletRequest request) { diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterTests.java index 7b53c25569..5a084f8cdb 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 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. @@ -76,6 +76,7 @@ import org.springframework.web.context.WebApplicationContext; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; import org.springframework.web.util.NestedServletException; import static org.assertj.core.api.Assertions.assertThat; @@ -188,6 +189,16 @@ public class WebMvcMetricsFilterTests { .tags("exception", "RuntimeException").timer().count()).isEqualTo(1L); } + @Test + public void streamingError() throws Exception { + MvcResult result = this.mvc.perform(get("/api/c1/streamingError")) + .andExpect(request().asyncStarted()).andReturn(); + assertThatCode( + () -> this.mvc.perform(asyncDispatch(result)).andExpect(status().isOk())); + assertThat(this.registry.get("http.server.requests") + .tags("exception", "IOException").timer().count()).isEqualTo(1L); + } + @Test public void anonymousError() { try { @@ -451,6 +462,14 @@ public class WebMvcMetricsFilterTests { throw new RuntimeException("Boom on " + id + "!"); } + @GetMapping("/streamingError") + public ResponseBodyEmitter streamingError() { + ResponseBodyEmitter emitter = new ResponseBodyEmitter(); + emitter.completeWithError( + new IOException("error while writing to the response")); + return emitter; + } + @Timed @GetMapping("/regex/{id:\\.[a-z]+}") public String successfulRegex(@PathVariable String id) {