diff --git a/spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java b/spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java index fbf0bf27e88..ce42d5d1025 100644 --- a/spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java +++ b/spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java @@ -160,9 +160,14 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO } protected KeyValue outcome(ServerRequestObservationContext context) { - if (context.getResponse() != null) { - HttpStatusCode statusCode = HttpStatusCode.valueOf(context.getResponse().getStatus()); - return HttpOutcome.forStatus(statusCode); + try { + if (context.getResponse() != null) { + HttpStatusCode statusCode = HttpStatusCode.valueOf(context.getResponse().getStatus()); + return HttpOutcome.forStatus(statusCode); + } + } + catch (IllegalArgumentException ex) { + return HTTP_OUTCOME_UNKNOWN; } return HTTP_OUTCOME_UNKNOWN; } diff --git a/spring-web/src/test/java/org/springframework/http/server/observation/DefaultServerRequestObservationConventionTests.java b/spring-web/src/test/java/org/springframework/http/server/observation/DefaultServerRequestObservationConventionTests.java index 9d27d421a92..f23d67e4d50 100644 --- a/spring-web/src/test/java/org/springframework/http/server/observation/DefaultServerRequestObservationConventionTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/observation/DefaultServerRequestObservationConventionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2024 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. @@ -137,4 +137,16 @@ class DefaultServerRequestObservationConventionTests { .contains(KeyValue.of("http.url", "/test")); } + @Test + void addsKeyValuesForInvalidStatusExchange() { + this.request.setRequestURI("/test/invalidStatus"); + this.response.setStatus(0); + + assertThat(this.convention.getLowCardinalityKeyValues(this.context)).hasSize(5) + .contains(KeyValue.of("method", "GET"), KeyValue.of("uri", "UNKNOWN"), KeyValue.of("status", "0"), + KeyValue.of("exception", "none"), KeyValue.of("outcome", "UNKNOWN")); + assertThat(this.convention.getHighCardinalityKeyValues(this.context)).hasSize(1) + .contains(KeyValue.of("http.url", "/test/invalidStatus")); + } + }