From acdc2b304e6f45e9ef9a91cc87c32b38786b0f63 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 20 Jul 2022 15:21:09 +0200 Subject: [PATCH 1/2] Uses the new receiver and sender contexts (#2389) Co-authored-by: Violeta Georgieva --- .../src/main/java/reactor/netty/Metrics.java | 4 +- .../MicrometerHttpClientMetricsHandler.java | 99 +++---------------- ...ingReceiverTracingObservationHandler.java} | 25 ++--- ...atingSenderTracingObservationHandler.java} | 25 ++--- .../MicrometerHttpServerMetricsHandler.java | 97 +++--------------- .../observability/ObservabilitySmokeTest.java | 4 +- 6 files changed, 59 insertions(+), 195 deletions(-) rename reactor-netty-http/src/main/java/reactor/netty/http/observability/{ReactorNettyHttpServerTracingObservationHandler.java => ReactorNettyPropagatingReceiverTracingObservationHandler.java} (59%) rename reactor-netty-http/src/main/java/reactor/netty/http/observability/{ReactorNettyHttpClientTracingObservationHandler.java => ReactorNettyPropagatingSenderTracingObservationHandler.java} (63%) diff --git a/reactor-netty-core/src/main/java/reactor/netty/Metrics.java b/reactor-netty-core/src/main/java/reactor/netty/Metrics.java index 3f174afea9..a8fcdd2701 100644 --- a/reactor-netty-core/src/main/java/reactor/netty/Metrics.java +++ b/reactor-netty-core/src/main/java/reactor/netty/Metrics.java @@ -16,7 +16,7 @@ package reactor.netty; import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.core.instrument.observation.TimerObservationHandler; +import io.micrometer.core.instrument.observation.DefaultMeterObservationHandler; import io.micrometer.observation.ObservationHandler; import io.micrometer.observation.ObservationRegistry; import reactor.netty.observability.ReactorNettyTimerObservationHandler; @@ -38,7 +38,7 @@ public class Metrics { OBSERVATION_REGISTRY.observationConfig().observationHandler( new ObservationHandler.FirstMatchingCompositeObservationHandler( new ReactorNettyTimerObservationHandler(REGISTRY), - new TimerObservationHandler(REGISTRY))); + new DefaultMeterObservationHandler(REGISTRY))); } diff --git a/reactor-netty-http/src/main/java/reactor/netty/http/client/MicrometerHttpClientMetricsHandler.java b/reactor-netty-http/src/main/java/reactor/netty/http/client/MicrometerHttpClientMetricsHandler.java index bd7105aed2..9808b64edd 100644 --- a/reactor-netty-http/src/main/java/reactor/netty/http/client/MicrometerHttpClientMetricsHandler.java +++ b/reactor-netty-http/src/main/java/reactor/netty/http/client/MicrometerHttpClientMetricsHandler.java @@ -19,9 +19,7 @@ import io.micrometer.core.instrument.Timer; import io.micrometer.observation.Observation; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; -import io.micrometer.observation.transport.http.HttpClientRequest; -import io.micrometer.observation.transport.http.HttpClientResponse; -import io.micrometer.observation.transport.http.context.HttpClientContext; +import io.micrometer.observation.transport.RequestReplySenderContext; import io.netty.channel.Channel; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponse; @@ -31,7 +29,7 @@ import java.net.SocketAddress; import java.time.Duration; -import java.util.Collection; +import java.util.Objects; import java.util.function.Function; import static reactor.netty.Metrics.OBSERVATION_REGISTRY; @@ -104,7 +102,7 @@ protected void reset() { protected void startRead(HttpResponse msg) { super.startRead(msg); - responseTimeHandlerContext.setResponse(new ObservationHttpClientResponse(msg)); + responseTimeHandlerContext.setResponse(msg); } // writing the request @@ -113,8 +111,7 @@ protected void startRead(HttpResponse msg) { protected void startWrite(HttpRequest msg, Channel channel, @Nullable ContextView contextView) { super.startWrite(msg, channel, contextView); - HttpClientRequest httpClientRequest = new ObservationHttpClientRequest(msg, method, path); - responseTimeHandlerContext = new ResponseTimeHandlerContext(recorder, httpClientRequest, channel.remoteAddress()); + responseTimeHandlerContext = new ResponseTimeHandlerContext(recorder, msg, path, channel.remoteAddress()); responseTimeObservation = Observation.createNotStarted(recorder.name() + RESPONSE_TIME, responseTimeHandlerContext, OBSERVATION_REGISTRY); if (contextView != null && contextView.hasKey(ObservationThreadLocalAccessor.KEY)) { responseTimeObservation.parentObservation(contextView.get(ObservationThreadLocalAccessor.KEY)); @@ -122,79 +119,7 @@ protected void startWrite(HttpRequest msg, Channel channel, @Nullable ContextVie responseTimeObservation.start(); } - static final class ObservationHttpClientRequest implements HttpClientRequest { - - final String method; - final HttpRequest nettyRequest; - final String path; - - ObservationHttpClientRequest(HttpRequest nettyRequest, String method, String path) { - this.method = method; - this.nettyRequest = nettyRequest; - this.path = path; - } - - @Override - public String header(String name) { - return nettyRequest.headers().get(name); - } - - @Override - public void header(String name, String value) { - nettyRequest.headers().set(name, value); - } - - @Override - public Collection headerNames() { - return nettyRequest.headers().names(); - } - - @Override - public String method() { - return method; - } - - @Override - public String path() { - return path; - } - - @Override - public Object unwrap() { - return nettyRequest; - } - - @Override - public String url() { - return nettyRequest.uri(); - } - } - - static final class ObservationHttpClientResponse implements HttpClientResponse { - - final HttpResponse nettyResponse; - - ObservationHttpClientResponse(HttpResponse nettyResponse) { - this.nettyResponse = nettyResponse; - } - - @Override - public Collection headerNames() { - return nettyResponse.headers().names(); - } - - @Override - public int statusCode() { - return nettyResponse.status().code(); - } - - @Override - public Object unwrap() { - return nettyResponse; - } - } - - static final class ResponseTimeHandlerContext extends HttpClientContext implements ReactorNettyHandlerContext { + static final class ResponseTimeHandlerContext extends RequestReplySenderContext implements ReactorNettyHandlerContext { static final String TYPE = "client"; final String method; @@ -205,13 +130,15 @@ static final class ResponseTimeHandlerContext extends HttpClientContext implemen // status might not be known beforehand String status; - ResponseTimeHandlerContext(MicrometerHttpClientMetricsRecorder recorder, HttpClientRequest request, SocketAddress remoteAddress) { - super(request); + ResponseTimeHandlerContext(MicrometerHttpClientMetricsRecorder recorder, HttpRequest request, String path, SocketAddress remoteAddress) { + super((carrier, key, value) -> Objects.requireNonNull(carrier).headers().set(key, value)); this.recorder = recorder; - this.method = request.method(); - this.path = request.path(); + this.method = request.method().name(); + this.path = path; this.remoteAddress = formatSocketAddress(remoteAddress); put(HttpClientRequest.class, request); + setCarrier(request); + setContextualName(this.method); } @Override @@ -232,9 +159,9 @@ public KeyValues getLowCardinalityKeyValues() { } @Override - public HttpClientContext setResponse(HttpClientResponse response) { + public void setResponse(HttpResponse response) { put(HttpClientResponse.class, response); - return super.setResponse(response); + super.setResponse(response); } } } diff --git a/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyHttpServerTracingObservationHandler.java b/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingReceiverTracingObservationHandler.java similarity index 59% rename from reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyHttpServerTracingObservationHandler.java rename to reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingReceiverTracingObservationHandler.java index 54eff69674..e196aedfea 100644 --- a/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyHttpServerTracingObservationHandler.java +++ b/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingReceiverTracingObservationHandler.java @@ -17,35 +17,36 @@ import io.micrometer.common.KeyValue; import io.micrometer.observation.Observation; -import io.micrometer.observation.transport.http.HttpServerRequest; -import io.micrometer.observation.transport.http.context.HttpServerContext; +import io.micrometer.observation.transport.ReceiverContext; import io.micrometer.tracing.Span; import io.micrometer.tracing.Tracer; -import io.micrometer.tracing.handler.HttpServerTracingObservationHandler; -import io.micrometer.tracing.http.HttpServerHandler; +import io.micrometer.tracing.handler.PropagatingReceiverTracingObservationHandler; +import io.micrometer.tracing.propagation.Propagator; +import io.netty.handler.codec.http.HttpRequest; +import reactor.netty.http.server.HttpServerRequest; import reactor.netty.observability.ReactorNettyHandlerContext; /** - * Reactor Netty specific {@link HttpServerTracingObservationHandler} + * Reactor Netty specific {@link PropagatingReceiverTracingObservationHandler}. * * @author Marcin Grzejszczak * @author Violeta Georgieva * @since 1.1.0 */ -public final class ReactorNettyHttpServerTracingObservationHandler extends HttpServerTracingObservationHandler { +public final class ReactorNettyPropagatingReceiverTracingObservationHandler extends PropagatingReceiverTracingObservationHandler> { /** - * Creates a new instance of {@link HttpServerTracingObservationHandler}. + * Creates a new instance of {@link ReactorNettyPropagatingReceiverTracingObservationHandler}. * - * @param tracer tracer - * @param handler http server handler + * @param tracer tracer + * @param propagator tracing propagator */ - public ReactorNettyHttpServerTracingObservationHandler(Tracer tracer, HttpServerHandler handler) { - super(tracer, handler); + public ReactorNettyPropagatingReceiverTracingObservationHandler(Tracer tracer, Propagator propagator) { + super(tracer, propagator); } @Override - public void tagSpan(HttpServerContext context, Span span) { + public void tagSpan(ReceiverContext context, Span span) { for (KeyValue tag : context.getHighCardinalityKeyValues()) { span.tag(tag.getKey(), tag.getValue()); } diff --git a/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyHttpClientTracingObservationHandler.java b/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingSenderTracingObservationHandler.java similarity index 63% rename from reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyHttpClientTracingObservationHandler.java rename to reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingSenderTracingObservationHandler.java index 3a79eb6318..c7a7fac54b 100644 --- a/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyHttpClientTracingObservationHandler.java +++ b/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingSenderTracingObservationHandler.java @@ -17,37 +17,38 @@ import io.micrometer.common.KeyValue; import io.micrometer.observation.Observation; -import io.micrometer.observation.transport.http.HttpClientRequest; -import io.micrometer.observation.transport.http.context.HttpClientContext; +import io.micrometer.observation.transport.SenderContext; import io.micrometer.tracing.Span; import io.micrometer.tracing.Tracer; -import io.micrometer.tracing.handler.HttpClientTracingObservationHandler; -import io.micrometer.tracing.http.HttpClientHandler; +import io.micrometer.tracing.handler.PropagatingSenderTracingObservationHandler; +import io.micrometer.tracing.propagation.Propagator; +import io.netty.handler.codec.http.HttpRequest; +import reactor.netty.http.client.HttpClientRequest; import reactor.netty.observability.ReactorNettyHandlerContext; import static reactor.netty.Metrics.REMOTE_ADDRESS; /** - * Reactor Netty specific {@link HttpClientTracingObservationHandler} + * Reactor Netty specific {@link PropagatingSenderTracingObservationHandler} * * @author Marcin Grzejszczak * @author Violeta Georgieva * @since 1.1.0 */ -public final class ReactorNettyHttpClientTracingObservationHandler extends HttpClientTracingObservationHandler { +public final class ReactorNettyPropagatingSenderTracingObservationHandler extends PropagatingSenderTracingObservationHandler> { /** - * Creates a new instance of {@link HttpClientTracingObservationHandler}. + * Creates a new instance of {@link ReactorNettyPropagatingSenderTracingObservationHandler}. * - * @param tracer tracer - * @param handler http client handler + * @param tracer tracer + * @param propagator tracing propagator */ - public ReactorNettyHttpClientTracingObservationHandler(Tracer tracer, HttpClientHandler handler) { - super(tracer, handler); + public ReactorNettyPropagatingSenderTracingObservationHandler(Tracer tracer, Propagator propagator) { + super(tracer, propagator); } @Override - public void tagSpan(HttpClientContext context, Span span) { + public void tagSpan(SenderContext context, Span span) { for (KeyValue tag : context.getHighCardinalityKeyValues()) { span.tag(tag.getKey(), tag.getValue()); } diff --git a/reactor-netty-http/src/main/java/reactor/netty/http/server/MicrometerHttpServerMetricsHandler.java b/reactor-netty-http/src/main/java/reactor/netty/http/server/MicrometerHttpServerMetricsHandler.java index 2792ddb260..a89558d4c1 100644 --- a/reactor-netty-http/src/main/java/reactor/netty/http/server/MicrometerHttpServerMetricsHandler.java +++ b/reactor-netty-http/src/main/java/reactor/netty/http/server/MicrometerHttpServerMetricsHandler.java @@ -18,16 +18,14 @@ import io.micrometer.common.KeyValues; import io.micrometer.core.instrument.Timer; import io.micrometer.observation.Observation; -import io.micrometer.observation.transport.http.HttpServerRequest; -import io.micrometer.observation.transport.http.HttpServerResponse; -import io.micrometer.observation.transport.http.context.HttpServerContext; +import io.micrometer.observation.transport.RequestReplyReceiverContext; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponse; import reactor.netty.observability.ReactorNettyHandlerContext; import reactor.util.annotation.Nullable; import java.time.Duration; -import java.util.Collection; +import java.util.Objects; import java.util.function.Function; import static reactor.netty.Metrics.OBSERVATION_REGISTRY; @@ -97,7 +95,8 @@ protected void startRead(HttpServerOperations ops, String path, String method) { responseTimeHandlerContext = new ResponseTimeHandlerContext( recorder, - new ObservationHttpServerRequest(ops.nettyRequest, method, path)); + path, + ops.nettyRequest); responseTimeObservation = Observation.start(this.responseTimeName, responseTimeHandlerContext, OBSERVATION_REGISTRY); } @@ -109,81 +108,15 @@ protected void startWrite(HttpServerOperations ops, String path, String method, if (responseTimeObservation == null) { responseTimeHandlerContext = new ResponseTimeHandlerContext( recorder, - new ObservationHttpServerRequest(ops.nettyRequest, method, path)); + path, + ops.nettyRequest); responseTimeObservation = Observation.start(this.responseTimeName, responseTimeHandlerContext, OBSERVATION_REGISTRY); } - responseTimeHandlerContext.setResponse(new ObservationHttpServerResponse(ops.nettyResponse)); + responseTimeHandlerContext.setResponse(ops.nettyResponse); // TODO: Is this OK? responseTimeHandlerContext.status = status; } - static final class ObservationHttpServerRequest implements HttpServerRequest { - - final String method; - final HttpRequest nettyRequest; - final String path; - - ObservationHttpServerRequest(HttpRequest nettyRequest, String method, String path) { - this.method = method; - this.nettyRequest = nettyRequest; - this.path = path; - } - - @Override - public String header(String name) { - return nettyRequest.headers().get(name); - } - - @Override - public Collection headerNames() { - return nettyRequest.headers().names(); - } - - @Override - public String method() { - return method; - } - - @Override - public String path() { - return path; - } - - @Override - public Object unwrap() { - return nettyRequest; - } - - @Override - public String url() { - return nettyRequest.uri(); - } - } - - static final class ObservationHttpServerResponse implements HttpServerResponse { - - final HttpResponse nettyResponse; - - ObservationHttpServerResponse(HttpResponse nettyResponse) { - this.nettyResponse = nettyResponse; - } - - @Override - public Collection headerNames() { - return nettyResponse.headers().names(); - } - - @Override - public int statusCode() { - return nettyResponse.status().code(); - } - - @Override - public Object unwrap() { - return nettyResponse; - } - } - - static final class ResponseTimeHandlerContext extends HttpServerContext implements ReactorNettyHandlerContext { + static final class ResponseTimeHandlerContext extends RequestReplyReceiverContext implements ReactorNettyHandlerContext { static final String TYPE = "server"; final String method; @@ -193,12 +126,14 @@ static final class ResponseTimeHandlerContext extends HttpServerContext implemen // status might not be known beforehand String status; - ResponseTimeHandlerContext(MicrometerHttpServerMetricsRecorder recorder, HttpServerRequest request) { - super(request); + ResponseTimeHandlerContext(MicrometerHttpServerMetricsRecorder recorder, String path, HttpRequest request) { + super((carrier, key) -> Objects.requireNonNull(carrier).headers().get(key)); this.recorder = recorder; - this.method = request.method(); - this.path = request.path(); + this.method = request.method().name(); + this.path = path; put(HttpServerRequest.class, request); + setCarrier(request); + setContextualName(this.method); } @Override @@ -218,9 +153,9 @@ public KeyValues getLowCardinalityKeyValues() { } @Override - public HttpServerContext setResponse(HttpServerResponse response) { + public void setResponse(HttpResponse response) { + super.setResponse(response); put(HttpServerResponse.class, response); - return super.setResponse(response); } } } diff --git a/reactor-netty-http/src/test/java/reactor/netty/http/observability/ObservabilitySmokeTest.java b/reactor-netty-http/src/test/java/reactor/netty/http/observability/ObservabilitySmokeTest.java index a094edccf6..c2ece37613 100644 --- a/reactor-netty-http/src/test/java/reactor/netty/http/observability/ObservabilitySmokeTest.java +++ b/reactor-netty-http/src/test/java/reactor/netty/http/observability/ObservabilitySmokeTest.java @@ -96,8 +96,8 @@ public BiConsumer defaultHandler = timerRecordingHandlers.removeLast(); timerRecordingHandlers.addLast(new ReactorNettyTracingObservationHandler(bb.getTracer())); timerRecordingHandlers.addLast(defaultHandler); - timerRecordingHandlers.addFirst(new ReactorNettyHttpClientTracingObservationHandler(bb.getTracer(), bb.getHttpClientHandler())); - timerRecordingHandlers.addFirst(new ReactorNettyHttpServerTracingObservationHandler(bb.getTracer(), bb.getHttpServerHandler())); + timerRecordingHandlers.addFirst(new ReactorNettyPropagatingSenderTracingObservationHandler(bb.getTracer(), bb.getPropagator())); + timerRecordingHandlers.addFirst(new ReactorNettyPropagatingReceiverTracingObservationHandler(bb.getTracer(), bb.getPropagator())); }; } From e947e398b5ac8388cde8686d19cee25a69fd92e6 Mon Sep 17 00:00:00 2001 From: Violeta Georgieva Date: Wed, 20 Jul 2022 16:30:17 +0300 Subject: [PATCH 2/2] Polish --- .../client/MicrometerHttpClientMetricsHandler.java | 3 ++- ...ropagatingReceiverTracingObservationHandler.java | 3 ++- ...yPropagatingSenderTracingObservationHandler.java | 3 ++- .../server/MicrometerHttpServerMetricsHandler.java | 13 ++++--------- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/reactor-netty-http/src/main/java/reactor/netty/http/client/MicrometerHttpClientMetricsHandler.java b/reactor-netty-http/src/main/java/reactor/netty/http/client/MicrometerHttpClientMetricsHandler.java index 9808b64edd..a0d6b0cce8 100644 --- a/reactor-netty-http/src/main/java/reactor/netty/http/client/MicrometerHttpClientMetricsHandler.java +++ b/reactor-netty-http/src/main/java/reactor/netty/http/client/MicrometerHttpClientMetricsHandler.java @@ -119,7 +119,8 @@ protected void startWrite(HttpRequest msg, Channel channel, @Nullable ContextVie responseTimeObservation.start(); } - static final class ResponseTimeHandlerContext extends RequestReplySenderContext implements ReactorNettyHandlerContext { + static final class ResponseTimeHandlerContext extends RequestReplySenderContext + implements ReactorNettyHandlerContext { static final String TYPE = "client"; final String method; diff --git a/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingReceiverTracingObservationHandler.java b/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingReceiverTracingObservationHandler.java index e196aedfea..d67493703a 100644 --- a/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingReceiverTracingObservationHandler.java +++ b/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingReceiverTracingObservationHandler.java @@ -33,7 +33,8 @@ * @author Violeta Georgieva * @since 1.1.0 */ -public final class ReactorNettyPropagatingReceiverTracingObservationHandler extends PropagatingReceiverTracingObservationHandler> { +public final class ReactorNettyPropagatingReceiverTracingObservationHandler + extends PropagatingReceiverTracingObservationHandler> { /** * Creates a new instance of {@link ReactorNettyPropagatingReceiverTracingObservationHandler}. diff --git a/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingSenderTracingObservationHandler.java b/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingSenderTracingObservationHandler.java index c7a7fac54b..4dc370eb59 100644 --- a/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingSenderTracingObservationHandler.java +++ b/reactor-netty-http/src/main/java/reactor/netty/http/observability/ReactorNettyPropagatingSenderTracingObservationHandler.java @@ -35,7 +35,8 @@ * @author Violeta Georgieva * @since 1.1.0 */ -public final class ReactorNettyPropagatingSenderTracingObservationHandler extends PropagatingSenderTracingObservationHandler> { +public final class ReactorNettyPropagatingSenderTracingObservationHandler + extends PropagatingSenderTracingObservationHandler> { /** * Creates a new instance of {@link ReactorNettyPropagatingSenderTracingObservationHandler}. diff --git a/reactor-netty-http/src/main/java/reactor/netty/http/server/MicrometerHttpServerMetricsHandler.java b/reactor-netty-http/src/main/java/reactor/netty/http/server/MicrometerHttpServerMetricsHandler.java index a89558d4c1..e73c035b53 100644 --- a/reactor-netty-http/src/main/java/reactor/netty/http/server/MicrometerHttpServerMetricsHandler.java +++ b/reactor-netty-http/src/main/java/reactor/netty/http/server/MicrometerHttpServerMetricsHandler.java @@ -93,10 +93,7 @@ protected void recordWrite(HttpServerOperations ops, String path, String method, protected void startRead(HttpServerOperations ops, String path, String method) { super.startRead(ops, path, method); - responseTimeHandlerContext = new ResponseTimeHandlerContext( - recorder, - path, - ops.nettyRequest); + responseTimeHandlerContext = new ResponseTimeHandlerContext(recorder, path, ops.nettyRequest); responseTimeObservation = Observation.start(this.responseTimeName, responseTimeHandlerContext, OBSERVATION_REGISTRY); } @@ -106,17 +103,15 @@ protected void startWrite(HttpServerOperations ops, String path, String method, super.startWrite(ops, path, method, status); if (responseTimeObservation == null) { - responseTimeHandlerContext = new ResponseTimeHandlerContext( - recorder, - path, - ops.nettyRequest); + responseTimeHandlerContext = new ResponseTimeHandlerContext(recorder, path, ops.nettyRequest); responseTimeObservation = Observation.start(this.responseTimeName, responseTimeHandlerContext, OBSERVATION_REGISTRY); } responseTimeHandlerContext.setResponse(ops.nettyResponse); // TODO: Is this OK? responseTimeHandlerContext.status = status; } - static final class ResponseTimeHandlerContext extends RequestReplyReceiverContext implements ReactorNettyHandlerContext { + static final class ResponseTimeHandlerContext extends RequestReplyReceiverContext + implements ReactorNettyHandlerContext { static final String TYPE = "server"; final String method;