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}