001package io.prometheus.client.hotspot; 002 003import io.prometheus.client.Collector; 004import io.prometheus.client.Predicate; 005import io.prometheus.client.SummaryMetricFamily; 006 007import java.lang.management.GarbageCollectorMXBean; 008import java.lang.management.ManagementFactory; 009import java.util.ArrayList; 010import java.util.Collections; 011import java.util.List; 012 013/** 014 * Exports metrics about JVM garbage collectors. 015 * <p> 016 * Example usage: 017 * <pre> 018 * {@code 019 * new GarbageCollectorExports().register(); 020 * } 021 * </pre> 022 * Example metrics being exported: 023 * <pre> 024 * jvm_gc_collection_seconds_count{gc="PS1"} 200 025 * jvm_gc_collection_seconds_sum{gc="PS1"} 6.7 026 * </pre> 027 */ 028public class GarbageCollectorExports extends Collector { 029 030 private static final String JVM_GC_COLLECTION_SECONDS = "jvm_gc_collection_seconds"; 031 032 private final List<GarbageCollectorMXBean> garbageCollectors; 033 034 public GarbageCollectorExports() { 035 this(ManagementFactory.getGarbageCollectorMXBeans()); 036 } 037 038 GarbageCollectorExports(List<GarbageCollectorMXBean> garbageCollectors) { 039 this.garbageCollectors = garbageCollectors; 040 } 041 042 @Override 043 public List<MetricFamilySamples> collect() { 044 return collect(null); 045 } 046 047 @Override 048 public List<MetricFamilySamples> collect(Predicate<String> nameFilter) { 049 List<MetricFamilySamples> mfs = new ArrayList<MetricFamilySamples>(); 050 if (nameFilter == null || nameFilter.test(JVM_GC_COLLECTION_SECONDS)) { 051 SummaryMetricFamily gcCollection = new SummaryMetricFamily( 052 JVM_GC_COLLECTION_SECONDS, 053 "Time spent in a given JVM garbage collector in seconds.", 054 Collections.singletonList("gc")); 055 for (final GarbageCollectorMXBean gc : garbageCollectors) { 056 gcCollection.addMetric( 057 Collections.singletonList(gc.getName()), 058 gc.getCollectionCount(), 059 gc.getCollectionTime() / MILLISECONDS_PER_SECOND); 060 } 061 mfs.add(gcCollection); 062 } 063 return mfs; 064 } 065}