package com.intrbiz.bergamot.ui.util;
import java.io.IOException;
import com.codahale.metrics.Counter;
import com.codahale.metrics.Counting;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.Histogram;
import com.codahale.metrics.Meter;
import com.codahale.metrics.Metered;
import com.codahale.metrics.Metric;
import com.codahale.metrics.Sampling;
import com.codahale.metrics.Snapshot;
import com.codahale.metrics.Timer;
import com.fasterxml.jackson.core.JsonGenerator;
public class MetricWriter
{
public static void writeMetric(Metric mv, JsonGenerator jg) throws IOException
{
jg.writeStartObject();
//
if (mv instanceof Gauge)
writeGauge((Gauge<?>) mv, jg);
else if (mv instanceof Counter)
writeCounter((Counter) mv, jg);
else if (mv instanceof Meter)
writeMeter((Meter) mv, jg);
else if (mv instanceof Timer)
writeTimer((Timer) mv, jg);
else if (mv instanceof Histogram)
writeHistogram((Histogram) mv, jg);
//
jg.writeEndObject();
}
public static void writeCounter(Counter c, JsonGenerator jg) throws IOException
{
jg.writeFieldName("count");
jg.writeNumber(c.getCount());
//
jg.writeFieldName("type");
jg.writeString("counter");
}
public static void writeMeter(Meter m, JsonGenerator jg) throws IOException
{
jg.writeFieldName("count");
jg.writeNumber(m.getCount());
//
jg.writeFieldName("mean-rate");
jg.writeNumber(m.getMeanRate());
//
jg.writeFieldName("one-minute-rate");
jg.writeNumber(m.getOneMinuteRate());
//
jg.writeFieldName("five-minute-rate");
jg.writeNumber(m.getFiveMinuteRate());
//
jg.writeFieldName("fifteen-minute-rate");
jg.writeNumber(m.getFifteenMinuteRate());
//
jg.writeFieldName("type");
jg.writeString("meter");
}
public static void writeTimer(Timer t, JsonGenerator jg) throws IOException
{
writeMetered(t, jg);
writeSampling(t, jg);
//
jg.writeFieldName("type");
jg.writeString("timer");
}
public static void writeCounting(Counting m, JsonGenerator jg) throws IOException
{
jg.writeFieldName("count");
jg.writeNumber(m.getCount());
}
public static void writeMetered(Metered m, JsonGenerator jg) throws IOException
{
writeCounting(m, jg);
//
jg.writeFieldName("mean-rate");
jg.writeNumber(m.getMeanRate());
//
jg.writeFieldName("one-minute-rate");
jg.writeNumber(m.getOneMinuteRate());
//
jg.writeFieldName("five-minute-rate");
jg.writeNumber(m.getFiveMinuteRate());
//
jg.writeFieldName("fifteen-minute-rate");
jg.writeNumber(m.getFifteenMinuteRate());
}
public static void writeSampling(Sampling m, JsonGenerator jg) throws IOException
{
Snapshot s = m.getSnapshot();
jg.writeFieldName("snapshot");
jg.writeStartObject();
//
jg.writeFieldName("percentile-75");
jg.writeNumber(s.get75thPercentile());
//
jg.writeFieldName("percentile-95");
jg.writeNumber(s.get95thPercentile());
//
jg.writeFieldName("percentile-98");
jg.writeNumber(s.get98thPercentile());
//
jg.writeFieldName("percentile-99");
jg.writeNumber(s.get99thPercentile());
//
jg.writeFieldName("percentile-999");
jg.writeNumber(s.get999thPercentile());
//
jg.writeFieldName("size");
jg.writeNumber(s.size());
//
jg.writeFieldName("median");
jg.writeNumber(s.getMedian());
//
jg.writeFieldName("min");
jg.writeNumber(s.getMin());
//
jg.writeFieldName("mean");
jg.writeNumber(s.getMean());
//
jg.writeFieldName("max");
jg.writeNumber(s.getMax());
//
jg.writeFieldName("std-dev");
jg.writeNumber(s.getStdDev());
//
jg.writeEndObject();
}
public static void writeHistogram(Histogram h, JsonGenerator jg) throws IOException
{
writeCounting(h, jg);
writeSampling(h, jg);
//
jg.writeFieldName("type");
jg.writeString("histogram");
}
public static void writeGauge(Gauge<?> g, JsonGenerator jg) throws IOException
{
Object val = g.getValue();
jg.writeFieldName("value");
if (val instanceof String)
{
jg.writeString((String) val);
//
jg.writeFieldName("value-type");
jg.writeString("String");
}
else if (val instanceof Integer)
{
jg.writeNumber((int) val);
//
jg.writeFieldName("value-type");
jg.writeString("Integer");
}
else if (val instanceof Long)
{
jg.writeNumber((long) val);
//
jg.writeFieldName("value-type");
jg.writeString("Long");
}
else if (val instanceof Float)
{
jg.writeNumber((float) val);
//
jg.writeFieldName("value-type");
jg.writeString("Float");
}
else if (val instanceof Double)
{
jg.writeNumber((double) val);
//
jg.writeFieldName("value-type");
jg.writeString("Double");
}
else if (val instanceof Boolean)
{
jg.writeBoolean((boolean) val);
//
jg.writeFieldName("value-type");
jg.writeString("Boolean");
}
else
{
jg.writeNull();
//
jg.writeFieldName("value-type");
jg.writeNull();
}
//
jg.writeFieldName("type");
jg.writeString("gauge");
}
}