diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConvention.java b/spring-web/src/main/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConvention.java index b93e73abd017..43fe7fce325f 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConvention.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConvention.java @@ -108,7 +108,7 @@ protected KeyValue method(ServerRequestObservationContext context) { } protected KeyValue status(ServerRequestObservationContext context) { - if (context.isConnectionAborted()) { + if (context.isConnectionAborted() && (context.getResponse() == null || !context.getResponse().isCommitted())) { return STATUS_UNKNOWN; } return (context.getResponse() != null && context.getResponse().getStatusCode() != null) ? diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConventionTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConventionTests.java index 138b52737ad6..fb0e11e90c92 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConventionTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConventionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 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. @@ -147,6 +147,21 @@ void addsKeyValuesForCancelledExchange() { .contains(KeyValue.of("http.url", "/test/resource")); } + @Test + void addsKeyValuesForCancelledExchangeWhenResponseCommitted() { + ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test/resource")); + ServerRequestObservationContext context = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes()); + context.setConnectionAborted(true); + exchange.getResponse().setRawStatusCode(404); + exchange.getResponse().setComplete().block(); + + assertThat(this.convention.getLowCardinalityKeyValues(context)).hasSize(5) + .contains(KeyValue.of("method", "GET"), KeyValue.of("uri", "NOT_FOUND"), KeyValue.of("status", "404"), + KeyValue.of("exception", "none"), KeyValue.of("outcome", "UNKNOWN")); + assertThat(this.convention.getHighCardinalityKeyValues(context)).hasSize(1) + .contains(KeyValue.of("http.url", "/test/resource")); + } + @Test void supportsNullStatusCode() { ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test/resource"));