summaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/container/jdisc/state/PrometheusHelper.java
blob: b38bcfebb48ee55d50d01823c6ef0cdeea4494c8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.container.jdisc.state;

import com.fasterxml.jackson.databind.JsonNode;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;


/**
 * @author olaa
 */
public class PrometheusHelper {

    private static final String HELP_LINE = "# HELP %s\n# TYPE %s untyped\n";
    private static final String METRIC_LINE = "%s{%s} %s %d\n";
    private static final String DIMENSION_KEY = "dimensions";
    private static final String METRIC_KEY = "metrics";
    private static final String APPLICATION_KEY = "application";

    protected static byte[] buildPrometheusOutput(List<JsonNode> metrics, long timestamp) throws IOException {
        var outputStream = new ByteArrayOutputStream();

        for (var metric : metrics) {
            var metricDimensions = metric.get(DIMENSION_KEY);
            var dimensionBuilder = new StringBuilder();
            for (var it = metricDimensions.fieldNames(); it.hasNext(); ) {
                var dimension = it.next();
                dimensionBuilder
                        .append(sanitize(dimension))
                        .append("=\"")
                        .append(metricDimensions.get(dimension).asText())
                        .append("\",");
            }
            var application = metric.get(APPLICATION_KEY).asText();
            dimensionBuilder.append("vespa_service=\"").append(application).append("\",");
            var dimensions = dimensionBuilder.toString();
            var metricValues = metric.get(METRIC_KEY);
            for (var it = metricValues.fieldNames(); it.hasNext(); ) {
                var metricName = it.next();
                var metricVal = metricValues.get(metricName).numberValue();
                outputStream.write(getMetricLines(sanitize(metricName), dimensions, metricVal, timestamp));
            }
        }
        return outputStream.toByteArray();
    }

    private static byte[] getMetricLines(String metricName, String dimensions, Number value, long timestamp) {
        return (String.format(HELP_LINE, metricName, metricName) +
                String.format(METRIC_LINE, metricName, dimensions, value, timestamp)).getBytes();
    }

    private static String sanitize(String name) {
        return name.replaceAll("([-.])", "_");
    }

}