diff --git a/gradle.properties b/gradle.properties
index 28d0adf1073..62032695992 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,4 @@
-version=6.0.0-SNAPSHOT
+version=6.0.0-RC4
org.gradle.caching=true
org.gradle.jvmargs=-Xmx2048m
diff --git a/spring-web/src/main/java/org/springframework/http/observation/DefaultServerRequestObservationConvention.java b/spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java
similarity index 95%
rename from spring-web/src/main/java/org/springframework/http/observation/DefaultServerRequestObservationConvention.java
rename to spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java
index 43690b8497f..72c6e762ca8 100644
--- a/spring-web/src/main/java/org/springframework/http/observation/DefaultServerRequestObservationConvention.java
+++ b/spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java
@@ -14,15 +14,15 @@
* limitations under the License.
*/
-package org.springframework.http.observation;
+package org.springframework.http.server.observation;
import io.micrometer.common.KeyValue;
import io.micrometer.common.KeyValues;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
-import org.springframework.http.observation.ServerHttpObservationDocumentation.HighCardinalityKeyNames;
-import org.springframework.http.observation.ServerHttpObservationDocumentation.LowCardinalityKeyNames;
+import org.springframework.http.server.observation.ServerHttpObservationDocumentation.HighCardinalityKeyNames;
+import org.springframework.http.server.observation.ServerHttpObservationDocumentation.LowCardinalityKeyNames;
import org.springframework.util.StringUtils;
/**
diff --git a/spring-web/src/main/java/org/springframework/http/observation/ServerHttpObservationDocumentation.java b/spring-web/src/main/java/org/springframework/http/server/observation/ServerHttpObservationDocumentation.java
similarity index 95%
rename from spring-web/src/main/java/org/springframework/http/observation/ServerHttpObservationDocumentation.java
rename to spring-web/src/main/java/org/springframework/http/server/observation/ServerHttpObservationDocumentation.java
index 0264c9a6744..d42d029c9d3 100644
--- a/spring-web/src/main/java/org/springframework/http/observation/ServerHttpObservationDocumentation.java
+++ b/spring-web/src/main/java/org/springframework/http/server/observation/ServerHttpObservationDocumentation.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.http.observation;
+package org.springframework.http.server.observation;
import io.micrometer.common.KeyValue;
import io.micrometer.common.docs.KeyName;
@@ -33,9 +33,9 @@ import io.micrometer.observation.docs.ObservationDocumentation;
public enum ServerHttpObservationDocumentation implements ObservationDocumentation {
/**
- * HTTP exchanges observations for Servlet-based servers.
+ * HTTP request observations for Servlet-based servers.
*/
- HTTP_SERVLET_SERVER_EXCHANGES {
+ HTTP_SERVLET_SERVER_REQUESTS {
@Override
public Class extends ObservationConvention extends Observation.Context>> getDefaultConvention() {
return DefaultServerRequestObservationConvention.class;
diff --git a/spring-web/src/main/java/org/springframework/http/observation/ServerRequestObservationContext.java b/spring-web/src/main/java/org/springframework/http/server/observation/ServerRequestObservationContext.java
similarity index 83%
rename from spring-web/src/main/java/org/springframework/http/observation/ServerRequestObservationContext.java
rename to spring-web/src/main/java/org/springframework/http/server/observation/ServerRequestObservationContext.java
index 43d7949ecf8..bf37e01df18 100644
--- a/spring-web/src/main/java/org/springframework/http/observation/ServerRequestObservationContext.java
+++ b/spring-web/src/main/java/org/springframework/http/server/observation/ServerRequestObservationContext.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.http.observation;
+package org.springframework.http.server.observation;
import io.micrometer.observation.transport.RequestReplyReceiverContext;
import jakarta.servlet.http.HttpServletRequest;
@@ -23,10 +23,10 @@ import jakarta.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
/**
- * Context that holds information for metadata collection during observations
- * for {@link ServerHttpObservationDocumentation#HTTP_SERVLET_SERVER_EXCHANGES Servlet HTTP exchanges}.
+ * Context that holds information for metadata collection regarding
+ * {@link ServerHttpObservationDocumentation#HTTP_SERVLET_SERVER_REQUESTS Servlet HTTP requests} observations.
*
This context also extends {@link RequestReplyReceiverContext} for propagating
- * tracing information with the HTTP server exchange.
+ * tracing information during HTTP request processing.
*
* @author Brian Clozel
* @since 6.0
diff --git a/spring-web/src/main/java/org/springframework/http/observation/ServerRequestObservationConvention.java b/spring-web/src/main/java/org/springframework/http/server/observation/ServerRequestObservationConvention.java
similarity index 88%
rename from spring-web/src/main/java/org/springframework/http/observation/ServerRequestObservationConvention.java
rename to spring-web/src/main/java/org/springframework/http/server/observation/ServerRequestObservationConvention.java
index ce1e96ce81b..39f4b1967da 100644
--- a/spring-web/src/main/java/org/springframework/http/observation/ServerRequestObservationConvention.java
+++ b/spring-web/src/main/java/org/springframework/http/server/observation/ServerRequestObservationConvention.java
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-package org.springframework.http.observation;
+package org.springframework.http.server.observation;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationConvention;
/**
- * Interface for an {@link ObservationConvention} for {@link ServerHttpObservationDocumentation#HTTP_SERVLET_SERVER_EXCHANGES Servlet HTTP exchanges}.
+ * Interface for an {@link ObservationConvention} for {@link ServerHttpObservationDocumentation#HTTP_SERVLET_SERVER_REQUESTS Servlet HTTP requests}.
*
* @author Brian Clozel
* @since 6.0
diff --git a/spring-web/src/main/java/org/springframework/http/observation/package-info.java b/spring-web/src/main/java/org/springframework/http/server/observation/package-info.java
similarity index 67%
rename from spring-web/src/main/java/org/springframework/http/observation/package-info.java
rename to spring-web/src/main/java/org/springframework/http/server/observation/package-info.java
index 73b05998c39..aebdd17f177 100644
--- a/spring-web/src/main/java/org/springframework/http/observation/package-info.java
+++ b/spring-web/src/main/java/org/springframework/http/server/observation/package-info.java
@@ -1,9 +1,9 @@
/**
- * Instrumentation for {@link io.micrometer.observation.Observation observing} HTTP applications.
+ * Instrumentation for {@link io.micrometer.observation.Observation observing} HTTP server applications.
*/
@NonNullApi
@NonNullFields
-package org.springframework.http.observation;
+package org.springframework.http.server.observation;
import org.springframework.lang.NonNullApi;
import org.springframework.lang.NonNullFields;
diff --git a/spring-web/src/main/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConvention.java b/spring-web/src/main/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConvention.java
similarity index 92%
rename from spring-web/src/main/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConvention.java
rename to spring-web/src/main/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConvention.java
index 51e7efb75da..825cf99f3d3 100644
--- a/spring-web/src/main/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConvention.java
+++ b/spring-web/src/main/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConvention.java
@@ -14,17 +14,16 @@
* limitations under the License.
*/
-package org.springframework.http.observation.reactive;
+package org.springframework.http.server.reactive.observation;
import io.micrometer.common.KeyValue;
import io.micrometer.common.KeyValues;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
-import org.springframework.http.observation.reactive.ServerHttpObservationDocumentation.HighCardinalityKeyNames;
-import org.springframework.http.observation.reactive.ServerHttpObservationDocumentation.LowCardinalityKeyNames;
+import org.springframework.http.server.reactive.observation.ServerHttpObservationDocumentation.HighCardinalityKeyNames;
+import org.springframework.http.server.reactive.observation.ServerHttpObservationDocumentation.LowCardinalityKeyNames;
import org.springframework.util.StringUtils;
-import org.springframework.web.util.pattern.PathPattern;
/**
* Default {@link ServerRequestObservationConvention}.
@@ -117,12 +116,12 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO
protected KeyValue uri(ServerRequestObservationContext context) {
if (context.getCarrier() != null) {
- PathPattern pattern = context.getPathPattern();
+ String pattern = context.getPathPattern();
if (pattern != null) {
- if (pattern.toString().isEmpty()) {
+ if (pattern.isEmpty()) {
return URI_ROOT;
}
- return KeyValue.of(LowCardinalityKeyNames.URI, pattern.toString());
+ return KeyValue.of(LowCardinalityKeyNames.URI, pattern);
}
if (context.getResponse() != null && context.getResponse().getStatusCode() != null) {
HttpStatus status = HttpStatus.resolve(context.getResponse().getStatusCode().value());
diff --git a/spring-web/src/main/java/org/springframework/http/observation/reactive/ServerHttpObservationDocumentation.java b/spring-web/src/main/java/org/springframework/http/server/reactive/observation/ServerHttpObservationDocumentation.java
similarity index 95%
rename from spring-web/src/main/java/org/springframework/http/observation/reactive/ServerHttpObservationDocumentation.java
rename to spring-web/src/main/java/org/springframework/http/server/reactive/observation/ServerHttpObservationDocumentation.java
index 10d19a90ca1..03cfa784ab5 100644
--- a/spring-web/src/main/java/org/springframework/http/observation/reactive/ServerHttpObservationDocumentation.java
+++ b/spring-web/src/main/java/org/springframework/http/server/reactive/observation/ServerHttpObservationDocumentation.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.http.observation.reactive;
+package org.springframework.http.server.reactive.observation;
import io.micrometer.common.KeyValue;
import io.micrometer.common.docs.KeyName;
@@ -33,9 +33,9 @@ import io.micrometer.observation.docs.ObservationDocumentation;
public enum ServerHttpObservationDocumentation implements ObservationDocumentation {
/**
- * HTTP exchanges observations for reactive servers.
+ * HTTP request observations for reactive servers.
*/
- HTTP_REACTIVE_SERVER_EXCHANGES {
+ HTTP_REACTIVE_SERVER_REQUESTS {
@Override
public Class extends ObservationConvention extends Observation.Context>> getDefaultConvention() {
return DefaultServerRequestObservationConvention.class;
diff --git a/spring-web/src/main/java/org/springframework/http/observation/reactive/ServerRequestObservationContext.java b/spring-web/src/main/java/org/springframework/http/server/reactive/observation/ServerRequestObservationContext.java
similarity index 72%
rename from spring-web/src/main/java/org/springframework/http/observation/reactive/ServerRequestObservationContext.java
rename to spring-web/src/main/java/org/springframework/http/server/reactive/observation/ServerRequestObservationContext.java
index 5a3e1e72cd0..070d8637345 100644
--- a/spring-web/src/main/java/org/springframework/http/observation/reactive/ServerRequestObservationContext.java
+++ b/spring-web/src/main/java/org/springframework/http/server/reactive/observation/ServerRequestObservationContext.java
@@ -14,46 +14,47 @@
* limitations under the License.
*/
-package org.springframework.http.observation.reactive;
+package org.springframework.http.server.reactive.observation;
+
+import java.util.Collections;
+import java.util.Map;
import io.micrometer.observation.transport.RequestReplyReceiverContext;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.lang.Nullable;
-import org.springframework.web.server.ServerWebExchange;
-import org.springframework.web.util.pattern.PathPattern;
/**
- * Context that holds information for metadata collection during observations
- * for {@link ServerHttpObservationDocumentation#HTTP_REACTIVE_SERVER_EXCHANGES reactive HTTP exchanges}.
+ * Context that holds information for metadata collection regarding
+ * {@link ServerHttpObservationDocumentation#HTTP_REACTIVE_SERVER_REQUESTS reactive HTTP requests} observations.
*
This context also extends {@link RequestReplyReceiverContext} for propagating
- * tracing information with the HTTP server exchange.
+ * tracing information during HTTP request processing.
*
* @author Brian Clozel
* @since 6.0
*/
public class ServerRequestObservationContext extends RequestReplyReceiverContext {
- private final ServerWebExchange serverWebExchange;
+ private final Map attributes;
@Nullable
- private PathPattern pathPattern;
+ private String pathPattern;
private boolean connectionAborted;
- public ServerRequestObservationContext(ServerWebExchange exchange) {
- super((request, key) -> request.getHeaders().getFirst(key));
- this.serverWebExchange = exchange;
- setCarrier(exchange.getRequest());
- setResponse(exchange.getResponse());
+ public ServerRequestObservationContext(ServerHttpRequest request, ServerHttpResponse response, Map attributes) {
+ super((req, key) -> req.getHeaders().getFirst(key));
+ setCarrier(request);
+ setResponse(response);
+ this.attributes = Collections.unmodifiableMap(attributes);
}
/**
- * Return the current {@link ServerWebExchange HTTP exchange}.
+ * Return an immutable map of the current request attributes.
*/
- public ServerWebExchange getServerWebExchange() {
- return this.serverWebExchange;
+ public Map getAttributes() {
+ return this.attributes;
}
/**
@@ -63,7 +64,7 @@ public class ServerRequestObservationContext extends RequestReplyReceiverContext
* @return the path pattern, or {@code null} if none found
*/
@Nullable
- public PathPattern getPathPattern() {
+ public String getPathPattern() {
return this.pathPattern;
}
@@ -72,7 +73,7 @@ public class ServerRequestObservationContext extends RequestReplyReceiverContext
* Path patterns must have a low cardinality for the entire application.
* @param pathPattern the path pattern, for example {@code "/projects/{name}"}.
*/
- public void setPathPattern(@Nullable PathPattern pathPattern) {
+ public void setPathPattern(@Nullable String pathPattern) {
this.pathPattern = pathPattern;
}
diff --git a/spring-web/src/main/java/org/springframework/http/observation/reactive/ServerRequestObservationConvention.java b/spring-web/src/main/java/org/springframework/http/server/reactive/observation/ServerRequestObservationConvention.java
similarity index 88%
rename from spring-web/src/main/java/org/springframework/http/observation/reactive/ServerRequestObservationConvention.java
rename to spring-web/src/main/java/org/springframework/http/server/reactive/observation/ServerRequestObservationConvention.java
index 6c7ed8f1330..d42e025d37f 100644
--- a/spring-web/src/main/java/org/springframework/http/observation/reactive/ServerRequestObservationConvention.java
+++ b/spring-web/src/main/java/org/springframework/http/server/reactive/observation/ServerRequestObservationConvention.java
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-package org.springframework.http.observation.reactive;
+package org.springframework.http.server.reactive.observation;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationConvention;
/**
- * Interface for an {@link ObservationConvention} for {@link ServerHttpObservationDocumentation#HTTP_REACTIVE_SERVER_EXCHANGES reactive HTTP exchanges}.
+ * Interface for an {@link ObservationConvention} for {@link ServerHttpObservationDocumentation#HTTP_REACTIVE_SERVER_REQUESTS reactive HTTP requests}.
*
* @author Brian Clozel
* @since 6.0
diff --git a/spring-web/src/main/java/org/springframework/http/observation/reactive/package-info.java b/spring-web/src/main/java/org/springframework/http/server/reactive/observation/package-info.java
similarity index 63%
rename from spring-web/src/main/java/org/springframework/http/observation/reactive/package-info.java
rename to spring-web/src/main/java/org/springframework/http/server/reactive/observation/package-info.java
index 473d6d16164..d00ac21e829 100644
--- a/spring-web/src/main/java/org/springframework/http/observation/reactive/package-info.java
+++ b/spring-web/src/main/java/org/springframework/http/server/reactive/observation/package-info.java
@@ -1,9 +1,9 @@
/**
- * Instrumentation for {@link io.micrometer.observation.Observation observing} reactive HTTP applications.
+ * Instrumentation for {@link io.micrometer.observation.Observation observing} reactive HTTP server applications.
*/
@NonNullApi
@NonNullFields
-package org.springframework.http.observation.reactive;
+package org.springframework.http.server.reactive.observation;
import org.springframework.lang.NonNullApi;
import org.springframework.lang.NonNullFields;
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 277d8e9872f..d0be09619fd 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
@@ -27,10 +27,10 @@ import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
-import org.springframework.http.observation.DefaultServerRequestObservationConvention;
-import org.springframework.http.observation.ServerHttpObservationDocumentation;
-import org.springframework.http.observation.ServerRequestObservationContext;
-import org.springframework.http.observation.ServerRequestObservationConvention;
+import org.springframework.http.server.observation.DefaultServerRequestObservationConvention;
+import org.springframework.http.server.observation.ServerHttpObservationDocumentation;
+import org.springframework.http.server.observation.ServerRequestObservationContext;
+import org.springframework.http.server.observation.ServerRequestObservationConvention;
import org.springframework.lang.Nullable;
@@ -127,7 +127,7 @@ public class ServerHttpObservationFilter extends OncePerRequestFilter {
Observation observation = (Observation) request.getAttribute(CURRENT_OBSERVATION_ATTRIBUTE);
if (observation == null) {
ServerRequestObservationContext context = new ServerRequestObservationContext(request, response);
- observation = ServerHttpObservationDocumentation.HTTP_SERVLET_SERVER_EXCHANGES.observation(this.observationConvention,
+ observation = ServerHttpObservationDocumentation.HTTP_SERVLET_SERVER_REQUESTS.observation(this.observationConvention,
DEFAULT_OBSERVATION_CONVENTION, () -> context, this.observationRegistry).start();
request.setAttribute(CURRENT_OBSERVATION_ATTRIBUTE, observation);
if (!observation.isNoop()) {
diff --git a/spring-web/src/main/java/org/springframework/web/filter/reactive/ServerHttpObservationFilter.java b/spring-web/src/main/java/org/springframework/web/filter/reactive/ServerHttpObservationFilter.java
index a3c228eb463..ca75df7e7a1 100644
--- a/spring-web/src/main/java/org/springframework/web/filter/reactive/ServerHttpObservationFilter.java
+++ b/spring-web/src/main/java/org/springframework/web/filter/reactive/ServerHttpObservationFilter.java
@@ -25,11 +25,11 @@ import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccess
import org.reactivestreams.Publisher;
import reactor.core.publisher.Mono;
-import org.springframework.http.observation.reactive.DefaultServerRequestObservationConvention;
-import org.springframework.http.observation.reactive.ServerHttpObservationDocumentation;
-import org.springframework.http.observation.reactive.ServerRequestObservationContext;
-import org.springframework.http.observation.reactive.ServerRequestObservationConvention;
import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.http.server.reactive.observation.DefaultServerRequestObservationConvention;
+import org.springframework.http.server.reactive.observation.ServerHttpObservationDocumentation;
+import org.springframework.http.server.reactive.observation.ServerRequestObservationContext;
+import org.springframework.http.server.reactive.observation.ServerRequestObservationConvention;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
@@ -96,13 +96,14 @@ public class ServerHttpObservationFilter implements WebFilter {
@Override
public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
- ServerRequestObservationContext observationContext = new ServerRequestObservationContext(exchange);
+ ServerRequestObservationContext observationContext = new ServerRequestObservationContext(exchange.getRequest(),
+ exchange.getResponse(), exchange.getAttributes());
exchange.getAttributes().put(CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE, observationContext);
return chain.filter(exchange).transformDeferred(call -> filter(exchange, observationContext, call));
}
private Publisher filter(ServerWebExchange exchange, ServerRequestObservationContext observationContext, Mono call) {
- Observation observation = ServerHttpObservationDocumentation.HTTP_REACTIVE_SERVER_EXCHANGES.observation(this.observationConvention,
+ Observation observation = ServerHttpObservationDocumentation.HTTP_REACTIVE_SERVER_REQUESTS.observation(this.observationConvention,
DEFAULT_OBSERVATION_CONVENTION, () -> observationContext, this.observationRegistry);
observation.start();
return call.doOnEach(signal -> {
diff --git a/spring-web/src/test/java/org/springframework/http/observation/DefaultServerRequestObservationConventionTests.java b/spring-web/src/test/java/org/springframework/http/server/observation/DefaultServerRequestObservationConventionTests.java
similarity index 98%
rename from spring-web/src/test/java/org/springframework/http/observation/DefaultServerRequestObservationConventionTests.java
rename to spring-web/src/test/java/org/springframework/http/server/observation/DefaultServerRequestObservationConventionTests.java
index 9f7e61eb957..9964f6bf7b1 100644
--- a/spring-web/src/test/java/org/springframework/http/observation/DefaultServerRequestObservationConventionTests.java
+++ b/spring-web/src/test/java/org/springframework/http/server/observation/DefaultServerRequestObservationConventionTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.http.observation;
+package org.springframework.http.server.observation;
import io.micrometer.common.KeyValue;
import io.micrometer.observation.Observation;
diff --git a/spring-web/src/test/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConventionTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConventionTests.java
similarity index 87%
rename from spring-web/src/test/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConventionTests.java
rename to spring-web/src/test/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConventionTests.java
index 37b47b56235..138b52737ad 100644
--- a/spring-web/src/test/java/org/springframework/http/observation/reactive/DefaultServerRequestObservationConventionTests.java
+++ b/spring-web/src/test/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConventionTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.http.observation.reactive;
+package org.springframework.http.server.reactive.observation;
import io.micrometer.common.KeyValue;
import io.micrometer.observation.Observation;
@@ -23,13 +23,12 @@ import org.junit.jupiter.api.Test;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest;
import org.springframework.web.testfixture.server.MockServerWebExchange;
-import org.springframework.web.util.pattern.PathPattern;
-import org.springframework.web.util.pattern.PathPatternParser;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link DefaultServerRequestObservationConvention}.
+ *
* @author Brian Clozel
*/
class DefaultServerRequestObservationConventionTests {
@@ -45,22 +44,22 @@ class DefaultServerRequestObservationConventionTests {
@Test
void shouldHaveContextualName() {
ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test/resource"));
- ServerRequestObservationContext context = new ServerRequestObservationContext(exchange);
+ ServerRequestObservationContext context = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes());
assertThat(convention.getContextualName(context)).isEqualTo("http get");
}
@Test
void contextualNameShouldUsePathPatternWhenAvailable() {
ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test/resource"));
- ServerRequestObservationContext context = new ServerRequestObservationContext(exchange);
- context.setPathPattern(PathPatternParser.defaultInstance.parse("/test/{name}"));
+ ServerRequestObservationContext context = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes());
+ context.setPathPattern("/test/{name}");
assertThat(convention.getContextualName(context)).isEqualTo("http get /test/{name}");
}
@Test
void supportsOnlyHttpRequestsObservationContext() {
ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.post("/test/resource"));
- ServerRequestObservationContext context = new ServerRequestObservationContext(exchange);
+ ServerRequestObservationContext context = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes());
assertThat(this.convention.supportsContext(context)).isTrue();
assertThat(this.convention.supportsContext(new Observation.Context())).isFalse();
}
@@ -69,7 +68,7 @@ class DefaultServerRequestObservationConventionTests {
void addsKeyValuesForExchange() {
ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.post("/test/resource"));
exchange.getResponse().setRawStatusCode(201);
- ServerRequestObservationContext context = new ServerRequestObservationContext(exchange);
+ ServerRequestObservationContext context = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes());
assertThat(this.convention.getLowCardinalityKeyValues(context)).hasSize(5)
.contains(KeyValue.of("method", "POST"), KeyValue.of("uri", "UNKNOWN"), KeyValue.of("status", "201"),
@@ -82,9 +81,8 @@ class DefaultServerRequestObservationConventionTests {
void addsKeyValuesForExchangeWithPathPattern() {
ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test/resource"));
exchange.getResponse().setRawStatusCode(200);
- ServerRequestObservationContext context = new ServerRequestObservationContext(exchange);
- PathPattern pathPattern = getPathPattern("/test/{name}");
- context.setPathPattern(pathPattern);
+ ServerRequestObservationContext context = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes());
+ context.setPathPattern("/test/{name}");
assertThat(this.convention.getLowCardinalityKeyValues(context)).hasSize(5)
.contains(KeyValue.of("method", "GET"), KeyValue.of("uri", "/test/{name}"), KeyValue.of("status", "200"),
@@ -97,7 +95,7 @@ class DefaultServerRequestObservationConventionTests {
@Test
void addsKeyValuesForErrorExchange() {
ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test/resource"));
- ServerRequestObservationContext context = new ServerRequestObservationContext(exchange);
+ ServerRequestObservationContext context = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes());
context.setError(new IllegalArgumentException("custom error"));
exchange.getResponse().setRawStatusCode(500);
@@ -111,7 +109,7 @@ class DefaultServerRequestObservationConventionTests {
@Test
void addsKeyValuesForRedirectExchange() {
ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test/redirect"));
- ServerRequestObservationContext context = new ServerRequestObservationContext(exchange);
+ ServerRequestObservationContext context = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes());
exchange.getResponse().setRawStatusCode(302);
exchange.getResponse().getHeaders().add("Location", "https://example.org/other");
@@ -125,7 +123,7 @@ class DefaultServerRequestObservationConventionTests {
@Test
void addsKeyValuesForNotFoundExchange() {
ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test/notFound"));
- ServerRequestObservationContext context = new ServerRequestObservationContext(exchange);
+ ServerRequestObservationContext context = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes());
exchange.getResponse().setRawStatusCode(404);
assertThat(this.convention.getLowCardinalityKeyValues(context)).hasSize(5)
@@ -138,7 +136,7 @@ class DefaultServerRequestObservationConventionTests {
@Test
void addsKeyValuesForCancelledExchange() {
ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test/resource"));
- ServerRequestObservationContext context = new ServerRequestObservationContext(exchange);
+ ServerRequestObservationContext context = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes());
context.setConnectionAborted(true);
exchange.getResponse().setRawStatusCode(200);
@@ -152,16 +150,11 @@ class DefaultServerRequestObservationConventionTests {
@Test
void supportsNullStatusCode() {
ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/test/resource"));
- ServerRequestObservationContext context = new ServerRequestObservationContext(exchange);
+ ServerRequestObservationContext context = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes());
assertThat(this.convention.getLowCardinalityKeyValues(context))
.contains(KeyValue.of("status", "UNKNOWN"),
KeyValue.of("exception", "none"), KeyValue.of("outcome", "UNKNOWN"));
}
- private static PathPattern getPathPattern(String pattern) {
- PathPatternParser pathPatternParser = new PathPatternParser();
- return pathPatternParser.parse(pattern);
- }
-
}
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 f9df6e9ce4b..30648c8bfb4 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
@@ -24,7 +24,7 @@ import jakarta.servlet.ServletException;
import org.junit.jupiter.api.Test;
import org.springframework.http.HttpMethod;
-import org.springframework.http.observation.ServerRequestObservationContext;
+import org.springframework.http.server.observation.ServerRequestObservationContext;
import org.springframework.web.testfixture.servlet.MockFilterChain;
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
import org.springframework.web.testfixture.servlet.MockHttpServletResponse;
diff --git a/spring-web/src/test/java/org/springframework/web/filter/reactive/ServerHttpObservationFilterTests.java b/spring-web/src/test/java/org/springframework/web/filter/reactive/ServerHttpObservationFilterTests.java
index 0f84861dc24..4bef48c1149 100644
--- a/spring-web/src/test/java/org/springframework/web/filter/reactive/ServerHttpObservationFilterTests.java
+++ b/spring-web/src/test/java/org/springframework/web/filter/reactive/ServerHttpObservationFilterTests.java
@@ -27,7 +27,7 @@ import org.junit.jupiter.api.Test;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
-import org.springframework.http.observation.reactive.ServerRequestObservationContext;
+import org.springframework.http.server.reactive.observation.ServerRequestObservationContext;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilterChain;
import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest;
diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/RouterFunctionMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/RouterFunctionMapping.java
index ae214f41b34..2dd4a8142d9 100644
--- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/RouterFunctionMapping.java
+++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/RouterFunctionMapping.java
@@ -172,7 +172,7 @@ public class RouterFunctionMapping extends AbstractHandlerMapping implements Ini
if (matchingPattern != null) {
attributes.put(BEST_MATCHING_PATTERN_ATTRIBUTE, matchingPattern);
ServerHttpObservationFilter.findObservationContext(serverRequest.exchange())
- .ifPresent(context -> context.setPathPattern(matchingPattern));
+ .ifPresent(context -> context.setPathPattern(matchingPattern.toString()));
}
Map uriVariables =
(Map) attributes.get(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java
index 39fd49080fa..baa44045c52 100644
--- a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java
+++ b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java
@@ -167,7 +167,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping {
exchange.getAttributes().put(BEST_MATCHING_HANDLER_ATTRIBUTE, handler);
exchange.getAttributes().put(BEST_MATCHING_PATTERN_ATTRIBUTE, pattern);
ServerHttpObservationFilter.findObservationContext(exchange)
- .ifPresent(context -> context.setPathPattern(pattern));
+ .ifPresent(context -> context.setPathPattern(pattern.toString()));
exchange.getAttributes().put(PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, pathWithinMapping);
exchange.getAttributes().put(URI_TEMPLATE_VARIABLES_ATTRIBUTE, matchInfo.getUriVariables());
diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java
index d16ee75ca9e..a12fa48cdd6 100644
--- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java
+++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java
@@ -141,7 +141,7 @@ public abstract class RequestMappingInfoHandlerMapping extends AbstractHandlerMe
exchange.getAttributes().put(BEST_MATCHING_HANDLER_ATTRIBUTE, handlerMethod);
exchange.getAttributes().put(BEST_MATCHING_PATTERN_ATTRIBUTE, bestPattern);
ServerHttpObservationFilter.findObservationContext(exchange)
- .ifPresent(context -> context.setPathPattern(bestPattern));
+ .ifPresent(context -> context.setPathPattern(bestPattern.toString()));
exchange.getAttributes().put(URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriVariables);
exchange.getAttributes().put(MATRIX_VARIABLES_ATTRIBUTE, matrixVariables);
diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/support/RouterFunctionMappingTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/support/RouterFunctionMappingTests.java
index 344c57da3c1..c8615618357 100644
--- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/support/RouterFunctionMappingTests.java
+++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/support/RouterFunctionMappingTests.java
@@ -22,7 +22,7 @@ import reactor.test.StepVerifier;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.http.codec.ServerCodecConfigurer;
-import org.springframework.http.observation.reactive.ServerRequestObservationContext;
+import org.springframework.http.server.reactive.observation.ServerRequestObservationContext;
import org.springframework.web.filter.reactive.ServerHttpObservationFilter;
import org.springframework.web.reactive.HandlerMapping;
import org.springframework.web.reactive.function.server.HandlerFunction;
@@ -137,7 +137,7 @@ class RouterFunctionMappingTests {
assertThat(matchingPattern).isNotNull();
assertThat(matchingPattern.getPatternString()).isEqualTo("/match");
assertThat(ServerHttpObservationFilter.findObservationContext(exchange))
- .hasValueSatisfying(context -> assertThat(context.getPathPattern()).isEqualTo(matchingPattern));
+ .hasValueSatisfying(context -> assertThat(context.getPathPattern()).isEqualTo(matchingPattern.getPatternString()));
ServerRequest serverRequest = exchange.getAttribute(RouterFunctions.REQUEST_ATTRIBUTE);
assertThat(serverRequest).isNotNull();
@@ -148,7 +148,7 @@ class RouterFunctionMappingTests {
private ServerWebExchange createExchange(String urlTemplate) {
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(urlTemplate));
- ServerRequestObservationContext observationContext = new ServerRequestObservationContext(exchange);
+ ServerRequestObservationContext observationContext = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes());
exchange.getAttributes().put(CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE, observationContext);
return exchange;
}
diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMappingTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMappingTests.java
index acf0cf9ce98..142f484ec99 100644
--- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMappingTests.java
+++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMappingTests.java
@@ -36,7 +36,7 @@ import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
-import org.springframework.http.observation.reactive.ServerRequestObservationContext;
+import org.springframework.http.server.reactive.observation.ServerRequestObservationContext;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Controller;
import org.springframework.util.ClassUtils;
@@ -263,12 +263,11 @@ public class RequestMappingInfoHandlerMappingTests {
public void handleMatchBestMatchingPatternAttributeInObservationContext() {
RequestMappingInfo key = paths("/{path1}/2", "/**").build();
ServerWebExchange exchange = MockServerWebExchange.from(get("/1/2"));
- ServerRequestObservationContext observationContext = new ServerRequestObservationContext(exchange);
+ ServerRequestObservationContext observationContext = new ServerRequestObservationContext(exchange.getRequest(), exchange.getResponse(), exchange.getAttributes());
exchange.getAttributes().put(CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE, observationContext);
this.handlerMapping.handleMatch(key, handlerMethod, exchange);
- assertThat(observationContext.getPathPattern()).isNotNull();
- assertThat(observationContext.getPathPattern().toString()).isEqualTo("/{path1}/2");
+ assertThat(observationContext.getPathPattern()).isEqualTo("/{path1}/2");
}
@Test // gh-22543
diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/support/RouterFunctionMappingTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/support/RouterFunctionMappingTests.java
index ead0a1e538b..df5dfbcef91 100644
--- a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/support/RouterFunctionMappingTests.java
+++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/support/RouterFunctionMappingTests.java
@@ -26,7 +26,7 @@ import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.http.converter.HttpMessageConverter;
-import org.springframework.http.observation.ServerRequestObservationContext;
+import org.springframework.http.server.observation.ServerRequestObservationContext;
import org.springframework.web.filter.ServerHttpObservationFilter;
import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.HandlerMapping;
diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMappingTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMappingTests.java
index 5dcf68759d3..a72865ee7dd 100644
--- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMappingTests.java
+++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMappingTests.java
@@ -33,8 +33,8 @@ import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
-import org.springframework.http.observation.ServerRequestObservationContext;
import org.springframework.http.server.RequestPath;
+import org.springframework.http.server.observation.ServerRequestObservationContext;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;