From 1e5ce5733d5a15540f4a84a6629e33005fbc9cb0 Mon Sep 17 00:00:00 2001 From: gjoranv Date: Tue, 18 Jun 2019 23:16:52 +0200 Subject: Add 'consumer' parameter to the generic metrics handler. --- .../metricsproxy/http/GenericMetricsHandler.java | 31 +++++++++++++++++++--- .../http/GenericMetricsHandlerTest.java | 7 ++--- 2 files changed, 32 insertions(+), 6 deletions(-) (limited to 'metrics-proxy/src') diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/GenericMetricsHandler.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/GenericMetricsHandler.java index acd14236ac0..8422b3e5413 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/GenericMetricsHandler.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/GenericMetricsHandler.java @@ -4,6 +4,7 @@ package ai.vespa.metricsproxy.http; +import ai.vespa.metricsproxy.core.MetricsConsumers; import ai.vespa.metricsproxy.core.MetricsManager; import ai.vespa.metricsproxy.metric.model.ConsumerId; import ai.vespa.metricsproxy.metric.model.MetricsPacket; @@ -20,25 +21,33 @@ import java.nio.charset.Charset; import java.time.Instant; import java.util.List; import java.util.concurrent.Executor; +import java.util.logging.Logger; +import java.util.stream.Collectors; import static ai.vespa.metricsproxy.metric.model.ConsumerId.toConsumerId; import static ai.vespa.metricsproxy.metric.model.json.GenericJsonUtil.toGenericJsonModel; /** - * Handler exposing the generic metrics format via http. + * Http handler that exposes the generic metrics format. * * @author gjoranv */ public class GenericMetricsHandler extends ThreadedHttpRequestHandler { + private static final Logger log = Logger.getLogger(GenericMetricsHandler.class.getName()); public static final ConsumerId DEFAULT_PUBLIC_CONSUMER_ID = toConsumerId("default-public"); + private final MetricsConsumers metricsConsumers; private final MetricsManager metricsManager; private final VespaServices vespaServices; @Inject - public GenericMetricsHandler(Executor executor, MetricsManager metricsManager, VespaServices vespaServices) { + public GenericMetricsHandler(Executor executor, + MetricsManager metricsManager, + VespaServices vespaServices, + MetricsConsumers metricsConsumers) { super(executor); + this.metricsConsumers = metricsConsumers; this.metricsManager = metricsManager; this.vespaServices = vespaServices; } @@ -46,13 +55,29 @@ public class GenericMetricsHandler extends ThreadedHttpRequestHandler { @Override public HttpResponse handle(HttpRequest request) { try { - List metrics = metricsManager.getMetrics(vespaServices.getVespaServices(), Instant.now()); + ConsumerId consumer = getConsumerOrDefault(request.getProperty("consumer")); + + List metrics = metricsManager.getMetrics(vespaServices.getVespaServices(), Instant.now()) + .stream() + .filter(metricsPacket -> metricsPacket.consumers().contains(consumer)) + .collect(Collectors.toList()); return new Response(200, toGenericJsonModel(metrics).serialize()); } catch (JsonRenderingException e) { return new Response(500, e.getMessageAsJson()); } } + private ConsumerId getConsumerOrDefault(String consumer) { + if (consumer == null) return DEFAULT_PUBLIC_CONSUMER_ID; + + ConsumerId consumerId = toConsumerId(consumer); + if (! metricsConsumers.getAllConsumers().contains(consumerId)) { + log.info("No consumer with id '" + consumer + "' - using the default consumer instead."); + return DEFAULT_PUBLIC_CONSUMER_ID; + } + return consumerId; + } + private static class Response extends HttpResponse { private final byte[] data; diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/GenericMetricsHandlerTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/GenericMetricsHandlerTest.java index 301dbf56c3f..6c0cc1e8046 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/GenericMetricsHandlerTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/GenericMetricsHandlerTest.java @@ -35,6 +35,7 @@ import java.util.concurrent.Executors; import static ai.vespa.metricsproxy.core.VespaMetrics.INSTANCE_DIMENSION_ID; import static ai.vespa.metricsproxy.core.VespaMetrics.VESPA_CONSUMER_ID; +import static ai.vespa.metricsproxy.http.GenericMetricsHandler.DEFAULT_PUBLIC_CONSUMER_ID; import static ai.vespa.metricsproxy.metric.model.ServiceId.toServiceId; import static ai.vespa.metricsproxy.metric.model.StatusCode.DOWN; import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.createObjectMapper; @@ -64,13 +65,13 @@ public class GenericMetricsHandlerTest { private static RequestHandlerTestDriver testDriver; @BeforeClass - public static void setupMetricsManager() { + public static void setup() { MetricsManager metricsManager = TestUtil.createMetricsManager(vespaServices, getMetricsConsumers(), getApplicationDimensions(), getNodeDimensions()); metricsManager.setExtraMetrics(ImmutableList.of( new MetricsPacket.Builder(toServiceId("foo")) .timestamp(Instant.now().getEpochSecond()) .putMetrics(ImmutableList.of(new Metric(CPU_METRIC, 12.345))))); - GenericMetricsHandler handler = new GenericMetricsHandler(Executors.newSingleThreadExecutor(), metricsManager, vespaServices); + GenericMetricsHandler handler = new GenericMetricsHandler(Executors.newSingleThreadExecutor(), metricsManager, vespaServices, getMetricsConsumers()); testDriver = new RequestHandlerTestDriver(handler); } @@ -152,7 +153,7 @@ public class GenericMetricsHandlerTest { return new MetricsConsumers(new ConsumersConfig.Builder() .consumer(new ConsumersConfig.Consumer.Builder() - .name(VESPA_CONSUMER_ID.id) + .name(DEFAULT_PUBLIC_CONSUMER_ID.id) .metric(new ConsumersConfig.Consumer.Metric.Builder() .name(CPU_METRIC) .outputname(CPU_METRIC)) -- cgit v1.2.3