diff --git a/spring-web/src/main/java/org/springframework/web/filter/ServerHttpObservationFilter.java b/spring-web/src/main/java/org/springframework/web/filter/ServerHttpObservationFilter.java index c6852aecd3..02530622f7 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/ServerHttpObservationFilter.java +++ b/spring-web/src/main/java/org/springframework/web/filter/ServerHttpObservationFilter.java @@ -130,7 +130,9 @@ public class ServerHttpObservationFilter extends OncePerRequestFilter { observation = ServerHttpObservationDocumentation.HTTP_REQUESTS.observation(this.observationConvention, DEFAULT_OBSERVATION_CONVENTION, () -> context, this.observationRegistry).start(); request.setAttribute(CURRENT_OBSERVATION_ATTRIBUTE, observation); - request.setAttribute(CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE, observation.getContext()); + if (!observation.isNoop()) { + request.setAttribute(CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE, observation.getContext()); + } } return observation; } diff --git a/spring-web/src/test/java/org/springframework/web/filter/ServerHttpObservationFilterTests.java b/spring-web/src/test/java/org/springframework/web/filter/ServerHttpObservationFilterTests.java index 649f1a07af..f9df6e9ce4 100644 --- a/spring-web/src/test/java/org/springframework/web/filter/ServerHttpObservationFilterTests.java +++ b/spring-web/src/test/java/org/springframework/web/filter/ServerHttpObservationFilterTests.java @@ -16,6 +16,7 @@ package org.springframework.web.filter; +import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.tck.TestObservationRegistry; import io.micrometer.observation.tck.TestObservationRegistryAssert; import jakarta.servlet.RequestDispatcher; @@ -33,6 +34,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; /** * Tests for {@link ServerHttpObservationFilter}. + * * @author Brian Clozel */ class ServerHttpObservationFilterTests { @@ -61,6 +63,16 @@ class ServerHttpObservationFilterTests { assertThatHttpObservation().hasLowCardinalityKeyValue("outcome", "SUCCESS"); } + @Test + void filterShouldAcceptNoOpObservationContext() throws Exception { + ServerHttpObservationFilter filter = new ServerHttpObservationFilter(ObservationRegistry.NOOP); + filter.doFilter(this.request, this.response, this.mockFilterChain); + + ServerRequestObservationContext context = (ServerRequestObservationContext) this.request + .getAttribute(ServerHttpObservationFilter.CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE); + assertThat(context).isNull(); + } + @Test void filterShouldUseThrownException() throws Exception { IllegalArgumentException customError = new IllegalArgumentException("custom error");