aboutsummaryrefslogtreecommitdiffstats
path: root/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/prometheus/PrometheusModel.java
diff options
context:
space:
mode:
Diffstat (limited to 'metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/prometheus/PrometheusModel.java')
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/prometheus/PrometheusModel.java55
1 files changed, 45 insertions, 10 deletions
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/prometheus/PrometheusModel.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/prometheus/PrometheusModel.java
index 77db2389271..8047da728ad 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/prometheus/PrometheusModel.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/prometheus/PrometheusModel.java
@@ -1,38 +1,46 @@
// 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.prometheus;
+import ai.vespa.metricsproxy.metric.model.MetricId;
+import ai.vespa.metricsproxy.metric.model.MetricsPacket;
+import ai.vespa.metricsproxy.metric.model.ServiceId;
import io.prometheus.client.Collector;
import io.prometheus.client.exporter.common.TextFormat;
-import java.io.IOException;
import java.io.StringWriter;
+import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.Map;
+import java.util.Set;
/**
* @author yj-jtakagi
* @author gjoranv
*/
public class PrometheusModel implements Enumeration<Collector.MetricFamilySamples> {
- private static Logger log = Logger.getLogger(PrometheusModel.class.getName());
+ private final Map<ServiceId, List<MetricsPacket>> packetsByServiceId;
+ private final Iterator<MetricId> metricIterator;
+ private final Iterator<Collector.MetricFamilySamples> statusMetrics;
- private final Iterator<Collector.MetricFamilySamples> metricFamilySamplesIterator;
-
- PrometheusModel(List<Collector.MetricFamilySamples> metricFamilySamples) {
- this.metricFamilySamplesIterator = metricFamilySamples.iterator();
+ PrometheusModel(Set<MetricId> metricNames, Map<ServiceId, List<MetricsPacket>> packetsByServiceId,
+ List<Collector.MetricFamilySamples> statusMetrics) {
+ metricIterator = metricNames.iterator();
+ this.packetsByServiceId = packetsByServiceId;
+ this.statusMetrics = statusMetrics.iterator();
}
@Override
public boolean hasMoreElements() {
- return metricFamilySamplesIterator.hasNext();
+ return metricIterator.hasNext() || statusMetrics.hasNext();
}
@Override
public Collector.MetricFamilySamples nextElement() {
- return metricFamilySamplesIterator.next();
+ return metricIterator.hasNext()
+ ? createMetricFamily(metricIterator.next())
+ : statusMetrics.next();
}
public String serialize() {
@@ -45,4 +53,31 @@ public class PrometheusModel implements Enumeration<Collector.MetricFamilySample
return writer.toString();
}
+ private Collector.MetricFamilySamples createMetricFamily(MetricId metricId) {
+ List<Collector.MetricFamilySamples.Sample> sampleList = new ArrayList<>();
+ var samples = new Collector.MetricFamilySamples(metricId.getIdForPrometheus(), Collector.Type.UNKNOWN, "", sampleList);
+ packetsByServiceId.forEach(((serviceId, packets) -> {
+ 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 = entry.getKey().getIdForPrometheus();
+ labels.add(labelName);
+ labelValues.add(entry.getValue());
+ }
+ labels.add("vespa_service");
+ labelValues.add(serviceName);
+
+ Number metric = packet.metrics().get(metricId);
+ if (metric != null) {
+ sampleList.add(new Collector.MetricFamilySamples.Sample(metricId.getIdForPrometheus(), labels, labelValues, metric.doubleValue(), timeStamp));
+ }
+ }
+ }));
+ return samples;
+ }
+
}