diff options
author | Arne Juul <arnej@yahoo-inc.com> | 2017-11-09 21:19:09 +0000 |
---|---|---|
committer | Arne Juul <arnej@yahoo-inc.com> | 2017-11-13 07:37:06 +0000 |
commit | 7af8b3f0d2e4bbf5fcb6887220a3f15cbdefdf6a (patch) | |
tree | 0275ac0ff976c0e2c795848a20d26f87776c1fd5 /container-core | |
parent | 7dc5186f858d59686bf2f0ceb052ccd5e30ada38 (diff) |
add metrics for handled requests
Diffstat (limited to 'container-core')
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java | 25 |
1 files changed, 24 insertions, 1 deletions
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 7142449f3d4..686cc39180e 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 @@ -2,10 +2,13 @@ package com.yahoo.container.jdisc; import com.google.inject.Inject; +import com.yahoo.concurrent.CopyOnWriteHashMap; 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; @@ -22,6 +25,7 @@ import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; +import static java.util.Collections.singletonMap; import javax.annotation.concurrent.GuardedBy; @@ -75,6 +79,21 @@ public abstract class ThreadedRequestHandler extends AbstractRequestHandler { this.allowAsyncResponse = allowAsyncResponse; } + private Map<String, Metric.Context> handlerContexts = new CopyOnWriteHashMap<>(); + private Metric.Context contextFor(BindingMatch match) { + if (match == null) return null; + UriPattern matched = match.matched(); + if (matched == null) return null; + String name = matched.toString(); + Metric.Context context = handlerContexts.get(name); + if (context == null) { + Map<String, String> dimensions = singletonMap("handler", name); + context = this.metric.createContext(dimensions); + handlerContexts.put(name, context); + } + return context; + } + /** * Handles a request by assigning a worker thread to it. * @@ -82,6 +101,7 @@ public abstract class ThreadedRequestHandler extends AbstractRequestHandler { */ @Override public final ContentChannel handleRequest(Request request, ResponseHandler responseHandler) { + metric.add("container.handled.requests", 1, contextFor(request.getBindingMatch())); if (request.getTimeout(TimeUnit.SECONDS) == null) { Duration timeout = getTimeout(); if (timeout != null) { @@ -173,7 +193,10 @@ public abstract class ThreadedRequestHandler extends AbstractRequestHandler { @Override public ContentChannel handleResponse(Response response) { if ( tryHasResponded()) throw new IllegalStateException("Response already handled"); - return responseHandler.handleResponse(response); + ContentChannel cc = responseHandler.handleResponse(response); + long millis = request.container().currentTimeMillis() - request.creationTime(TimeUnit.MILLISECONDS); + metric.set("container.handled.latency", millis, contextFor(request.getBindingMatch())); + return cc; } private boolean tryHasResponded() { |