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