diff options
author | Ola Aunronning <olaa@yahooinc.com> | 2023-06-05 16:47:56 +0200 |
---|---|---|
committer | Ola Aunronning <olaa@yahooinc.com> | 2023-06-05 16:47:56 +0200 |
commit | 9c0068952cbdfe841ebf5c79c14db73d02962c5b (patch) | |
tree | 8968867bae7c2e3ee2814b74c0fde18434fb5066 /metrics-proxy | |
parent | 678fa9ff6d6e363416ec7fe400395c9f3003934e (diff) |
Add API path for listing metric consumers
Diffstat (limited to 'metrics-proxy')
-rw-r--r-- | metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/yamas/YamasHandler.java | 35 | ||||
-rw-r--r-- | metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/yamas/YamasHandlerTest.java | 55 |
2 files changed, 85 insertions, 5 deletions
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/yamas/YamasHandler.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/yamas/YamasHandler.java index 41c7542b613..f6da31ac20b 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/yamas/YamasHandler.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/yamas/YamasHandler.java @@ -8,16 +8,18 @@ import ai.vespa.metricsproxy.metric.dimensions.ApplicationDimensions; import ai.vespa.metricsproxy.metric.dimensions.NodeDimensions; import ai.vespa.metricsproxy.metric.model.MetricsPacket; import ai.vespa.metricsproxy.metric.model.json.JsonRenderingException; -import ai.vespa.metricsproxy.metric.model.json.YamasJsonUtil; import ai.vespa.metricsproxy.node.NodeMetricGatherer; import ai.vespa.metricsproxy.service.VespaServices; import com.yahoo.component.annotation.Inject; import com.yahoo.container.handler.metrics.ErrorResponse; import com.yahoo.container.handler.metrics.HttpHandlerBase; -import com.yahoo.container.handler.metrics.JsonResponse; import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.restapi.Path; +import com.yahoo.slime.JsonFormat; +import com.yahoo.slime.Slime; +import java.io.IOException; +import java.io.OutputStream; import java.net.URI; import java.util.List; import java.util.Optional; @@ -33,10 +35,12 @@ import static com.yahoo.jdisc.Response.Status.OK; public class YamasHandler extends HttpHandlerBase { public static final String V1_PATH = "/yamas/v1"; - private static final String VALUES_PATH = V1_PATH + "/values"; + public static final String VALUES_PATH = V1_PATH + "/values"; + public static final String CONSUMERS_PATH = V1_PATH + "/consumers"; private final ValuesFetcher valuesFetcher; private final NodeMetricGatherer nodeMetricGatherer; + private final MetricsConsumers metricsConsumers; @Inject public YamasHandler(Executor executor, @@ -48,23 +52,44 @@ public class YamasHandler extends HttpHandlerBase { super(executor); valuesFetcher = new ValuesFetcher(metricsManager, vespaServices, metricsConsumers); this.nodeMetricGatherer = new NodeMetricGatherer(metricsManager, vespaServices, applicationDimensions, nodeDimensions); + this.metricsConsumers = metricsConsumers; } @Override 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(V1_PATH)) return Optional.of(resourceListResponse(requestUri, List.of(VALUES_PATH, CONSUMERS_PATH))); if (apiPath.matches(VALUES_PATH)) return Optional.of(valuesResponse(consumer)); + if (apiPath.matches(CONSUMERS_PATH)) return Optional.of(consumersResponse()); return Optional.empty(); } private HttpResponse valuesResponse(String consumer) { try { List<MetricsPacket> metrics = consumer == null ? valuesFetcher.fetchAllMetrics() : valuesFetcher.fetch(consumer); - metrics.addAll(nodeMetricGatherer.gatherMetrics()); // TODO: Currently only add these metrics in this handler. Eventually should be included in all handlers + if (consumer == null || "Vespa".equalsIgnoreCase(consumer)) { + metrics.addAll(nodeMetricGatherer.gatherMetrics()); // TODO: Currently only add these metrics in this handler. Eventually should be included in all handlers + } return new YamasResponse(OK, metrics); } catch (JsonRenderingException e) { return new ErrorResponse(INTERNAL_SERVER_ERROR, e.getMessage()); } } + private HttpResponse consumersResponse() { + var slime = new Slime(); + var consumers = slime.setObject().setArray("consumers"); + metricsConsumers.getAllConsumers().forEach(consumer -> consumers.addString(consumer.id)); + return new HttpResponse(OK) { + @Override + public String getContentType() { + return "application/json"; + } + + @Override + public void render(OutputStream outputStream) throws IOException { + new JsonFormat(true).encode(outputStream, slime); + } + }; + } + }
\ No newline at end of file diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/yamas/YamasHandlerTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/yamas/YamasHandlerTest.java new file mode 100644 index 00000000000..a4e61d5965e --- /dev/null +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/yamas/YamasHandlerTest.java @@ -0,0 +1,55 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package ai.vespa.metricsproxy.http.yamas; + +import ai.vespa.metricsproxy.http.HttpHandlerTestBase; +import com.yahoo.container.jdisc.RequestHandlerTestDriver; +import com.yahoo.slime.ArrayTraverser; +import com.yahoo.slime.SlimeUtils; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class YamasHandlerTest extends HttpHandlerTestBase { + + private static final String VALUES_URI = URI_BASE + YamasHandler.VALUES_PATH; + private static final String CONSUMERS_URI = URI_BASE + YamasHandler.CONSUMERS_PATH; + + private static String valuesResponse; + private static String consumerResponse; + + @BeforeClass + public static void setup() { + YamasHandler handler = new YamasHandler(Executors.newSingleThreadExecutor(), + getMetricsManager(), + vespaServices, + getMetricsConsumers(), + getApplicationDimensions(), + getNodeDimensions()); + testDriver = new RequestHandlerTestDriver(handler); + valuesResponse = testDriver.sendRequest(VALUES_URI).readAll(); + consumerResponse = testDriver.sendRequest(CONSUMERS_URI).readAll(); + } + + + @Test + public void response_contains_consumer_list() { + var slime = SlimeUtils.jsonToSlime(consumerResponse.getBytes()); + var consumers = new ArrayList<>(); + slime.get().field("consumers").traverse((ArrayTraverser) (idx, object) -> + consumers.add(object.asString()) + ); + assertEquals(List.of("default", "custom-consumer"), consumers); + } + + @Test + public void value_response_contains_coredump_metric() { + assertTrue(valuesResponse.contains("\"application\":\"system-coredumps-processing\",\"routing\":{\"yamas\":{\"namespaces\":[\"Vespa\"]}}")); + } + +} |