diff options
author | gjoranv <gv@verizonmedia.com> | 2019-08-30 11:07:36 +0200 |
---|---|---|
committer | gjoranv <gv@verizonmedia.com> | 2019-08-30 11:08:14 +0200 |
commit | 0a34ba7341b0448cdde113a72ae05833bf77426c (patch) | |
tree | 60775b1b07b076532db16e49f3bd4bbd15fc3065 /metrics-proxy | |
parent | c232a31df58fd153ff08b5a209556f4151861558 (diff) |
Extract base class for http handlers to avoid code duplication
Diffstat (limited to 'metrics-proxy')
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()); |