package io.dropwizard.metrics.jvm; import static io.dropwizard.metrics.MetricRegistry.name; import io.dropwizard.metrics.Gauge; import io.dropwizard.metrics.Metric; import io.dropwizard.metrics.MetricName; import io.dropwizard.metrics.MetricSet; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.util.*; import java.util.regex.Pattern; /** * A set of gauges for the counts and elapsed times of garbage collections. */ public class GarbageCollectorMetricSet implements MetricSet { private static final Pattern WHITESPACE = Pattern.compile("[\\s]+"); private final List<GarbageCollectorMXBean> garbageCollectors; /** * Creates a new set of gauges for all discoverable garbage collectors. */ public GarbageCollectorMetricSet() { this(ManagementFactory.getGarbageCollectorMXBeans()); } /** * Creates a new set of gauges for the given collection of garbage collectors. * * @param garbageCollectors the garbage collectors */ public GarbageCollectorMetricSet(Collection<GarbageCollectorMXBean> garbageCollectors) { this.garbageCollectors = new ArrayList<>(garbageCollectors); } @Override public Map<MetricName, Metric> getMetrics() { final Map<MetricName, Metric> gauges = new HashMap<>(); for (final GarbageCollectorMXBean gc : garbageCollectors) { final String name = WHITESPACE.matcher(gc.getName()).replaceAll("-"); gauges.put(name(name, "count"), new Gauge<Long>() { @Override public Long getValue() { return gc.getCollectionCount(); } }); gauges.put(name(name, "time"), new Gauge<Long>() { @Override public Long getValue() { return gc.getCollectionTime(); } }); } return Collections.unmodifiableMap(gauges); } }