package io.prometheus.client.hotspot; import io.prometheus.client.Collector; import io.prometheus.client.SummaryMetricFamily; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Exports metrics about JVM garbage collectors. * <p> * Example usage: * <pre> * {@code * new GarbageCollectorExports().register(); * } * </pre> * Example metrics being exported: * <pre> * jvm_gc_collection_seconds_count{gc="PS1"} 200 * jvm_gc_collection_seconds_sum{gc="PS1"} 6.7 * </pre> */ public class GarbageCollectorExports extends Collector { private final List<GarbageCollectorMXBean> garbageCollectors; public GarbageCollectorExports() { this(ManagementFactory.getGarbageCollectorMXBeans()); } GarbageCollectorExports(List<GarbageCollectorMXBean> garbageCollectors) { this.garbageCollectors = garbageCollectors; } public List<MetricFamilySamples> collect() { SummaryMetricFamily gcCollection = new SummaryMetricFamily( "jvm_gc_collection_seconds", "Time spent in a given JVM garbage collector in seconds.", Collections.singletonList("gc")); for (final GarbageCollectorMXBean gc : garbageCollectors) { gcCollection.addMetric( Collections.singletonList(gc.getName()), gc.getCollectionCount(), gc.getCollectionTime() / MILLISECONDS_PER_SECOND); } List<MetricFamilySamples> mfs = new ArrayList<MetricFamilySamples>(); mfs.add(gcCollection); return mfs; } }