package com.hubspot.baragon.agent.managed;
import java.net.InetSocketAddress;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.graphite.Graphite;
import com.codahale.metrics.graphite.GraphiteReporter;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.hubspot.baragon.agent.config.BaragonAgentConfiguration;
import com.hubspot.baragon.config.GraphiteConfiguration;
import com.hubspot.baragon.utils.JavaUtils;
import io.dropwizard.lifecycle.Managed;
@Singleton
public class BaragonAgentGraphiteReporterManaged implements Managed {
private static final Logger LOG = LoggerFactory.getLogger(BaragonAgentGraphiteReporterManaged.class);
private final GraphiteConfiguration graphiteConfiguration;
private final MetricRegistry registry;
private Optional<GraphiteReporter> reporter;
@Inject
public BaragonAgentGraphiteReporterManaged(BaragonAgentConfiguration configuration, MetricRegistry registry) {
this.graphiteConfiguration = configuration.getGraphiteConfiguration();
this.registry = registry;
this.reporter = Optional.absent();
}
@Override
public void start() throws Exception {
if (!graphiteConfiguration.isEnabled()) {
LOG.info("Not reporting data points to graphite.");
return;
}
LOG.info("Reporting data points to graphite server {}:{} every {} seconds with prefix '{}' and predicates '{}'.", graphiteConfiguration.getHostname(),
graphiteConfiguration.getPort(), graphiteConfiguration.getPeriodSeconds(), graphiteConfiguration.getPrefix(), JavaUtils.COMMA_JOINER.join(graphiteConfiguration.getPredicates()));
final Graphite graphite = new Graphite(new InetSocketAddress(graphiteConfiguration.getHostname(), graphiteConfiguration.getPort()));
final GraphiteReporter.Builder reporterBuilder = GraphiteReporter.forRegistry(registry);
if (!Strings.isNullOrEmpty(graphiteConfiguration.getPrefix())) {
reporterBuilder.prefixedWith(graphiteConfiguration.getPrefix());
}
if (!graphiteConfiguration.getPredicates().isEmpty()) {
reporterBuilder.filter(new MetricFilter() {
@Override
public boolean matches(String name, Metric metric) {
for (String predicate : graphiteConfiguration.getPredicates()) {
if (name.startsWith(predicate)) {
return true;
}
}
return false;
}
});
}
reporter = Optional.of(reporterBuilder.build(graphite));
reporter.get().start(graphiteConfiguration.getPeriodSeconds(), TimeUnit.SECONDS);
}
@Override
public void stop() throws Exception {
if (reporter.isPresent()) {
reporter.get().stop();
}
}
}