Make sure exception tag values are not empty in web metrics

See gh-13187
This commit is contained in:
Jon Schneider
2018-07-18 17:04:44 -05:00
committed by Stephane Nicoll
parent 66156cc24f
commit ee37dc1c31
4 changed files with 45 additions and 4 deletions

View File

@@ -109,7 +109,8 @@ public final class WebFluxTags {
*/
public static Tag exception(Throwable exception) {
if (exception != null) {
return Tag.of("exception", exception.getClass().getSimpleName());
String simpleName = exception.getClass().getSimpleName();
return Tag.of("exception", simpleName.isEmpty() ? exception.getClass().getName() : simpleName);
}
return EXCEPTION_NONE;
}

View File

@@ -134,9 +134,11 @@ public final class WebMvcTags {
* @return the exception tag derived from the exception
*/
public static Tag exception(Throwable exception) {
return (exception != null
? Tag.of("exception", exception.getClass().getSimpleName())
: EXCEPTION_NONE);
if (exception != null) {
String simpleName = exception.getClass().getSimpleName();
return Tag.of("exception", simpleName.isEmpty() ? exception.getClass().getName() : simpleName);
}
return EXCEPTION_NONE;
}
}

View File

@@ -77,6 +77,26 @@ public class MetricsWebFilterTests {
}).block();
assertMetricsContainsTag("uri", "/projects/{project}");
assertMetricsContainsTag("status", "500");
assertMetricsContainsTag("exception", "IllegalStateException");
}
@Test
public void filterAddsNonEmptyTagsToRegistryForAnonymousExceptions() {
final Exception anonymous = new Exception("test error") {};
MockServerWebExchange exchange = createExchange("/projects/spring-boot",
"/projects/{project}");
this.webFilter
.filter(exchange,
(serverWebExchange) -> Mono
.error(anonymous))
.onErrorResume((t) -> {
exchange.getResponse().setStatusCodeValue(500);
return exchange.getResponse().setComplete();
}).block();
assertMetricsContainsTag("uri", "/projects/{project}");
assertMetricsContainsTag("status", "500");
assertMetricsContainsTag("exception", anonymous.getClass().getName());
}
@Test

View File

@@ -188,6 +188,18 @@ public class WebMvcMetricsFilterTests {
.tags("exception", "RuntimeException").timer().count()).isEqualTo(1L);
}
@Test
public void anonymousError() throws Exception {
try {
mvc.perform(get("/api/c1/anonymousError/10"));
} catch(Throwable ignore) {
}
assertThat(this.registry.get("http.server.requests").tag("uri", "/api/c1/anonymousError/{id}").timer().getId()
.getTag("exception"))
.endsWith("$1");
}
@Test
public void asyncCallableRequest() throws Exception {
AtomicReference<MvcResult> result = new AtomicReference<>();
@@ -440,6 +452,12 @@ public class WebMvcMetricsFilterTests {
throw new IllegalStateException("Boom on " + id + "!");
}
@Timed
@GetMapping("/anonymousError/{id}")
public String alwaysThrowsAnonymousException(@PathVariable Long id) throws Exception {
throw new Exception("this exception won't have a simple class name") {};
}
@Timed
@GetMapping("/unhandledError/{id}")
public String alwaysThrowsUnhandledException(@PathVariable Long id) {