From 80718d4dedf2b89429b0ac7bc2aa2851fdc684bc Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Tue, 16 Apr 2024 00:06:05 +0200 Subject: - Remove duplicates of the timestamp. - Avoid 17M of duplicates of 0.0. - Avoid duplicating the optionally sanitized metric name. --- .../metric/model/prometheus/PrometheusUtil.java | 17 +++++++++++++---- .../ai/vespa/metricsproxy/service/MetricsParser.java | 4 +++- 2 files changed, 16 insertions(+), 5 deletions(-) (limited to 'metrics-proxy') diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/prometheus/PrometheusUtil.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/prometheus/PrometheusUtil.java index d7436ccf404..f1050933a01 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/prometheus/PrometheusUtil.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/prometheus/PrometheusUtil.java @@ -19,7 +19,15 @@ import java.util.stream.Collectors; */ public class PrometheusUtil { + private static String sanitize(String name, Map sanitizedCache) { + return sanitizedCache.computeIfAbsent(name, key -> { + String sanitized = Collector.sanitizeMetricName(name); + return (name.equals(sanitized)) ? name : sanitized; + }); + } + public static PrometheusModel toPrometheusModel(List metricsPackets) { + Map sanitizedMetrics = new HashMap<>(); Map> packetsByService = metricsPackets.stream() .collect(Collectors.groupingBy(packet -> packet.service)); @@ -28,13 +36,14 @@ public class PrometheusUtil { Map> samples = new HashMap<>(); packetsByService.forEach(((serviceId, packets) -> { - var serviceName = Collector.sanitizeMetricName(serviceId.id); + var serviceName = sanitize(serviceId.id, sanitizedMetrics); for (var packet : packets) { + Long timeStamp = packet.timestamp * 1000; var dimensions = packet.dimensions(); List labels = new ArrayList<>(dimensions.size()); List labelValues = new ArrayList<>(dimensions.size()); for (var entry : dimensions.entrySet()) { - var labelName = Collector.sanitizeMetricName(entry.getKey().id); + var labelName = sanitize(entry.getKey().id, sanitizedMetrics); labels.add(labelName); labelValues.add(entry.getValue()); } @@ -42,7 +51,7 @@ public class PrometheusUtil { labelValues.add(serviceName); for (var metric : packet.metrics().entrySet()) { - var metricName = Collector.sanitizeMetricName(metric.getKey().id); + var metricName = sanitize(metric.getKey().id, sanitizedMetrics); List sampleList; if (samples.containsKey(metricName)) { sampleList = samples.get(metricName); @@ -51,7 +60,7 @@ public class PrometheusUtil { samples.put(metricName, sampleList); metricFamilySamples.add(new MetricFamilySamples(metricName, Collector.Type.UNKNOWN, "", sampleList)); } - sampleList.add(new Sample(metricName, labels, labelValues, metric.getValue().doubleValue(), packet.timestamp * 1000)); + sampleList.add(new Sample(metricName, labels, labelValues, metric.getValue().doubleValue(), timeStamp)); } } if (!packets.isEmpty()) { diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java index 6c3b759e97b..0e33d7dbf2f 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java @@ -28,6 +28,7 @@ import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId; * @author Jo Kristian Bergum */ public class MetricsParser { + private static final Double ZERO_DOUBLE = 0d; public interface Collector { void accept(Metric metric); } @@ -186,7 +187,8 @@ public class MetricsParser { if (token == JsonToken.VALUE_NUMBER_INT) { metrics.add(Map.entry(metricName, parser.getLongValue())); } else if (token == JsonToken.VALUE_NUMBER_FLOAT) { - metrics.add(Map.entry(metricName, parser.getValueAsDouble())); + double value = parser.getValueAsDouble(); + metrics.add(Map.entry(metricName, value == ZERO_DOUBLE ? ZERO_DOUBLE : value)); } else { throw new IllegalArgumentException("Value for aggregator '" + fieldName + "' is not a number"); } -- cgit v1.2.3