package com.intrbiz.bergamot.ui.api;
import java.io.IOException;
import java.util.Map.Entry;
import com.codahale.metrics.Metric;
import com.fasterxml.jackson.core.JsonGenerator;
import com.intrbiz.balsa.engine.route.Router;
import com.intrbiz.balsa.error.http.BalsaNotFound;
import com.intrbiz.bergamot.metadata.IgnoreBinding;
import com.intrbiz.bergamot.ui.BergamotApp;
import com.intrbiz.bergamot.ui.util.MetricWriter;
import com.intrbiz.gerald.source.IntelligenceSource;
import com.intrbiz.gerald.witchcraft.Witchcraft;
import com.intrbiz.metadata.Get;
import com.intrbiz.metadata.Prefix;
import com.intrbiz.metadata.RequirePermission;
import com.intrbiz.metadata.RequireValidPrincipal;
@Prefix("/api/metrics")
@RequireValidPrincipal()
public class MetricsAPIRouter extends Router<BergamotApp>
{
@Get("/sources")
@RequirePermission("api.read.system.metrics")
@IgnoreBinding
public void getIntelligenceSource() throws IOException
{
JsonGenerator j = response().json().getJsonWriter();
j.writeStartObject();
j.writeArrayFieldStart("sources");
for (IntelligenceSource source : Witchcraft.get().getSources())
{
j.writeStartObject();
j.writeStringField("name", source.getName());
j.writeArrayFieldStart("metrics");
for (Entry<String, Metric> metric : source.getRegistry().getMetrics().entrySet())
{
j.writeStartObject();
// name
j.writeStringField("name", metric.getKey());
// metric
j.writeFieldName("metric");
//
MetricWriter.writeMetric(metric.getValue(), j);
//
j.writeEndObject();
}
j.writeEndArray();
j.writeEndObject();
}
j.writeEndArray();
j.writeEndObject();
j.flush();
}
@Get("/source/:source")
@RequirePermission("api.read.system.metrics")
@IgnoreBinding
public void getIntelligenceSource(String name) throws IOException
{
IntelligenceSource source = Witchcraft.get().get(name);
if (source == null) throw new BalsaNotFound();
//
JsonGenerator j = response().json().getJsonWriter();
j.writeStartObject();
j.writeStringField("name", source.getName());
j.writeArrayFieldStart("metrics");
for (Entry<String, Metric> metric : source.getRegistry().getMetrics().entrySet())
{
j.writeStartObject();
// name
j.writeStringField("name", metric.getKey());
// metric
j.writeFieldName("metric");
//
MetricWriter.writeMetric(metric.getValue(), j);
//
j.writeEndObject();
}
j.writeEndArray();
j.writeEndObject();
j.flush();
}
@Get("/metric/:source/:name")
@RequirePermission("api.read.system.metrics")
@IgnoreBinding
public void getMetric(String sourceName, String name) throws IOException
{
IntelligenceSource source = Witchcraft.get().get(sourceName);
if (source == null) throw new BalsaNotFound();
// metric
Metric metric = source.getRegistry().getMetrics().get(name);
if (metric == null) throw new BalsaNotFound();
// output
JsonGenerator j = response().json().getJsonWriter();
j.writeStartObject();
j.writeStringField("name", name);
j.writeFieldName("metric");
MetricWriter.writeMetric(metric, j);
j.writeEndObject();
j.flush();
}
}