Browse Source

Upgrade to Reactor 2025.0.0-M5 and Micrometer 1.16.0-M1

Includes Netty 4.2.3

Closes gh-35169
Closes gh-35170
pull/35212/head
Juergen Hoeller 9 months ago
parent
commit
eac490d320
  1. 6
      framework-platform/framework-platform.gradle
  2. 14
      spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java
  3. 14
      spring-web/src/main/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConvention.java
  4. 48
      spring-web/src/main/java/org/springframework/web/filter/ServerHttpObservationFilter.java

6
framework-platform/framework-platform.gradle

@ -8,9 +8,9 @@ javaPlatform {
dependencies { dependencies {
api(platform("com.fasterxml.jackson:jackson-bom:2.18.4")) api(platform("com.fasterxml.jackson:jackson-bom:2.18.4"))
api(platform("io.micrometer:micrometer-bom:1.15.1")) api(platform("io.micrometer:micrometer-bom:1.16.0-M1"))
api(platform("io.netty:netty-bom:4.2.2.Final")) api(platform("io.netty:netty-bom:4.2.3.Final"))
api(platform("io.projectreactor:reactor-bom:2025.0.0-M4")) api(platform("io.projectreactor:reactor-bom:2025.0.0-M5"))
api(platform("io.rsocket:rsocket-bom:1.1.5")) api(platform("io.rsocket:rsocket-bom:1.1.5"))
api(platform("org.apache.groovy:groovy-bom:4.0.27")) api(platform("org.apache.groovy:groovy-bom:4.0.27"))
api(platform("org.apache.logging.log4j:log4j-bom:3.0.0-beta3")) api(platform("org.apache.logging.log4j:log4j-bom:3.0.0-beta3"))

14
spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java

@ -23,6 +23,7 @@ import java.util.stream.Stream;
import io.micrometer.common.KeyValue; import io.micrometer.common.KeyValue;
import io.micrometer.common.KeyValues; import io.micrometer.common.KeyValues;
import org.jspecify.annotations.Nullable;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@ -89,12 +90,15 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO
} }
@Override @Override
public String getContextualName(ServerRequestObservationContext context) { public @Nullable String getContextualName(ServerRequestObservationContext context) {
String httpMethod = context.getCarrier().getMethod().toLowerCase(Locale.ROOT); if (context.getCarrier() != null) {
if (context.getPathPattern() != null) { String httpMethod = context.getCarrier().getMethod().toLowerCase(Locale.ROOT);
return "http " + httpMethod + " " + context.getPathPattern(); if (context.getPathPattern() != null) {
return "http " + httpMethod + " " + context.getPathPattern();
}
return "http " + httpMethod;
} }
return "http " + httpMethod; return null;
} }
@Override @Override

14
spring-web/src/main/java/org/springframework/http/server/reactive/observation/DefaultServerRequestObservationConvention.java

@ -21,6 +21,7 @@ import java.util.Set;
import io.micrometer.common.KeyValue; import io.micrometer.common.KeyValue;
import io.micrometer.common.KeyValues; import io.micrometer.common.KeyValues;
import org.jspecify.annotations.Nullable;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@ -87,12 +88,15 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO
} }
@Override @Override
public String getContextualName(ServerRequestObservationContext context) { public @Nullable String getContextualName(ServerRequestObservationContext context) {
String httpMethod = context.getCarrier().getMethod().name().toLowerCase(Locale.ROOT); if (context.getCarrier() != null) {
if (context.getPathPattern() != null) { String httpMethod = context.getCarrier().getMethod().name().toLowerCase(Locale.ROOT);
return "http " + httpMethod + " " + context.getPathPattern(); if (context.getPathPattern() != null) {
return "http " + httpMethod + " " + context.getPathPattern();
}
return "http " + httpMethod;
} }
return "http " + httpMethod; return null;
} }
@Override @Override

48
spring-web/src/main/java/org/springframework/web/filter/ServerHttpObservationFilter.java

@ -55,19 +55,23 @@ import org.springframework.http.server.observation.ServerRequestObservationConve
public class ServerHttpObservationFilter extends OncePerRequestFilter { public class ServerHttpObservationFilter extends OncePerRequestFilter {
/** /**
* Name of the request attribute holding the {@link ServerRequestObservationContext context} for the current observation. * Name of the request attribute holding the {@link ServerRequestObservationContext} for the current observation.
*/ */
public static final String CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE = ServerHttpObservationFilter.class.getName() + ".context"; public static final String CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE =
ServerHttpObservationFilter.class.getName() + ".context";
private static final ServerRequestObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultServerRequestObservationConvention(); private static final String CURRENT_OBSERVATION_ATTRIBUTE =
ServerHttpObservationFilter.class.getName() + ".observation";
private static final String CURRENT_OBSERVATION_ATTRIBUTE = ServerHttpObservationFilter.class.getName() + ".observation"; private static final ServerRequestObservationConvention DEFAULT_OBSERVATION_CONVENTION =
new DefaultServerRequestObservationConvention();
private final ObservationRegistry observationRegistry; private final ObservationRegistry observationRegistry;
private final ServerRequestObservationConvention observationConvention; private final ServerRequestObservationConvention observationConvention;
/** /**
* Create an {@code HttpRequestsObservationFilter} that records observations * Create an {@code HttpRequestsObservationFilter} that records observations
* against the given {@link ObservationRegistry}. The default * against the given {@link ObservationRegistry}. The default
@ -89,14 +93,6 @@ public class ServerHttpObservationFilter extends OncePerRequestFilter {
this.observationConvention = observationConvention; this.observationConvention = observationConvention;
} }
/**
* Get the current {@link ServerRequestObservationContext observation context} from the given request, if available.
* @param request the current request
* @return the current observation context
*/
public static Optional<ServerRequestObservationContext> findObservationContext(HttpServletRequest request) {
return Optional.ofNullable((ServerRequestObservationContext) request.getAttribute(CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE));
}
@Override @Override
protected boolean shouldNotFilterAsyncDispatch() { protected boolean shouldNotFilterAsyncDispatch() {
@ -150,8 +146,9 @@ public class ServerHttpObservationFilter extends OncePerRequestFilter {
Observation observation = (Observation) request.getAttribute(CURRENT_OBSERVATION_ATTRIBUTE); Observation observation = (Observation) request.getAttribute(CURRENT_OBSERVATION_ATTRIBUTE);
if (observation == null) { if (observation == null) {
ServerRequestObservationContext context = new ServerRequestObservationContext(request, response); ServerRequestObservationContext context = new ServerRequestObservationContext(request, response);
observation = ServerHttpObservationDocumentation.HTTP_SERVLET_SERVER_REQUESTS.observation(this.observationConvention, observation = ServerHttpObservationDocumentation.HTTP_SERVLET_SERVER_REQUESTS.observation(
DEFAULT_OBSERVATION_CONVENTION, () -> context, this.observationRegistry).start(); this.observationConvention, DEFAULT_OBSERVATION_CONVENTION, () -> context, this.observationRegistry)
.start();
request.setAttribute(CURRENT_OBSERVATION_ATTRIBUTE, observation); request.setAttribute(CURRENT_OBSERVATION_ATTRIBUTE, observation);
if (!observation.isNoop()) { if (!observation.isNoop()) {
request.setAttribute(CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE, observation.getContext()); request.setAttribute(CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE, observation.getContext());
@ -160,14 +157,32 @@ public class ServerHttpObservationFilter extends OncePerRequestFilter {
return observation; return observation;
} }
static @Nullable Throwable unwrapServletException(Throwable ex) {
return (ex instanceof ServletException) ? ex.getCause() : ex; /**
* Get the current {@link ServerRequestObservationContext observation context} from the given request, if available.
* @param request the current request
* @return the current observation context
*/
public static Optional<ServerRequestObservationContext> findObservationContext(HttpServletRequest request) {
return Optional.ofNullable(
(ServerRequestObservationContext) request.getAttribute(CURRENT_OBSERVATION_CONTEXT_ATTRIBUTE));
} }
static @Nullable Throwable fetchException(ServletRequest request) { static @Nullable Throwable fetchException(ServletRequest request) {
return (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION); return (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);
} }
static Throwable unwrapServletException(Throwable ex) {
if (ex instanceof ServletException) {
Throwable cause = ex.getCause();
if (cause != null) {
return cause;
}
}
return ex;
}
private static class ObservationAsyncListener implements AsyncListener { private static class ObservationAsyncListener implements AsyncListener {
private final Observation currentObservation; private final Observation currentObservation;
@ -195,7 +210,6 @@ public class ServerHttpObservationFilter extends OncePerRequestFilter {
public void onError(AsyncEvent event) { public void onError(AsyncEvent event) {
this.currentObservation.error(unwrapServletException(event.getThrowable())); this.currentObservation.error(unwrapServletException(event.getThrowable()));
} }
} }
} }

Loading…
Cancel
Save