diff options
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.java | 64 |
1 files changed, 52 insertions, 12 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..1f55e2f8679 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,51 @@ // 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.DimensionId; +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.Collector.MetricFamilySamples; +import io.prometheus.client.Collector.MetricFamilySamples.Sample; 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()); +public class PrometheusModel implements Enumeration<MetricFamilySamples> { + private final Map<ServiceId, List<MetricsPacket>> packetsByServiceId; + private final Iterator<MetricId> metricIterator; + private final Iterator<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<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(); + public MetricFamilySamples nextElement() { + return metricIterator.hasNext() + ? createMetricFamily(metricIterator.next()) + : statusMetrics.next(); } public String serialize() { @@ -45,4 +58,31 @@ public class PrometheusModel implements Enumeration<Collector.MetricFamilySample return writer.toString(); } + private MetricFamilySamples createMetricFamily(MetricId metricId) { + List<MetricFamilySamples.Sample> sampleList = new ArrayList<>(); + packetsByServiceId.forEach(((serviceId, packets) -> { + for (var packet : packets) { + Number metric = packet.metrics().get(metricId); + if (metric != null) { + sampleList.add(createSample(serviceId, metricId, metric, packet.timestamp, packet.dimensions())); + } + } + })); + return new MetricFamilySamples(metricId.getIdForPrometheus(), Collector.Type.UNKNOWN, "", sampleList); + } + private static Sample createSample(ServiceId serviceId, MetricId metricId, Number metric, + Long timeStamp, Map<DimensionId, String> 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(serviceId.getIdForPrometheus()); + return new Sample(metricId.getIdForPrometheus(), labels, labelValues, metric.doubleValue(), timeStamp); + } + } |