001package io.prometheus.client.spring.boot;
002
003import io.prometheus.client.Collector;
004import org.springframework.beans.factory.annotation.Autowired;
005import org.springframework.boot.actuate.endpoint.PublicMetrics;
006import org.springframework.boot.actuate.metrics.Metric;
007import org.springframework.stereotype.Component;
008
009import java.util.ArrayList;
010import java.util.Collection;
011import java.util.Collections;
012import java.util.List;
013
014/**
015 * <p>Spring boot metrics integration for Prometheus exporter.</p>
016 *
017 * <pre><code>{@literal @}Bean
018 * public SpringBootMetricsCollector springBootMetricsCollector(Collection{@literal <}PublicMetrics{@literal >} publicMetrics) {
019 *   SpringBootMetricsCollector springBootMetricsCollector = new SpringBootMetricsCollector(publicMetrics);
020 *   springBootMetricsCollector.register();
021 *   return springBootMetricsCollector;
022 * }
023 * </code></pre>
024 */
025@Component
026public class SpringBootMetricsCollector extends Collector implements Collector.Describable {
027  private final Collection<PublicMetrics> publicMetrics;
028
029  @Autowired
030  public SpringBootMetricsCollector(Collection<PublicMetrics> publicMetrics) {
031    this.publicMetrics = publicMetrics;
032  }
033
034  @Override
035  public List<MetricFamilySamples> collect() {
036    ArrayList<MetricFamilySamples> samples = new ArrayList<MetricFamilySamples>();
037    for (PublicMetrics publicMetrics : this.publicMetrics) {
038      for (Metric<?> metric : publicMetrics.metrics()) {
039        String name = Collector.sanitizeMetricName(metric.getName());
040        double value = metric.getValue().doubleValue();
041        MetricFamilySamples metricFamilySamples = new MetricFamilySamples(
042                name, Type.GAUGE, name, Collections.singletonList(
043                new MetricFamilySamples.Sample(name, Collections.<String>emptyList(), Collections.<String>emptyList(), value)));
044        samples.add(metricFamilySamples);
045      }
046    }
047    return samples;
048  }
049
050  @Override
051  public List<MetricFamilySamples> describe() {
052    return new ArrayList<MetricFamilySamples>();
053  }
054}