From 7c91a519d21689b66680c20af239d0882c7ade8c Mon Sep 17 00:00:00 2001 From: Bjørn Christian Seime Date: Wed, 4 Jul 2018 14:53:26 +0200 Subject: Add matched binding as dimension when available --- .../http/server/jetty/HttpRequestDispatch.java | 7 +++--- .../server/jetty/JDiscFilterInvokerFilter.java | 2 +- .../jdisc/http/server/jetty/JDiscHttpServlet.java | 9 ++++---- .../http/server/jetty/JDiscServerConnector.java | 7 +++--- .../jdisc/http/server/jetty/JettyHttpServer.java | 1 + .../jdisc/http/server/jetty/MetricReporter.java | 27 +++++++++++++++++----- 6 files changed, 36 insertions(+), 17 deletions(-) diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java index db7670b604a..a07ad08d797 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java @@ -2,7 +2,6 @@ package com.yahoo.jdisc.http.server.jetty; import com.yahoo.container.logging.AccessLogEntry; -import com.yahoo.jdisc.Metric.Context; import com.yahoo.jdisc.References; import com.yahoo.jdisc.ResourceReference; import com.yahoo.jdisc.Response; @@ -22,6 +21,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.atomic.AtomicBoolean; @@ -54,7 +54,7 @@ class HttpRequestDispatch { public HttpRequestDispatch(JDiscContext jDiscContext, AccessLogEntry accessLogEntry, - Context metricContext, + Map requestMetricDimensions, HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws IOException { this.jDiscContext = jDiscContext; @@ -62,7 +62,7 @@ class HttpRequestDispatch { requestHandler = newRequestHandler(jDiscContext, accessLogEntry, servletRequest); this.jettyRequest = (Request) servletRequest; - this.metricReporter = new MetricReporter(jDiscContext.metric, metricContext, jettyRequest.getTimeStamp()); + this.metricReporter = new MetricReporter(jDiscContext.metric, requestMetricDimensions, jettyRequest.getTimeStamp()); honourMaxKeepAliveRequests(); this.servletResponseController = new ServletResponseController( servletRequest, @@ -159,6 +159,7 @@ class HttpRequestDispatch { try (ResourceReference ref = References.fromResource(jdiscRequest)) { HttpRequestFactory.copyHeaders(jettyRequest, jdiscRequest); requestContentChannel = requestHandler.handleRequest(jdiscRequest, servletResponseController.responseHandler); + metricReporter.setBindingMatch(jdiscRequest.getBindingMatch()); } ServletInputStream servletInputStream = jettyRequest.getInputStream(); diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscFilterInvokerFilter.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscFilterInvokerFilter.java index ccac5e327fc..7b4bdc3fc8d 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscFilterInvokerFilter.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscFilterInvokerFilter.java @@ -127,7 +127,7 @@ class JDiscFilterInvokerFilter implements Filter { final AccessLogEntry accessLogEntry = null; // Not used in this context. return new HttpRequestDispatch(jDiscContext, accessLogEntry, - getConnector(request).getRequestMetricContext(request), + getConnector(request).getRequestMetricDimensions(request), request, response); } catch (IOException e) { throw throwUnchecked(e); diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscHttpServlet.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscHttpServlet.java index 2f5fe7612c8..3b81dd94e11 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscHttpServlet.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscHttpServlet.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.Enumeration; import java.util.HashSet; +import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -90,7 +91,7 @@ class JDiscHttpServlet extends HttpServlet { throws ServletException, IOException { request.setAttribute(JDiscServerConnector.REQUEST_ATTRIBUTE, getConnector(request)); - Metric.Context metricContext = getMetricContext(request); + Metric.Context metricContext = context.metric.createContext(getRequestMetricDimensions(request)); context.metric.add(JettyHttpServer.Metrics.NUM_REQUESTS, 1, metricContext); context.metric.add(JettyHttpServer.Metrics.JDISC_HTTP_REQUESTS, 1, metricContext); context.metric.add(JettyHttpServer.Metrics.MANHATTAN_NUM_REQUESTS, 1, metricContext); @@ -113,7 +114,7 @@ class JDiscHttpServlet extends HttpServlet { try { switch (request.getDispatcherType()) { case REQUEST: - new HttpRequestDispatch(context, accessLogEntry, getMetricContext(request), request, response) + new HttpRequestDispatch(context, accessLogEntry, getRequestMetricDimensions(request), request, response) .dispatch(); break; default: @@ -129,8 +130,8 @@ class JDiscHttpServlet extends HttpServlet { } } - private static Metric.Context getMetricContext(HttpServletRequest request) { - return JDiscServerConnector.fromRequest(request).getRequestMetricContext(request); + private static Map getRequestMetricDimensions(HttpServletRequest request) { + return JDiscServerConnector.fromRequest(request).getRequestMetricDimensions(request); } private static String formatAttributes(final HttpServletRequest request) { diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java index 8825ccdfc60..118079a2fba 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java @@ -15,6 +15,7 @@ import java.lang.reflect.Field; import java.net.Socket; import java.net.SocketException; import java.nio.channels.ServerSocketChannel; +import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import java.util.logging.Level; @@ -123,12 +124,12 @@ class JDiscServerConnector extends ServerConnector { return metricCtx; } - public Metric.Context getRequestMetricContext(HttpServletRequest request) { - Map props = new TreeMap<>(); + public Map getRequestMetricDimensions(HttpServletRequest request) { + Map props = new HashMap<>(); props.put(JettyHttpServer.Metrics.NAME_DIMENSION, connectorName); props.put(JettyHttpServer.Metrics.PORT_DIMENSION, listenPort); props.put(JettyHttpServer.Metrics.METHOD_DIMENSION, request.getMethod()); - return metric.createContext(props); + return props; } public static JDiscServerConnector fromRequest(ServletRequest request) { diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java index f149d6eb34d..24367863fbc 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java @@ -67,6 +67,7 @@ public class JettyHttpServer extends AbstractServerProvider { String NAME_DIMENSION = "serverName"; String PORT_DIMENSION = "serverPort"; String METHOD_DIMENSION = "httpMethod"; + String HANDLER_DIMENSION = "handler"; String NUM_OPEN_CONNECTIONS = "serverNumOpenConnections"; String NUM_CONNECTIONS_OPEN_MAX = "serverConnectionsOpenMax"; diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/MetricReporter.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/MetricReporter.java index ba9c42abd74..00b8b262000 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/MetricReporter.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/MetricReporter.java @@ -3,20 +3,25 @@ package com.yahoo.jdisc.http.server.jetty; import com.yahoo.jdisc.Metric; import com.yahoo.jdisc.Metric.Context; - +import com.yahoo.jdisc.application.BindingMatch; +import com.yahoo.jdisc.application.UriPattern; +import com.yahoo.jdisc.handler.RequestHandler; import com.yahoo.jdisc.http.server.jetty.JettyHttpServer.Metrics; -import org.jetbrains.annotations.Nullable; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; /** * Responsible for metric reporting for JDisc http request handler support. - * @author tonytv + * + * @author Tony Vaagenes */ public class MetricReporter { private final Metric metric; - private final @Nullable Context context; + private volatile Context context; + private final Map requestDimensions; private final long requestStartTime; @@ -24,12 +29,22 @@ public class MetricReporter { private final AtomicBoolean firstSetOfTimeToFirstByte = new AtomicBoolean(true); - public MetricReporter(Metric metric, @Nullable Context context, long requestStartTime) { + public MetricReporter(Metric metric, Map requestDimensions, long requestStartTime) { this.metric = metric; - this.context = context; + this.context = metric.createContext(requestDimensions); + this.requestDimensions = requestDimensions; this.requestStartTime = requestStartTime; } + public void setBindingMatch(BindingMatch bindingMatch) { + if (bindingMatch == null) return; + UriPattern pattern = bindingMatch.matched(); + if (pattern == null) return; + Map combinedDimensions = new HashMap<>(requestDimensions); + combinedDimensions.put(Metrics.HANDLER_DIMENSION, bindingMatch.toString()); + this.context = metric.createContext(combinedDimensions); + } + @SuppressWarnings("deprecation") public void successfulWrite(int numBytes) { setTimeToFirstByteFirstTime(); -- cgit v1.2.3