package org.robotninjas.riemann.metrics; import com.google.common.io.Closeables; import com.yammer.metrics.Metrics; import com.yammer.metrics.core.Clock; import com.yammer.metrics.core.Metric; import com.yammer.metrics.core.MetricName; import com.yammer.metrics.core.MetricsRegistry; import com.yammer.metrics.reporting.AbstractPollingReporter; import org.robotninjas.riemann.client.Clients; import org.robotninjas.riemann.client.RiemannClient; import org.robotninjas.riemann.client.RiemannConnection; import java.io.IOException; import java.util.Map; import java.util.SortedMap; public class RiemannReporter extends AbstractPollingReporter { public static final String REPORTER_NAME = "RiemannReporter"; private final RiemannClient client; private final Clock clock; public RiemannReporter() { this(Metrics.defaultRegistry(), Clients.makeClient(), Clock.defaultClock()); } public RiemannReporter(MetricsRegistry registry, RiemannClient client, Clock clock) { super(registry, REPORTER_NAME); this.client = client; this.clock = clock; } @Override public void run() { RiemannConnection conn = null; try { conn = client.makeConnection(); final long epoch = clock.time() / 1000; for (Map.Entry<String, SortedMap<MetricName, Metric>> entry : getMetricsRegistry().getGroupedMetrics(predicate).entrySet()) { for (Map.Entry<MetricName, Metric> subEntry : entry.getValue().entrySet()) { final Metric metric = subEntry.getValue(); if (metric != null) { try { final dispatcher.dispatch(subEntry.getValue(), subEntry.getKey(), this, epoch); } catch (Exception ignored) { LOG.error("Error printing regular metrics:", ignored); } } } } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { try { Closeables.close(conn, false); } catch (IOException e) { } } } }