package com.codahale.metrics; import io.dropwizard.metrics.MetricName; import java.util.Collections; import java.util.Map; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Deprecated public class MetricRegistry { private static final Logger LOG = LoggerFactory.getLogger(MetricRegistry.class); final io.dropwizard.metrics.MetricRegistry reg; public static String name(Class<?> klass, String... names) { return io.dropwizard.metrics.MetricRegistry .name(klass.getName(), names).getKey(); } public static String name(String name, String... names) { return io.dropwizard.metrics.MetricRegistry.name(name, names).getKey(); } public MetricRegistry(io.dropwizard.metrics.MetricRegistry reg) { this.reg = reg; } public static MetricRegistry of(io.dropwizard.metrics.MetricRegistry reg) { return new MetricRegistry(reg); } public <T extends Metric> T register(String name, T metric) throws IllegalArgumentException { if (metric instanceof MetricSet) { registerAll(MetricName.build(name), (MetricSet) metric); } else { reg.register(name, metric); } return metric; } public void registerAll(MetricSet metrics) throws IllegalArgumentException { registerAll(null, metrics); } private void registerAll(MetricName prefix, MetricSet metrics) throws IllegalArgumentException { if (prefix == null) { prefix = MetricName.EMPTY; } for (Map.Entry<String, Metric> entry : metrics.getMetrics().entrySet()) { if (entry.getValue() instanceof MetricSet) { registerAll( MetricName.join(prefix, MetricName.build(entry.getKey())), (MetricSet) entry.getValue()); } else { reg.register( MetricName.join(prefix, MetricName.build(entry.getKey())), entry.getValue()); } } } public Counter counter(String name) { return new Counter(reg.counter(MetricName.build(name))); } public Histogram histogram(String name) { return new Histogram(reg.histogram(MetricName.build(name))); } public Meter meter(String name) { return new Meter(reg.meter(MetricName.build(name))); } public Timer timer(String name) { return new Timer(reg.timer(MetricName.build(name))); } public boolean remove(String name) { return reg.remove(MetricName.build(name)); } public void removeMatching(MetricFilter filter) { reg.removeMatching(transformFilter(filter)); } // public void addListener(MetricRegistryListener listener) { // listeners.add(listener); // // for (Map.Entry<MetricName, Metric> entry : metrics.entrySet()) { // notifyListenerOfAddedMetric(listener, entry.getValue(), // entry.getKey()); // } // } // // public void removeListener(MetricRegistryListener listener) { // listeners.remove(listener); // } public SortedSet<String> getNames() { SortedSet<String> names = new TreeSet<>(); for(MetricName name: reg.getNames()){ names.add(name.getKey()); } return Collections.unmodifiableSortedSet(names); } @SuppressWarnings("rawtypes") public SortedMap<String, Gauge> getGauges() { return getGauges(MetricFilter.ALL); } @SuppressWarnings("rawtypes") public SortedMap<String, Gauge> getGauges(MetricFilter filter) { return adaptMetrics(Gauge.class, reg.getGauges(transformFilter(filter))); } public SortedMap<String, Counter> getCounters() { return getCounters(MetricFilter.ALL); } public SortedMap<String, Counter> getCounters(MetricFilter filter) { return adaptMetrics(Counter.class, reg.getCounters(transformFilter(filter))); } public SortedMap<String, Histogram> getHistograms() { return getHistograms(MetricFilter.ALL); } public SortedMap<String, Histogram> getHistograms(MetricFilter filter) { return adaptMetrics(Histogram.class, reg.getHistograms(transformFilter(filter))); } public SortedMap<String, Meter> getMeters() { return getMeters(MetricFilter.ALL); } public SortedMap<String, Meter> getMeters(MetricFilter filter) { return adaptMetrics(Meter.class, reg.getMeters(transformFilter(filter))); } public SortedMap<String, Timer> getTimers() { return getTimers(MetricFilter.ALL); } public SortedMap<String, Timer> getTimers(MetricFilter filter) { return adaptMetrics(Timer.class, reg.getTimers(transformFilter(filter))); } private io.dropwizard.metrics.MetricFilter transformFilter(final MetricFilter filter) { return new io.dropwizard.metrics.MetricFilter() { @Override public boolean matches(MetricName name, io.dropwizard.metrics.Metric metric) { try { return filter.matches(name.getKey(), adaptMetric(metric)); } catch (ClassNotFoundException e) { LOG.warn("Came accross unadapted metric", e); return false; } } }; } @SuppressWarnings({ "rawtypes", "unchecked" }) private Metric adaptMetric(final io.dropwizard.metrics.Metric metric) throws ClassNotFoundException { if (metric instanceof Metric) { return (Metric) metric; } else if (metric instanceof io.dropwizard.metrics.Counter) { return new Counter((io.dropwizard.metrics.Counter) metric); } else if (metric instanceof io.dropwizard.metrics.Histogram) { return new Histogram((io.dropwizard.metrics.Histogram) metric); } else if (metric instanceof io.dropwizard.metrics.Meter) { return new Meter((io.dropwizard.metrics.Meter) metric); } else if (metric instanceof io.dropwizard.metrics.Timer) { return new Timer((io.dropwizard.metrics.Timer) metric); } else if (metric instanceof io.dropwizard.metrics.Gauge) { return new Gauge((io.dropwizard.metrics.Gauge) metric); } throw new ClassNotFoundException("Can't find adapter class for metric of type " + metric.getClass().getName()); } @SuppressWarnings("unchecked") private <T extends Metric, A extends io.dropwizard.metrics.Metric> SortedMap<String, T> adaptMetrics(final Class<T> klass, final SortedMap<MetricName, A> metrics) { SortedMap<String, T> items = new TreeMap<>(); for (Map.Entry<MetricName, A> metric: metrics.entrySet()) { try { items.put(metric.getKey().getKey(), (T) adaptMetric(metric.getValue())); } catch (ClassNotFoundException e) { LOG.warn("Came accross unadapted metric", e); } } return Collections.unmodifiableSortedMap(items); } }