aboutsummaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/container/jdisc
diff options
context:
space:
mode:
authorOla Aunronning <olaa@yahooinc.com>2023-10-27 15:57:13 +0200
committerOla Aunronning <olaa@yahooinc.com>2023-10-27 15:57:13 +0200
commitc02490fd4e205f43bfdc6cdbf72f9ab9853b6c76 (patch)
tree6a643f58e7adc7230ef1746d2160ab75680eb85a /container-core/src/main/java/com/yahoo/container/jdisc
parent026305ca0de9f2b446e62d85c153df6324e0a0ff (diff)
Allow filtering prometheus metrics
Diffstat (limited to 'container-core/src/main/java/com/yahoo/container/jdisc')
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/state/MetricsPacketsHandler.java8
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/state/PrometheusHelper.java66
2 files changed, 24 insertions, 50 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/state/MetricsPacketsHandler.java b/container-core/src/main/java/com/yahoo/container/jdisc/state/MetricsPacketsHandler.java
index 13584082ab8..b94fadec213 100644
--- a/container-core/src/main/java/com/yahoo/container/jdisc/state/MetricsPacketsHandler.java
+++ b/container-core/src/main/java/com/yahoo/container/jdisc/state/MetricsPacketsHandler.java
@@ -28,7 +28,6 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -108,7 +107,7 @@ public class MetricsPacketsHandler extends AbstractRequestHandler {
return getMetricsArray(metricSetId);
}
if ("prometheus".equals(format)) {
- return buildPrometheusOutput();
+ return buildPrometheusOutput(metricSetId);
}
String output = getAllMetricsPackets(metricSetId) + "\n";
@@ -133,8 +132,9 @@ public class MetricsPacketsHandler extends AbstractRequestHandler {
/**
* Returns metrics in Prometheus format
*/
- private byte[] buildPrometheusOutput() throws IOException {
- return PrometheusHelper.buildPrometheusOutput(getSnapshot(), applicationName, timer.currentTimeMillis());
+ private byte[] buildPrometheusOutput(String metricSetId) throws IOException {
+ var metrics = getPacketsForSnapshot(getSnapshot(), metricSetId, applicationName, timer.currentTimeMillis());
+ return PrometheusHelper.buildPrometheusOutput(metrics, timer.currentTimeMillis());
}
private static String jsonToString(JsonNode jsonObject) throws JsonProcessingException {
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/state/PrometheusHelper.java b/container-core/src/main/java/com/yahoo/container/jdisc/state/PrometheusHelper.java
index 11ca9e228ec..b38bcfebb48 100644
--- a/container-core/src/main/java/com/yahoo/container/jdisc/state/PrometheusHelper.java
+++ b/container-core/src/main/java/com/yahoo/container/jdisc/state/PrometheusHelper.java
@@ -1,82 +1,56 @@
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.container.jdisc.state;
+import com.fasterxml.jackson.databind.JsonNode;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Map;
+import java.util.List;
-import static com.yahoo.container.jdisc.state.JsonUtil.sanitizeDouble;
/**
* @author olaa
*/
public class PrometheusHelper {
- private static final String HELP_LINE = "# HELP %s \n# TYPE %s untyped\n";
+ private static final String HELP_LINE = "# HELP %s\n# TYPE %s untyped\n";
private static final String METRIC_LINE = "%s{%s} %s %d\n";
+ private static final String DIMENSION_KEY = "dimensions";
+ private static final String METRIC_KEY = "metrics";
+ private static final String APPLICATION_KEY = "application";
- protected static byte[] buildPrometheusOutput(MetricSnapshot metricSnapshot, String application, long timestamp) throws IOException {
+ protected static byte[] buildPrometheusOutput(List<JsonNode> metrics, long timestamp) throws IOException {
var outputStream = new ByteArrayOutputStream();
- for (Map.Entry<MetricDimensions, MetricSet> snapshotEntry : metricSnapshot) {
- var metricDimensions = snapshotEntry.getKey();
- var metricSet = snapshotEntry.getValue();
-
+ for (var metric : metrics) {
+ var metricDimensions = metric.get(DIMENSION_KEY);
var dimensionBuilder = new StringBuilder();
- for (var dimension : metricDimensions) {
+ for (var it = metricDimensions.fieldNames(); it.hasNext(); ) {
+ var dimension = it.next();
dimensionBuilder
- .append(sanitize(dimension.getKey()))
+ .append(sanitize(dimension))
.append("=\"")
- .append(dimension.getValue())
+ .append(metricDimensions.get(dimension).asText())
.append("\",");
}
+ var application = metric.get(APPLICATION_KEY).asText();
dimensionBuilder.append("vespa_service=\"").append(application).append("\",");
var dimensions = dimensionBuilder.toString();
-
- for (var metric : metricSet) {
- var metricName = metric.getKey();
- var metricValue = metric.getValue();
-
- if (metricValue instanceof CountMetric) {
- var sanitizedMetricName = getSanitizedMetricName(metricName, "count");
- var value = ((CountMetric) metricValue).getCount();
- outputStream.write(getMetricLines(sanitizedMetricName, dimensions, value, timestamp));
- } else if (metricValue instanceof GaugeMetric) {
- var gauge = (GaugeMetric) metricValue;
- writeGaugeMetrics(outputStream, metricName, gauge, dimensions, timestamp);
- }
+ var metricValues = metric.get(METRIC_KEY);
+ for (var it = metricValues.fieldNames(); it.hasNext(); ) {
+ var metricName = it.next();
+ var metricVal = metricValues.get(metricName).numberValue();
+ outputStream.write(getMetricLines(sanitize(metricName), dimensions, metricVal, timestamp));
}
}
return outputStream.toByteArray();
}
- private static void writeGaugeMetrics(OutputStream outputStream, String metricName, GaugeMetric gaugeMetric, String dimensions, long timestamp) throws IOException {
- var sanitizedMetricName = getSanitizedMetricName(metricName, "last");
- var value = sanitizeDouble(gaugeMetric.getLast());
- outputStream.write(getMetricLines(sanitizedMetricName, dimensions, value, timestamp));
-
- /*
- For now - only push "last" value - to limit metric volume
- sanitizedMetricName = getSanitizedMetricName(metricName, "average");
- value = sanitizeDouble(gaugeMetric.getAverage());
- outputStream.write(getMetricLines(sanitizedMetricName, dimensions, value, timestamp));
-
- sanitizedMetricName = getSanitizedMetricName(metricName, "max");
- value = sanitizeDouble(gaugeMetric.getMax());
- outputStream.write(getMetricLines(sanitizedMetricName, dimensions, value, timestamp));
- */
- }
-
private static byte[] getMetricLines(String metricName, String dimensions, Number value, long timestamp) {
return (String.format(HELP_LINE, metricName, metricName) +
String.format(METRIC_LINE, metricName, dimensions, value, timestamp)).getBytes();
}
- private static String getSanitizedMetricName(String metricName, String suffix) {
- return sanitize(metricName) + "_" + suffix;
- }
-
private static String sanitize(String name) {
return name.replaceAll("([-.])", "_");
}