diff options
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java | 25 | ||||
-rw-r--r-- | jdisc_core/src/main/java/com/yahoo/jdisc/Request.java | 14 |
2 files changed, 36 insertions, 3 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..f6e1c1d6d5a 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.timeElapsed(TimeUnit.MILLISECONDS); + metric.set("container.handled.latency", millis, contextFor(request.getBindingMatch())); + return cc; } private boolean tryHasResponded() { diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/Request.java b/jdisc_core/src/main/java/com/yahoo/jdisc/Request.java index 489a4c3dc10..7a76c588fb4 100644 --- a/jdisc_core/src/main/java/com/yahoo/jdisc/Request.java +++ b/jdisc_core/src/main/java/com/yahoo/jdisc/Request.java @@ -287,7 +287,7 @@ public class Request extends AbstractResource { } /** - * <p>Returns the allocated number of milliseconds that this Request is allowed to exist. If no timeout has been set + * <p>Returns the allocated number of time units that this Request is allowed to exist. If no timeout has been set * for this Request, this method returns <em>null</em>.</p> * * @param unit The unit to return the timeout in. @@ -306,7 +306,7 @@ public class Request extends AbstractResource { * <em>null</em>.</p> * * @param unit The unit to return the time in. - * @return The number of milliseconds left until this Request times out, or <em>null</em>. + * @return The number of time units left until this Request times out, or <em>null</em>. */ public Long timeRemaining(TimeUnit unit) { if (timeout == null) { @@ -316,6 +316,16 @@ public class Request extends AbstractResource { } /** + * <p>Returns the time that this Request has existed so far. + * + * @param unit The unit to return the time in. + * @return The number of time units elapsed since this Request was created. + */ + public long timeElapsed(TimeUnit unit) { + return unit.convert(container().currentTimeMillis() - creationTime, TimeUnit.MILLISECONDS); + } + + /** * <p>Returns the time at which this Request was created. This is whatever value was returned by {@link * Timer#currentTimeMillis()} when constructing this.</p> * |