summaryrefslogtreecommitdiffstats
path: root/metrics-proxy
diff options
context:
space:
mode:
authorgjoranv <gv@verizonmedia.com>2019-08-30 11:07:36 +0200
committergjoranv <gv@verizonmedia.com>2019-08-30 11:08:14 +0200
commit0a34ba7341b0448cdde113a72ae05833bf77426c (patch)
tree60775b1b07b076532db16e49f3bd4bbd15fc3065 /metrics-proxy
parentc232a31df58fd153ff08b5a209556f4151861558 (diff)
Extract base class for http handlers to avoid code duplication
Diffstat (limited to 'metrics-proxy')
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/HttpHandlerBase.java54
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/MetricsHandler.java31
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/prometheus/PrometheusHandler.java27
3 files changed, 75 insertions, 37 deletions
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/HttpHandlerBase.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/HttpHandlerBase.java
new file mode 100644
index 00000000000..d3643bd8e61
--- /dev/null
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/HttpHandlerBase.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+ */
+
+package ai.vespa.metricsproxy.http;
+
+import ai.vespa.metricsproxy.core.MetricsConsumers;
+import ai.vespa.metricsproxy.core.MetricsManager;
+import ai.vespa.metricsproxy.service.VespaServices;
+import com.yahoo.container.jdisc.HttpRequest;
+import com.yahoo.container.jdisc.HttpResponse;
+import com.yahoo.container.jdisc.ThreadedHttpRequestHandler;
+import com.yahoo.restapi.Path;
+
+import java.net.URI;
+import java.util.Optional;
+import java.util.concurrent.Executor;
+
+import static com.yahoo.jdisc.Response.Status.METHOD_NOT_ALLOWED;
+import static com.yahoo.jdisc.Response.Status.NOT_FOUND;
+import static com.yahoo.jdisc.http.HttpRequest.Method.GET;
+
+/**
+ * @author gjoranv
+ */
+public abstract class HttpHandlerBase extends ThreadedHttpRequestHandler {
+
+ protected final ValuesFetcher valuesFetcher;
+
+ protected HttpHandlerBase(Executor executor,
+ MetricsManager metricsManager,
+ VespaServices vespaServices,
+ MetricsConsumers metricsConsumers) {
+ super(executor);
+ valuesFetcher = new ValuesFetcher(metricsManager, vespaServices, metricsConsumers);
+ }
+
+ protected abstract Optional<HttpResponse> doHandle(URI requestUri, Path apiPath, String consumer);
+
+ @Override
+ public final HttpResponse handle(HttpRequest request) {
+ if (request.getMethod() != GET) return new JsonResponse(METHOD_NOT_ALLOWED, "Only GET is supported");
+
+ Path path = new Path(request.getUri());
+
+ return doHandle(request.getUri(), path, getConsumer(request))
+ .orElse(new ErrorResponse(NOT_FOUND, "No content at given path"));
+ }
+
+ private String getConsumer(HttpRequest request) {
+ return request.getProperty("consumer");
+ }
+
+}
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/MetricsHandler.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/MetricsHandler.java
index 0d641b6cca4..87034c77524 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/MetricsHandler.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/MetricsHandler.java
@@ -10,58 +10,47 @@ import ai.vespa.metricsproxy.metric.model.MetricsPacket;
import ai.vespa.metricsproxy.metric.model.json.JsonRenderingException;
import ai.vespa.metricsproxy.service.VespaServices;
import com.google.inject.Inject;
-import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.container.jdisc.HttpResponse;
-import com.yahoo.container.jdisc.ThreadedHttpRequestHandler;
import com.yahoo.restapi.Path;
+import java.net.URI;
import java.util.List;
+import java.util.Optional;
import java.util.concurrent.Executor;
import static ai.vespa.metricsproxy.http.RestApiUtil.resourceListResponse;
import static ai.vespa.metricsproxy.metric.model.json.GenericJsonUtil.toGenericJsonModel;
import static com.yahoo.jdisc.Response.Status.INTERNAL_SERVER_ERROR;
-import static com.yahoo.jdisc.Response.Status.METHOD_NOT_ALLOWED;
-import static com.yahoo.jdisc.Response.Status.NOT_FOUND;
import static com.yahoo.jdisc.Response.Status.OK;
-import static com.yahoo.jdisc.http.HttpRequest.Method.GET;
/**
* Http handler for the metrics/v1 rest api.
*
* @author gjoranv
*/
-public class MetricsHandler extends ThreadedHttpRequestHandler {
+public class MetricsHandler extends HttpHandlerBase {
public static final String V1_PATH = "/metrics/v1";
static final String VALUES_PATH = V1_PATH + "/values";
- private final ValuesFetcher valuesFetcher;
-
@Inject
public MetricsHandler(Executor executor,
MetricsManager metricsManager,
VespaServices vespaServices,
MetricsConsumers metricsConsumers) {
- super(executor);
- valuesFetcher = new ValuesFetcher(metricsManager, vespaServices, metricsConsumers);
+ super(executor, metricsManager, vespaServices, metricsConsumers);
}
@Override
- public HttpResponse handle(HttpRequest request) {
- if (request.getMethod() != GET) return new JsonResponse(METHOD_NOT_ALLOWED, "Only GET is supported");
-
- Path path = new Path(request.getUri());
-
- if (path.matches(V1_PATH)) return resourceListResponse(request.getUri(), List.of(VALUES_PATH));
- if (path.matches(VALUES_PATH)) return valuesResponse(request);
-
- return new ErrorResponse(NOT_FOUND, "No content at given path");
+ public Optional<HttpResponse> doHandle(URI requestUri, Path apiPath, String consumer) {
+ if (apiPath.matches(V1_PATH)) return Optional.of(resourceListResponse(requestUri, List.of(VALUES_PATH)));
+ if (apiPath.matches(VALUES_PATH)) return Optional.of(valuesResponse(consumer));
+ return Optional.empty();
}
- private JsonResponse valuesResponse(HttpRequest request) {
+ private JsonResponse valuesResponse(String consumer) {
try {
- List<MetricsPacket> metrics = valuesFetcher.fetch(request.getProperty("consumer"));
+ List<MetricsPacket> metrics = valuesFetcher.fetch(consumer);
return new JsonResponse(OK, toGenericJsonModel(metrics).serialize());
} catch (JsonRenderingException e) {
return new ErrorResponse(INTERNAL_SERVER_ERROR, e.getMessage());
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/prometheus/PrometheusHandler.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/prometheus/PrometheusHandler.java
index f2009280128..d2aa6a290bd 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/prometheus/PrometheusHandler.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/prometheus/PrometheusHandler.java
@@ -7,6 +7,7 @@ package ai.vespa.metricsproxy.http.prometheus;
import ai.vespa.metricsproxy.core.MetricsConsumers;
import ai.vespa.metricsproxy.core.MetricsManager;
import ai.vespa.metricsproxy.http.ErrorResponse;
+import ai.vespa.metricsproxy.http.HttpHandlerBase;
import ai.vespa.metricsproxy.http.JsonResponse;
import ai.vespa.metricsproxy.http.TextResponse;
import ai.vespa.metricsproxy.http.ValuesFetcher;
@@ -19,7 +20,9 @@ import com.yahoo.container.jdisc.HttpResponse;
import com.yahoo.container.jdisc.ThreadedHttpRequestHandler;
import com.yahoo.restapi.Path;
+import java.net.URI;
import java.util.List;
+import java.util.Optional;
import java.util.concurrent.Executor;
import static ai.vespa.metricsproxy.http.RestApiUtil.resourceListResponse;
@@ -33,37 +36,29 @@ import static com.yahoo.jdisc.http.HttpRequest.Method.GET;
/**
* @author gjoranv
*/
-public class PrometheusHandler extends ThreadedHttpRequestHandler {
+public class PrometheusHandler extends HttpHandlerBase {
public static final String V1_PATH = "/prometheus/v1";
static final String VALUES_PATH = V1_PATH + "/values";
- private final ValuesFetcher valuesFetcher;
-
@Inject
public PrometheusHandler(Executor executor,
MetricsManager metricsManager,
VespaServices vespaServices,
MetricsConsumers metricsConsumers) {
- super(executor);
- valuesFetcher = new ValuesFetcher(metricsManager, vespaServices, metricsConsumers);
+ super(executor, metricsManager, vespaServices, metricsConsumers);
}
@Override
- public HttpResponse handle(HttpRequest request) {
- if (request.getMethod() != GET) return new JsonResponse(METHOD_NOT_ALLOWED, "Only GET is supported");
-
- Path path = new Path(request.getUri());
-
- if (path.matches(V1_PATH)) return resourceListResponse(request.getUri(), List.of(VALUES_PATH));
- if (path.matches(VALUES_PATH)) return valuesResponse(request);
-
- return new ErrorResponse(NOT_FOUND, "No content at given path");
+ public Optional<HttpResponse> doHandle(URI requestUri, Path apiPath, String consumer) {
+ if (apiPath.matches(V1_PATH)) return Optional.of(resourceListResponse(requestUri, List.of(VALUES_PATH)));
+ if (apiPath.matches(VALUES_PATH)) return Optional.of(valuesResponse(consumer));
+ return Optional.empty();
}
- private TextResponse valuesResponse(HttpRequest request) {
+ private TextResponse valuesResponse(String consumer) {
try {
- List<MetricsPacket> metrics = valuesFetcher.fetch(request.getProperty("consumer"));
+ List<MetricsPacket> metrics = valuesFetcher.fetch(consumer);
return new TextResponse(OK, toPrometheusModel(metrics).serialize());
} catch (JsonRenderingException e) {
return new TextResponse(INTERNAL_SERVER_ERROR, e.getMessage());