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}