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