summaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorJon Marius Venstad <jonmv@users.noreply.github.com>2020-09-29 07:45:53 +0200
committerGitHub <noreply@github.com>2020-09-29 07:45:53 +0200
commit09bf1d5f22a7ae98191c94e9be591994b5125557 (patch)
treeed801772c8fcc65b3db1f8a9708bb4a72773d626 /container-core
parentb8dcc910a0b63671e95ede3f350be4fd39a91e9c (diff)
parent6c2b2cb1cea66f7f9dbdb7ac366bdeda00194c60 (diff)
Merge pull request #14554 from vespa-engine/jonmv/async-doc-v1-implementation
Jonmv/async doc v1 implementation
Diffstat (limited to 'container-core')
-rw-r--r--container-core/src/main/java/com/yahoo/container/core/HandlerMetricContextUtil.java54
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java32
2 files changed, 58 insertions, 28 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/ThreadedRequestHandler.java b/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java
index ab768dba0d2..f5f8b428535 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;
}