package org.reveno.atp.metrics;
import org.junit.Assert;
import org.junit.Test;
import org.reveno.atp.metrics.meter.Histogram;
import org.reveno.atp.metrics.meter.HistogramType;
import org.reveno.atp.metrics.meter.impl.TwoBufferHistogram;
import org.reveno.atp.utils.MeasureUtils;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class TestMetrics {
protected final String NAME = "reveno.core";
@Test
public void testHistogram() {
MockSink sink = new MockSink();
Histogram histogram = new TwoBufferHistogram(NAME, MeasureUtils.kb(128));
histogram.update(13).update(23).update(12).update(44).update(55);
histogram.sendTo(Collections.singletonList(sink), false);
Assert.assertEquals(sink.getMetrics().get(NAME + ".mean"), "29");
Assert.assertEquals(sink.getMetrics().get(NAME + ".stddev"), "0");
Assert.assertEquals(sink.getMetrics().get(NAME + ".min"), "12");
Assert.assertEquals(sink.getMetrics().get(NAME + ".max"), "55");
histogram.update(14).update(23).update(11).update(47).update(55);
histogram.sendTo(Collections.singletonList(sink), false);
Assert.assertEquals(sink.getMetrics().get(NAME + ".mean"), "30");
Assert.assertEquals(sink.getMetrics().get(NAME + ".stddev"), "16");
Assert.assertEquals(sink.getMetrics().get(NAME + ".min"), "11");
Assert.assertEquals(sink.getMetrics().get(NAME + ".max"), "55");
histogram.destroy();
sink.getMetrics().clear();
histogram = new TwoBufferHistogram(NAME, 16, HistogramType.DISCARD_OVERFLOW);
histogram.update(13).update(23).update(12).update(44).update(55);
histogram.sendTo(Collections.singletonList(sink), false);
Assert.assertEquals(sink.getMetrics().get(NAME + ".mean"), "18");
Assert.assertEquals(sink.getMetrics().get(NAME + ".min"), "13");
Assert.assertEquals(sink.getMetrics().get(NAME + ".max"), "23");
histogram = new TwoBufferHistogram(NAME, 16, HistogramType.RANDOM_VITTERS_R);
histogram.update(13).update(23).update(12).update(44).update(55);
histogram.sendTo(Collections.singletonList(sink), false);
Assert.assertNotEquals(sink.getMetrics().get(NAME + ".mean"), "18");
}
protected static class MockSink implements Sink {
protected Map<String, String> metrics = new HashMap<>();
public Map<String, String> getMetrics() {
return metrics;
}
@Override
public void init() {
}
@Override
public void send(String name, String value, long timestamp) {
metrics.put(name, value);
}
@Override
public void close() {
}
@Override
public boolean isAvailable() {
return true;
}
}
}