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}