001package io.prometheus.client.hotspot; 002 003import io.prometheus.client.Collector; 004 005import java.lang.management.GarbageCollectorMXBean; 006import java.lang.management.ManagementFactory; 007import java.util.ArrayList; 008import java.util.Arrays; 009import java.util.HashMap; 010import java.util.List; 011import java.util.regex.Pattern; 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 private final List<GarbageCollectorMXBean> garbageCollectors; 030 031 public GarbageCollectorExports() { 032 this(ManagementFactory.getGarbageCollectorMXBeans()); 033 } 034 035 GarbageCollectorExports(List<GarbageCollectorMXBean> garbageCollectors) { 036 this.garbageCollectors = garbageCollectors; 037 } 038 039 public List<MetricFamilySamples> collect() { 040 ArrayList<MetricFamilySamples.Sample> samples = new ArrayList<MetricFamilySamples.Sample>(); 041 for (final GarbageCollectorMXBean gc : garbageCollectors) { 042 samples.add( 043 new MetricFamilySamples.Sample( 044 "jvm_gc_collection_seconds_sum", 045 Arrays.asList("gc"), 046 Arrays.asList(gc.getName()), 047 gc.getCollectionTime() / MILLISECONDS_PER_SECOND)); 048 samples.add( 049 new MetricFamilySamples.Sample( 050 "jvm_gc_collection_seconds_count", 051 Arrays.asList("gc"), 052 Arrays.asList(gc.getName()), 053 gc.getCollectionCount())); 054 } 055 List<MetricFamilySamples> mfs = new ArrayList<MetricFamilySamples>(); 056 mfs.add(new MetricFamilySamples( 057 "jvm_gc_collection_seconds", 058 Type.SUMMARY, 059 "Time spent in a given JVM garbage collector in seconds.", 060 samples)); 061 062 return mfs; 063 } 064}