summaryrefslogtreecommitdiffstats
path: root/vespaclient-container-plugin
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2019-01-31 13:37:44 +0100
committerBjørn Christian Seime <bjorncs@verizonmedia.com>2019-01-31 14:21:19 +0100
commit6861807fc85d4ae0433d3849fccd47d7c3b32e30 (patch)
treefeae3b145a569d9698de934c3d0f6b933537e949 /vespaclient-container-plugin
parentec7fb945b9cbc0bbd3298f89e7413a27f4b13390 (diff)
Add metric for http requests with client version as dimension
Diffstat (limited to 'vespaclient-container-plugin')
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/documentapi/metrics/DocumentApiMetrics.java11
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedHandler.java43
2 files changed, 31 insertions, 23 deletions
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<DocumentOperationStatus, Map<DocumentOperationType, Point>> points = new HashMap<>();
+ private final Map<String, Point> versionPointCache = new HashMap<>();
public DocumentApiMetrics(MetricReceiver metricReceiver, String apiName) {
Map<String, String> 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<Integer> 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<HttpResponse, Integer> protocolVersion = checkProtocolVersion(request);
if (protocolVersion.first != null) {
@@ -129,6 +113,19 @@ public class FeedHandler extends LoggingRequestHandler {
return feedHandlerV3.handle(request);
}
+ private static Optional<String> 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 {