/**
*
*/
package org.minnal.metrics;
import java.net.InetSocketAddress;
import java.util.concurrent.TimeUnit;
import org.minnal.core.Application;
import org.minnal.core.Bundle;
import org.minnal.core.Container;
import org.minnal.core.ContainerAdapter;
import org.minnal.core.config.ApplicationConfiguration;
import com.codahale.metrics.JmxReporter;
import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.graphite.Graphite;
import com.codahale.metrics.graphite.GraphiteReporter;
/**
* @author ganeshs
*
*/
public class MetricsBundle extends ContainerAdapter implements Bundle<MetricsBundleConfiguration> {
private ResponseMetricCollector responseMetricCollector = new ResponseMetricCollector();
private MetricsBundleConfiguration configuration;
@Override
public void init(Container container, MetricsBundleConfiguration configuration) {
this.configuration = configuration;
container.registerListener(this);
container.registerListener(responseMetricCollector);
}
@Override
public void start() {
}
@Override
public void stop() {
}
@Override
public int getOrder() {
return 0;
}
@Override
public void postMount(Application<ApplicationConfiguration> application) {
MetricRegistry registry = createMetricRegistry();
if (configuration.isEnableJmxReporter()) {
JmxReporter reporter = createJmxReporter(registry);
reporter.start();
}
if (configuration.isEnableGraphiteReporter()) {
GraphiteReporterConfiguration config = configuration.getGraphiteReporterConfiguration();
GraphiteReporter reporter = createGraphiteReporter(config, registry);
reporter.start(config.getPollPeriodInSecs(), TimeUnit.SECONDS);
}
MetricRegistries.addRegistry(application, registry);
DataSourcePoolMetricCollector collector = createDataSourceMetricCollector(application);
collector.init();
}
protected DataSourcePoolMetricCollector createDataSourceMetricCollector(Application<ApplicationConfiguration> application) {
return new DataSourcePoolMetricCollector(application);
}
protected MetricRegistry createMetricRegistry() {
return new MetricRegistry();
}
protected GraphiteReporter createGraphiteReporter(GraphiteReporterConfiguration config, MetricRegistry registry) {
Graphite graphite = new Graphite(new InetSocketAddress(config.getGraphiteHost(), config.getGraphitePort()));
return GraphiteReporter.forRegistry(registry).prefixedWith(config.getPrefix())
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.filter(MetricFilter.ALL)
.build(graphite);
}
protected JmxReporter createJmxReporter(MetricRegistry registry) {
return JmxReporter.forRegistry(registry).build();
}
@Override
public void postUnMount(Application<ApplicationConfiguration> application) {
MetricRegistries.removeRegistry(application);
}
}