Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package com.yammer.metrics.reporting;
  
  import org.slf4j.Logger;
  
  import javax.management.*;
  import java.util.Map;
A reporter which exposes application metric as JMX MBeans.
 
 public class JmxReporter extends AbstractReporter implements MetricsRegistryListener,
                                                              MetricProcessor<JmxReporter.Context> {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(JmxReporter.class);
 
     private final Map<MetricNameObjectNameregisteredBeans;
     private final MBeanServer server;
 
     // CHECKSTYLE:OFF
     @SuppressWarnings("UnusedDeclaration")
     public interface MetricMBean {
         ObjectName objectName();
     }
     // CHECKSTYLE:ON
 
 
     private abstract static class AbstractBean implements MetricMBean {
         private final ObjectName objectName;
 
         protected AbstractBean(ObjectName objectName) {
             this. = objectName;
         }
 
         @Override
         public ObjectName objectName() {
             return ;
         }
     }
 
     // CHECKSTYLE:OFF
     @SuppressWarnings("UnusedDeclaration")
     public interface GaugeMBean extends MetricMBean {
         Object getValue();
     }
     // CHECKSTYLE:ON
 
 
     private static class Gauge extends AbstractBean implements GaugeMBean {
         private final com.yammer.metrics.core.Gauge<?> metric;
 
         private Gauge(com.yammer.metrics.core.Gauge<?> metricObjectName objectName) {
             super(objectName);
             this. = metric;
         }
 
         @Override
         public Object getValue() {
             return .value();
         }
     }
 
     // CHECKSTYLE:OFF
     @SuppressWarnings("UnusedDeclaration")
     public interface CounterMBean extends MetricMBean {
         long getCount();
     }
     // CHECKSTYLE:ON
 
 
     private static class Counter extends AbstractBean implements CounterMBean {
         private final com.yammer.metrics.core.Counter metric;
 
         private Counter(com.yammer.metrics.core.Counter metricObjectName objectName) {
             super(objectName);
             this. = metric;
         }
 
         @Override
         public long getCount() {
             return .count();
         }
     }
 
     //CHECKSTYLE:OFF
     @SuppressWarnings("UnusedDeclaration")
     public interface MeterMBean extends MetricMBean {
         long getCount();
 
         String getEventType();
 
         TimeUnit getRateUnit();
 
         double getMeanRate();
 
        double getOneMinuteRate();
        double getFiveMinuteRate();
        double getFifteenMinuteRate();
    }
    //CHECKSTYLE:ON
    private static class Meter extends AbstractBean implements MeterMBean {
        private final Metered metric;
        private Meter(Metered metricObjectName objectName) {
            super(objectName);
            this. = metric;
        }
        @Override
        public long getCount() {
            return .count();
        }
        @Override
        public String getEventType() {
            return .eventType();
        }
        @Override
        public TimeUnit getRateUnit() {
            return .rateUnit();
        }
        @Override
        public double getMeanRate() {
            return .meanRate();
        }
        @Override
        public double getOneMinuteRate() {
            return .oneMinuteRate();
        }
        @Override
        public double getFiveMinuteRate() {
            return .fiveMinuteRate();
        }
        @Override
        public double getFifteenMinuteRate() {
            return .fifteenMinuteRate();
        }
    }
    // CHECKSTYLE:OFF
    @SuppressWarnings("UnusedDeclaration")
    public interface HistogramMBean extends MetricMBean {
        long getCount();
        double getMin();
        double getMax();
        double getMean();
        double getStdDev();
        double get50thPercentile();
        double get75thPercentile();
        double get95thPercentile();
        double get98thPercentile();
        double get99thPercentile();
        double get999thPercentile();
        double[] values();
    }
    // CHECKSTYLE:ON
    private static class Histogram implements HistogramMBean {
        private final ObjectName objectName;
        private final com.yammer.metrics.core.Histogram metric;
        private Histogram(com.yammer.metrics.core.Histogram metricObjectName objectName) {
            this. = metric;
            this. = objectName;
        }
        @Override
        public ObjectName objectName() {
            return ;
        }
        @Override
        public double get50thPercentile() {
            return .getSnapshot().getMedian();
        }
        @Override
        public long getCount() {
            return .count();
        }
        @Override
        public double getMin() {
            return .min();
        }
        @Override
        public double getMax() {
            return .max();
        }
        @Override
        public double getMean() {
            return .mean();
        }
        @Override
        public double getStdDev() {
            return .stdDev();
        }
        @Override
        public double get75thPercentile() {
            return .getSnapshot().get75thPercentile();
        }
        @Override
        public double get95thPercentile() {
            return .getSnapshot().get95thPercentile();
        }
        @Override
        public double get98thPercentile() {
            return .getSnapshot().get98thPercentile();
        }
        @Override
        public double get99thPercentile() {
            return .getSnapshot().get99thPercentile();
        }
        @Override
        public double get999thPercentile() {
            return .getSnapshot().get999thPercentile();
        }
        @Override
        public double[] values() {
            return .getSnapshot().getValues();
        }
    }
    // CHECKSTYLE:OFF
    @SuppressWarnings("UnusedDeclaration")
    public interface TimerMBean extends MeterMBeanHistogramMBean {
        TimeUnit getLatencyUnit();
    }
    // CHECKSTYLE:ON
    static class Timer extends Meter implements TimerMBean {
        private final com.yammer.metrics.core.Timer metric;
        private Timer(com.yammer.metrics.core.Timer metricObjectName objectName) {
            super(metricobjectName);
            this. = metric;
        }
        @Override
        public double get50thPercentile() {
            return .getSnapshot().getMedian();
        }
        @Override
        public TimeUnit getLatencyUnit() {
            return .durationUnit();
        }
        @Override
        public double getMin() {
            return .min();
        }
        @Override
        public double getMax() {
            return .max();
        }
        @Override
        public double getMean() {
            return .mean();
        }
        @Override
        public double getStdDev() {
            return .stdDev();
        }
        @Override
        public double get75thPercentile() {
            return .getSnapshot().get75thPercentile();
        }
        @Override
        public double get95thPercentile() {
            return .getSnapshot().get95thPercentile();
        }
        @Override
        public double get98thPercentile() {
            return .getSnapshot().get98thPercentile();
        }
        @Override
        public double get99thPercentile() {
            return .getSnapshot().get99thPercentile();
        }
        @Override
        public double get999thPercentile() {
            return .getSnapshot().get999thPercentile();
        }
        @Override
        public double[] values() {
            return .getSnapshot().getValues();
        }
    }
    private static JmxReporter INSTANCE;

    
Starts the default instance of JmxReporter.

Parameters:
registry the com.yammer.metrics.core.MetricsRegistry to report from
    public static void startDefault(MetricsRegistry registry) {
         = new JmxReporter(registry);
        .start();
    }

    
Returns the default instance of JmxReporter if it has been started.

Returns:
The default instance or null if the default is not used
    public static JmxReporter getDefault() {
        return ;
    }

    
Stops the default instance of JmxReporter.
    public static void shutdownDefault() {
        if ( != null) {
            .shutdown();
        }
    }
    static final class Context {
        private final MetricName metricName;
        private final ObjectName objectName;
        public Context(final MetricName metricNamefinal ObjectName objectName) {
            this. = metricName;
            this. = objectName;
        }
        MetricName getMetricName() {
            return ;
        }
        ObjectName getObjectName() {
            return ;
        }
    }

    
Creates a new JmxReporter for the given registry.

    public JmxReporter(MetricsRegistry registry) {
        super(registry);
        this. = new ConcurrentHashMap<MetricNameObjectName>(100);
        this. = ManagementFactory.getPlatformMBeanServer();
    }
    @Override
    public void onMetricAdded(MetricName nameMetric metric) {
        if (metric != null) {
            try {
                metric.processWith(thisnamenew Context(namenew ObjectName(name.getMBeanName())));
            } catch (Exception e) {
                .warn("Error processing {}"namee);
            }
        }
    }
    @Override
    public void onMetricRemoved(MetricName name) {
        final ObjectName objectName = .remove(name);
        if (objectName != null) {
            unregisterBean(objectName);
        }
    }
    @Override
    public void processMeter(MetricName nameMetered meterContext contextthrows Exception {
        registerBean(context.getMetricName(), new Meter(metercontext.getObjectName()),
                     context.getObjectName());
    }
    @Override
    public void processCounter(MetricName namecom.yammer.metrics.core.Counter counterContext contextthrows Exception {
        registerBean(context.getMetricName(),
                     new Counter(countercontext.getObjectName()),
                     context.getObjectName());
    }
    @Override
    public void processHistogram(MetricName namecom.yammer.metrics.core.Histogram histogramContext contextthrows Exception {
        registerBean(context.getMetricName(),
                     new Histogram(histogramcontext.getObjectName()),
                     context.getObjectName());
    }
    @Override
    public void processTimer(MetricName namecom.yammer.metrics.core.Timer timerContext contextthrows Exception {
        registerBean(context.getMetricName(), new Timer(timercontext.getObjectName()),
                     context.getObjectName());
    }
    @Override
    public void processGauge(MetricName namecom.yammer.metrics.core.Gauge<?> gaugeContext contextthrows Exception {
        registerBean(context.getMetricName(), new Gauge(gaugecontext.getObjectName()),
                     context.getObjectName());
    }
    @Override
    public void shutdown() {
        getMetricsRegistry().removeListener(this);
        for (ObjectName name : .values()) {
            unregisterBean(name);
        }
        .clear();
    }

    
Starts the reporter.
    public final void start() {
        getMetricsRegistry().addListener(this);
    }
    private void registerBean(MetricName nameMetricMBean beanObjectName objectName)
            throws MBeanRegistrationExceptionOperationsException {
        .registerMBean(beanobjectName);
        .put(nameobjectName);
    }
    private void unregisterBean(ObjectName name) {
        try {
            .unregisterMBean(name);
        } catch (InstanceNotFoundException e) {
            // This is often thrown when the process is shutting down. An application with lots of
            // metrics will often begin unregistering metrics *after* JMX itself has cleared,
            // resulting in a huge dump of exceptions as the process is exiting.
            .trace("Error unregistering {}"namee);
        } catch (MBeanRegistrationException e) {
            .debug("Error unregistering {}"namee);
        }
    }
New to GrepCode? Check out our FAQ X