package org.stagemonitor.core.metrics;
import java.util.SortedMap;
import java.util.concurrent.TimeUnit;
import com.codahale.metrics.Counter;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.Histogram;
import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.ScheduledReporter;
import com.codahale.metrics.Timer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.stagemonitor.core.Stagemonitor;
import org.stagemonitor.core.elasticsearch.ElasticsearchClient;
import org.stagemonitor.core.util.JsonUtils;
/**
* This implementation is intended to report aggregate metrics about a measurement session to elasticsearch on shutdown
*/
public class SimpleElasticsearchReporter extends ScheduledReporter {
private final ElasticsearchClient elasticsearchClient;
public SimpleElasticsearchReporter(ElasticsearchClient elasticsearchClient, MetricRegistry registry, String name, MetricFilter filter) {
super(registry, name, filter, TimeUnit.SECONDS, TimeUnit.MILLISECONDS);
this.elasticsearchClient = elasticsearchClient;
}
@Override
public void report(SortedMap<String, Gauge> gauges, SortedMap<String, Counter> counters,
SortedMap<String, Histogram> histograms, SortedMap<String, Meter> meters, SortedMap<String, Timer> timers) {
final ObjectMapper mapper = JsonUtils.getMapper();
final ObjectNode jsonReport = mapper.valueToTree(Stagemonitor.getMeasurementSession());
jsonReport.set("gauges", mapper.valueToTree(gauges));
jsonReport.set("counters", mapper.valueToTree(counters));
jsonReport.set("histograms", mapper.valueToTree(histograms));
jsonReport.set("meters", mapper.valueToTree(meters));
jsonReport.set("timers", mapper.valueToTree(timers));
elasticsearchClient.sendAsJson("POST", "/stagemonitor/measurementSessions", jsonReport);
}
}