From 6861807fc85d4ae0433d3849fccd47d7c3b32e30 Mon Sep 17 00:00:00 2001 From: Bjørn Christian Seime Date: Thu, 31 Jan 2019 13:37:44 +0100 Subject: Add metric for http requests with client version as dimension --- .../documentapi/metrics/DocumentApiMetrics.java | 11 ++++++ .../com/yahoo/vespa/http/server/FeedHandler.java | 43 ++++++++++------------ 2 files changed, 31 insertions(+), 23 deletions(-) (limited to 'vespaclient-container-plugin') diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/documentapi/metrics/DocumentApiMetrics.java b/vespaclient-container-plugin/src/main/java/com/yahoo/documentapi/metrics/DocumentApiMetrics.java index 28fcd027d2b..eabd43bccbf 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/documentapi/metrics/DocumentApiMetrics.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/documentapi/metrics/DocumentApiMetrics.java @@ -21,7 +21,9 @@ public class DocumentApiMetrics { private final Counter feeds; private final Gauge feedLatency; + private final Counter feedRequests; private final Map> points = new HashMap<>(); + private final Map versionPointCache = new HashMap<>(); public DocumentApiMetrics(MetricReceiver metricReceiver, String apiName) { Map dimensions = new HashMap<>(); @@ -37,6 +39,7 @@ public class DocumentApiMetrics { feeds = metricReceiver.declareCounter("feed.operations"); feedLatency = metricReceiver.declareGauge("feed.latency"); + feedRequests = metricReceiver.declareCounter("feed.http-requests"); } public void reportSuccessful(DocumentOperationType documentOperationType, double latencyInSeconds) { @@ -56,4 +59,12 @@ public class DocumentApiMetrics { feeds.add(point); } + public void reportClientVersion(String version) { + if (version != null) { + feedRequests.add(versionPointCache.computeIfAbsent(version, v -> new Point(Map.of("client-version", v)))); + } else { + feedRequests.add(); + } + } + } diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedHandler.java b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedHandler.java index bd7d195b48b..3406a663d89 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedHandler.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedHandler.java @@ -2,46 +2,27 @@ package com.yahoo.vespa.http.server; import com.yahoo.collections.Tuple2; -import com.yahoo.concurrent.ThreadFactoryFactory; import com.yahoo.container.handler.ThreadpoolConfig; import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.container.jdisc.LoggingRequestHandler; import com.yahoo.container.jdisc.messagebus.SessionCache; -import com.yahoo.document.DocumentTypeManager; import com.yahoo.document.config.DocumentmanagerConfig; import com.yahoo.documentapi.metrics.DocumentApiMetrics; -import com.yahoo.jdisc.Metric; -import com.yahoo.jdisc.http.HttpResponse.Status; -import com.yahoo.log.LogLevel; import com.yahoo.messagebus.ReplyHandler; -import com.yahoo.messagebus.SourceSessionParams; import com.yahoo.metrics.simple.MetricReceiver; -import com.yahoo.net.HostName; import com.yahoo.vespa.http.client.core.Headers; -import com.yahoo.vespa.http.client.core.OperationStatus; -import com.yahoo.yolean.Exceptions; import javax.inject.Inject; import java.io.IOException; import java.io.InputStream; -import java.net.InetSocketAddress; -import java.net.SocketAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; -import java.util.Map; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadLocalRandom; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; /** @@ -53,7 +34,9 @@ public class FeedHandler extends LoggingRequestHandler { protected final ReplyHandler feedReplyHandler; private static final List serverSupportedVersions = Collections.unmodifiableList(Arrays.asList(3)); + private static final Pattern USER_AGENT_PATTERN = Pattern.compile("vespa-http-client \\((.+)\\)"); private final FeedHandlerV3 feedHandlerV3; + private final DocumentApiMetrics metricsHelper; @Inject public FeedHandler( @@ -63,7 +46,7 @@ public class FeedHandler extends LoggingRequestHandler { ThreadpoolConfig threadpoolConfig, MetricReceiver metricReceiver) throws Exception { super(parentCtx); - DocumentApiMetrics metricsHelper = new DocumentApiMetrics(metricReceiver, "vespa.http.server"); + metricsHelper = new DocumentApiMetrics(metricReceiver, "vespa.http.server"); feedHandlerV3 = new FeedHandlerV3(parentCtx, documentManagerConfig, sessionCache, threadpoolConfig, metricsHelper); feedReplyHandler = new FeedReplyReader(parentCtx.getMetric(), metricsHelper); } @@ -121,6 +104,7 @@ public class FeedHandler extends LoggingRequestHandler { @Override public HttpResponse handle(HttpRequest request) { + metricsHelper.reportClientVersion(findClientVersion(request).orElse(null)); Tuple2 protocolVersion = checkProtocolVersion(request); if (protocolVersion.first != null) { @@ -129,6 +113,19 @@ public class FeedHandler extends LoggingRequestHandler { return feedHandlerV3.handle(request); } + private static Optional findClientVersion(HttpRequest request) { + String versionHeader = request.getHeader(Headers.CLIENT_VERSION); + if (versionHeader != null) { + return Optional.of(versionHeader); + } + String userAgentHeader = request.getHeader("User-Agent"); + Matcher matcher = USER_AGENT_PATTERN.matcher(userAgentHeader); + if (matcher.matches()) { + return Optional.of(matcher.group(1)); + } + return Optional.empty(); + } + // Protected for testing protected static InputStream unzipStreamIfNeeded(InputStream inputStream, HttpRequest httpRequest) throws IOException { -- cgit v1.2.3