summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOla Aunrønning <olaa@yahooinc.com>2023-06-05 18:16:32 +0200
committerGitHub <noreply@github.com>2023-06-05 18:16:32 +0200
commitf47fce3107cbf14d3de04941274e21da78654ff9 (patch)
tree0212589e13a3907b0f2a22e7695589ffc6947713
parent9300fbf3f560e2e4af39c9514c6de5883ce3c881 (diff)
parent9c0068952cbdfe841ebf5c79c14db73d02962c5b (diff)
Merge pull request #27294 from vespa-engine/olaa/list-consumers
Add API path for listing metric consumers
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/http/yamas/YamasHandler.java35
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/yamas/YamasHandlerTest.java55
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\"]}}"));
+ }
+
+}