summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2024-04-16 20:43:37 +0200
committerGitHub <noreply@github.com>2024-04-16 20:43:37 +0200
commit9ee70cf80666e1d6334bdf983e0bbb5e7b4f0332 (patch)
tree9215f34b8ae43401db38ae77b692d13cde02ebc2
parent91510296ab4fad61f3755de09cccd2b1bb9fc562 (diff)
parentdf8244cb4e59d6a04838e8ef3e93a3834964e8c8 (diff)
Merge pull request #30928 from vespa-engine/balder/reduce-duplicats
- Remove duplicates of the timestamp.
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/DimensionId.java9
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/MetricId.java18
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/ServiceId.java10
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/prometheus/PrometheusUtil.java9
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java4
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");
}