diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2024-04-16 20:43:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-16 20:43:37 +0200 |
commit | 9ee70cf80666e1d6334bdf983e0bbb5e7b4f0332 (patch) | |
tree | 9215f34b8ae43401db38ae77b692d13cde02ebc2 | |
parent | 91510296ab4fad61f3755de09cccd2b1bb9fc562 (diff) | |
parent | df8244cb4e59d6a04838e8ef3e93a3834964e8c8 (diff) |
Merge pull request #30928 from vespa-engine/balder/reduce-duplicats
- Remove duplicates of the timestamp.
5 files changed, 35 insertions, 15 deletions
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/DimensionId.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/DimensionId.java index a6b09ddefd8..43cc8fda3c9 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/DimensionId.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/DimensionId.java @@ -2,6 +2,7 @@ package ai.vespa.metricsproxy.metric.model; import com.yahoo.concurrent.CopyOnWriteHashMap; +import io.prometheus.client.Collector; import java.util.Map; import java.util.Objects; @@ -13,12 +14,18 @@ public final class DimensionId { private static final Map<String, DimensionId> dictionary = new CopyOnWriteHashMap<>(); public final String id; - private DimensionId(String id) { this.id = id; } + private final String idForPrometheus; + private DimensionId(String id) { + this.id = id; + idForPrometheus = Collector.sanitizeMetricName(id); + } public static DimensionId toDimensionId(String id) { return dictionary.computeIfAbsent(id, key -> new DimensionId(key)); } + public String getIdForPrometheus() { return idForPrometheus; } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricId.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricId.java index 9014e818eab..829eb06101f 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricId.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricId.java @@ -2,6 +2,7 @@ package ai.vespa.metricsproxy.metric.model; import com.yahoo.concurrent.CopyOnWriteHashMap; +import io.prometheus.client.Collector; import java.util.Map; import java.util.Objects; @@ -14,11 +15,16 @@ public class MetricId { private static final Map<String, MetricId> dictionary = new CopyOnWriteHashMap<>(); public static final MetricId empty = toMetricId(""); public final String id; - private MetricId(String id) { this.id = id; } + private final String idForPrometheus; + private MetricId(String id) { + this.id = id; + idForPrometheus = Collector.sanitizeMetricName(id); + } public static MetricId toMetricId(String id) { - return dictionary.computeIfAbsent(id, key -> new MetricId(key)); + return dictionary.computeIfAbsent(id, MetricId::new); } + public String getIdForPrometheus() { return idForPrometheus; } @Override public boolean equals(Object o) { @@ -29,13 +35,9 @@ public class MetricId { } @Override - public int hashCode() { - return Objects.hash(id); - } + public int hashCode() { return Objects.hash(id); } @Override - public String toString() { - return id; - } + public String toString() { return id; } } diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ServiceId.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ServiceId.java index 96ee2fa00e2..28c64b012c1 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ServiceId.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ServiceId.java @@ -1,6 +1,8 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package ai.vespa.metricsproxy.metric.model; +import io.prometheus.client.Collector; + import java.util.Objects; /** @@ -9,10 +11,16 @@ import java.util.Objects; public class ServiceId { public final String id; - private ServiceId(String id) { this.id = id; } + private final String idForPrometheus; + private ServiceId(String id) { + this.id = id; + idForPrometheus = Collector.sanitizeMetricName(id); + } public static ServiceId toServiceId(String id) { return new ServiceId(id); } + public String getIdForPrometheus() { return idForPrometheus; } + @Override public boolean equals(Object o) { if (this == o) return true; 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..2b0db5381bc 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 @@ -28,13 +28,14 @@ public class PrometheusUtil { Map<String, List<Sample>> samples = new HashMap<>(); packetsByService.forEach(((serviceId, packets) -> { - var serviceName = Collector.sanitizeMetricName(serviceId.id); + var serviceName = serviceId.getIdForPrometheus(); for (var packet : packets) { + Long timeStamp = packet.timestamp * 1000; var dimensions = packet.dimensions(); List<String> labels = new ArrayList<>(dimensions.size()); List<String> labelValues = new ArrayList<>(dimensions.size()); for (var entry : dimensions.entrySet()) { - var labelName = Collector.sanitizeMetricName(entry.getKey().id); + var labelName = entry.getKey().getIdForPrometheus(); labels.add(labelName); labelValues.add(entry.getValue()); } @@ -42,7 +43,7 @@ public class PrometheusUtil { labelValues.add(serviceName); for (var metric : packet.metrics().entrySet()) { - var metricName = Collector.sanitizeMetricName(metric.getKey().id); + var metricName = metric.getKey().getIdForPrometheus(); List<Sample> sampleList; if (samples.containsKey(metricName)) { sampleList = samples.get(metricName); @@ -51,7 +52,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"); } |