diff options
author | Jon Marius Venstad <jonmv@users.noreply.github.com> | 2020-10-01 15:54:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-01 15:54:32 +0200 |
commit | 1970a319908423d93164b5985a362285610eac9d (patch) | |
tree | 77e63e26dca5c105b836f17de4661ce2279bf5e1 /container-core | |
parent | 9c1cda0715260283b6a21081dc286ef86e3ab7b9 (diff) | |
parent | 6792ae6918439c535ff518107ad17351bb27fed1 (diff) |
Merge pull request #14634 from vespa-engine/jonmv/async-feed-handler
Async document v1
Diffstat (limited to 'container-core')
3 files changed, 59 insertions, 29 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/core/HandlerMetricContextUtil.java b/container-core/src/main/java/com/yahoo/container/core/HandlerMetricContextUtil.java new file mode 100644 index 00000000000..cfb48339dbe --- /dev/null +++ b/container-core/src/main/java/com/yahoo/container/core/HandlerMetricContextUtil.java @@ -0,0 +1,54 @@ +package com.yahoo.container.core; + +import com.yahoo.jdisc.Metric; +import com.yahoo.jdisc.Request; +import com.yahoo.jdisc.application.BindingMatch; +import com.yahoo.jdisc.application.UriPattern; +import com.yahoo.jdisc.handler.ResponseHandler; + +import java.net.URI; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Common HTTP request handler metrics code. + * + * @author jonmv + */ +public class HandlerMetricContextUtil { + + public static void onHandle(Request request, Metric metric, Class<?> handlerClass) { + metric.add("handled.requests", 1, contextFor(request, metric, handlerClass)); + } + + public static void onHandled(Request request, Metric metric, Class<?> handlerClass) { + metric.set("handled.latency", request.timeElapsed(TimeUnit.MILLISECONDS), contextFor(request, metric, handlerClass)); + } + + public static Metric.Context contextFor(Request request, Metric metric, Class<?> handlerClass) { + return contextFor(request, Map.of(), metric, handlerClass); + } + + public static Metric.Context contextFor(Request request, Map<String, String> extraDimensions, Metric metric, Class<?> handlerClass) { + BindingMatch<?> match = request.getBindingMatch(); + if (match == null) return null; + UriPattern matched = match.matched(); + if (matched == null) return null; + String name = matched.toString(); + String endpoint = request.headers().containsKey("Host") ? request.headers().get("Host").get(0) : null; + + Map<String, String> dimensions = new HashMap<>(); + dimensions.put("handler", name); + if (endpoint != null) { + dimensions.put("endpoint", endpoint); + } + URI uri = request.getUri(); + dimensions.put("scheme", uri.getScheme()); + dimensions.put("port", Integer.toString(uri.getPort())); + dimensions.put("handler-name", handlerClass.getName()); + dimensions.putAll(extraDimensions); + return metric.createContext(dimensions); + } + +} diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/RequestHandlerTestDriver.java b/container-core/src/main/java/com/yahoo/container/jdisc/RequestHandlerTestDriver.java index 8243ad07760..a3e264c16ee 100644 --- a/container-core/src/main/java/com/yahoo/container/jdisc/RequestHandlerTestDriver.java +++ b/container-core/src/main/java/com/yahoo/container/jdisc/RequestHandlerTestDriver.java @@ -127,7 +127,7 @@ public class RequestHandlerTestDriver implements AutoCloseable { public String read() { ByteBuffer nextBuffer = content.read(); if (nextBuffer == null) return null; // end of transmission - return Charset.forName("utf-8").decode(nextBuffer).toString(); + return StandardCharsets.UTF_8.decode(nextBuffer).toString(); } /** Returns the number of bytes available in the handler right now */ diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java b/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java index 9387e03e11b..323935e2a26 100644 --- a/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java +++ b/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java @@ -6,8 +6,6 @@ import com.yahoo.jdisc.Metric; import com.yahoo.jdisc.Request; import com.yahoo.jdisc.ResourceReference; import com.yahoo.jdisc.Response; -import com.yahoo.jdisc.application.BindingMatch; -import com.yahoo.jdisc.application.UriPattern; import com.yahoo.jdisc.handler.AbstractRequestHandler; import com.yahoo.jdisc.handler.BufferedContentChannel; import com.yahoo.jdisc.handler.ContentChannel; @@ -15,10 +13,9 @@ import com.yahoo.jdisc.handler.OverloadException; import com.yahoo.jdisc.handler.ReadableContentChannel; import com.yahoo.jdisc.handler.ResponseDispatch; import com.yahoo.jdisc.handler.ResponseHandler; +import com.yahoo.container.core.HandlerMetricContextUtil; -import java.net.URI; import java.time.Duration; -import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.concurrent.Executor; @@ -79,29 +76,9 @@ public abstract class ThreadedRequestHandler extends AbstractRequestHandler { } Metric.Context contextFor(Request request, Map<String, String> extraDimensions) { - BindingMatch<?> match = request.getBindingMatch(); - if (match == null) return null; - UriPattern matched = match.matched(); - if (matched == null) return null; - String name = matched.toString(); - String endpoint = request.headers().containsKey("Host") ? request.headers().get("Host").get(0) : null; - - Map<String, String> dimensions = new HashMap<>(); - dimensions.put("handler", name); - if (endpoint != null) { - dimensions.put("endpoint", endpoint); - } - URI uri = request.getUri(); - dimensions.put("scheme", uri.getScheme()); - dimensions.put("port", Integer.toString(uri.getPort())); - String handlerClassName = getClass().getName(); - dimensions.put("handler-name", handlerClassName); - dimensions.putAll(extraDimensions); - return this.metric.createContext(dimensions); + return HandlerMetricContextUtil.contextFor(request, extraDimensions, metric, getClass()); } - private Metric.Context contextFor(Request request) { return contextFor(request, Map.of()); } - /** * Handles a request by assigning a worker thread to it. * @@ -109,7 +86,7 @@ public abstract class ThreadedRequestHandler extends AbstractRequestHandler { */ @Override public final ContentChannel handleRequest(Request request, ResponseHandler responseHandler) { - metric.add("handled.requests", 1, contextFor(request)); + HandlerMetricContextUtil.onHandle(request, metric, getClass()); if (request.getTimeout(TimeUnit.SECONDS) == null) { Duration timeout = getTimeout(); if (timeout != null) { @@ -212,8 +189,7 @@ public abstract class ThreadedRequestHandler extends AbstractRequestHandler { public ContentChannel handleResponse(Response response) { if ( tryHasResponded()) throw new IllegalStateException("Response already handled"); ContentChannel cc = responseHandler.handleResponse(response); - long millis = request.timeElapsed(TimeUnit.MILLISECONDS); - metric.set("handled.latency", millis, contextFor(request)); + HandlerMetricContextUtil.onHandled(request, metric, getClass()); return cc; } |