summaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/container/core/HandlerMetricContextUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-core/src/main/java/com/yahoo/container/core/HandlerMetricContextUtil.java')
-rw-r--r--container-core/src/main/java/com/yahoo/container/core/HandlerMetricContextUtil.java54
1 files changed, 54 insertions, 0 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);
+ }
+
+}