package io.prometheus.client; import java.util.ArrayList; import java.util.List; import java.util.Collections; /** * Summary metric family, for custom collectors and exporters. * <p> * Most users want a normal {@link Summary} instead. * * Example usage: * <pre> * {@code * class YourCustomCollector extends Collector { * List<MetricFamilySamples> collect() { * List<MetricFamilySamples> mfs = new ArrayList<MetricFamilySamples>(); * // With no labels. * mfs.add(new SummaryMetricFamily("my_summary", "help", 1, 42)); * // With labels. Record 95th percentile as 3, and 99th percentile as 5. * SummaryMetricFamily labeledSummary = new SummaryMetricFamily("my_other_summary", "help", * Arrays.asList("labelname"), Arrays.asList(.95, .99)); * labeledSummary.addMetric(Arrays.asList("foo"), 2, 10, Arrays.asList(3.0, 5.0)); * mfs.add(labeledSummary); * return mfs; * } * } * } * </pre> */ public class SummaryMetricFamily extends Collector.MetricFamilySamples { private final List<String> labelNames; private final List<Double> quantiles; public SummaryMetricFamily(String name, String help, double count, double sum) { super(name, Collector.Type.SUMMARY, help, new ArrayList<Sample>()); this.labelNames = Collections.emptyList(); this.quantiles = Collections.emptyList(); addMetric(Collections.<String>emptyList(), count, sum); } public SummaryMetricFamily(String name, String help, List<String> labelNames) { this(name, help, labelNames, Collections.<Double>emptyList()); } public SummaryMetricFamily(String name, String help, List<String> labelNames, List<Double>quantiles) { super(name, Collector.Type.SUMMARY, help, new ArrayList<Sample>()); this.labelNames = labelNames; this.quantiles = quantiles; } public SummaryMetricFamily addMetric(List<String> labelValues, double count, double sum) { return addMetric(labelValues, count, sum, Collections.<Double>emptyList()); } public SummaryMetricFamily addMetric(List<String> labelValues, double count, double sum, List<Double> quantiles) { if (labelValues.size() != labelNames.size()) { throw new IllegalArgumentException("Incorrect number of labels."); } if (this.quantiles.size() != quantiles.size()) { throw new IllegalArgumentException("Incorrect number of quantiles."); } samples.add(new Sample(name + "_count", labelNames, labelValues, count)); samples.add(new Sample(name + "_sum", labelNames, labelValues, sum)); List<String> labelNamesWithQuantile = new ArrayList<String>(labelNames); labelNamesWithQuantile.add("quantile"); for (int i = 0; i < quantiles.size(); i++) { List<String> labelValuesWithQuantile = new ArrayList<String>(labelValues); labelValuesWithQuantile.add(Collector.doubleToGoString(this.quantiles.get(i))); samples.add(new Sample(name, labelNamesWithQuantile, labelValuesWithQuantile, quantiles.get(i))); } return this; } }