diff options
author | Ola Aunronning <olaa@yahooinc.com> | 2023-10-27 15:57:13 +0200 |
---|---|---|
committer | Ola Aunronning <olaa@yahooinc.com> | 2023-10-27 15:57:13 +0200 |
commit | c02490fd4e205f43bfdc6cdbf72f9ab9853b6c76 (patch) | |
tree | 6a643f58e7adc7230ef1746d2160ab75680eb85a /container-core/src/main/java/com/yahoo/container/jdisc | |
parent | 026305ca0de9f2b446e62d85c153df6324e0a0ff (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.java | 8 | ||||
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/jdisc/state/PrometheusHelper.java | 66 |
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("([-.])", "_"); } |