summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2024-04-16 08:43:26 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2024-04-16 08:43:26 +0200
commitdf8244cb4e59d6a04838e8ef3e93a3834964e8c8 (patch)
tree4fe2df2c951684fc624a9b104d098f6f4ef49e97
parent80718d4dedf2b89429b0ac7bc2aa2851fdc684bc (diff)
We already have deduplication of MericId, DimensionId and ServiceId.
Just santize upfront and use that.
-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.java14
4 files changed, 30 insertions, 21 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 f1050933a01..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
@@ -19,15 +19,7 @@ import java.util.stream.Collectors;
*/
public class PrometheusUtil {
- private static String sanitize(String name, Map<String, String> sanitizedCache) {
- return sanitizedCache.computeIfAbsent(name, key -> {
- String sanitized = Collector.sanitizeMetricName(name);
- return (name.equals(sanitized)) ? name : sanitized;
- });
- }
-
public static PrometheusModel toPrometheusModel(List<MetricsPacket> metricsPackets) {
- Map<String, String> sanitizedMetrics = new HashMap<>();
Map<ServiceId, List<MetricsPacket>> packetsByService = metricsPackets.stream()
.collect(Collectors.groupingBy(packet -> packet.service));
@@ -36,14 +28,14 @@ public class PrometheusUtil {
Map<String, List<Sample>> samples = new HashMap<>();
packetsByService.forEach(((serviceId, packets) -> {
- var serviceName = sanitize(serviceId.id, sanitizedMetrics);
+ 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 = sanitize(entry.getKey().id, sanitizedMetrics);
+ var labelName = entry.getKey().getIdForPrometheus();
labels.add(labelName);
labelValues.add(entry.getValue());
}
@@ -51,7 +43,7 @@ public class PrometheusUtil {
labelValues.add(serviceName);
for (var metric : packet.metrics().entrySet()) {
- var metricName = sanitize(metric.getKey().id, sanitizedMetrics);
+ var metricName = metric.getKey().getIdForPrometheus();
List<Sample> sampleList;
if (samples.containsKey(metricName)) {
sampleList = samples.get(metricName);