summaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorArne Juul <arnej@yahoo-inc.com>2017-11-09 21:19:09 +0000
committerArne Juul <arnej@yahoo-inc.com>2017-11-13 07:37:06 +0000
commit7af8b3f0d2e4bbf5fcb6887220a3f15cbdefdf6a (patch)
tree0275ac0ff976c0e2c795848a20d26f87776c1fd5 /container-core
parent7dc5186f858d59686bf2f0ceb052ccd5e30ada38 (diff)
add metrics for handled requests
Diffstat (limited to 'container-core')
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/ThreadedRequestHandler.java25
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() {