package org.stagemonitor.core.metrics;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.stagemonitor.core.metrics.MetricsReporterTestHelper.counter;
import static org.stagemonitor.core.metrics.MetricsReporterTestHelper.gauge;
import static org.stagemonitor.core.metrics.MetricsReporterTestHelper.histogram;
import static org.stagemonitor.core.metrics.MetricsReporterTestHelper.map;
import static org.stagemonitor.core.metrics.MetricsReporterTestHelper.meter;
import static org.stagemonitor.core.metrics.MetricsReporterTestHelper.snapshot;
import static org.stagemonitor.core.metrics.MetricsReporterTestHelper.timer;
import static org.stagemonitor.core.metrics.metrics2.MetricName.name;
import java.math.BigInteger;
import java.util.Locale;
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.Timer;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.stagemonitor.core.metrics.metrics2.Metric2Registry;
public class MetricsAggregationReporterTest {
private MetricsAggregationReporter reporter;
private Logger logger;
@Before
public void setUp() throws Exception {
logger = mock(Logger.class);
SortedTableLogReporter onShutdownReporter = SortedTableLogReporter
.forRegistry(mock(Metric2Registry.class))
.log(logger)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.NANOSECONDS)
.formattedFor(Locale.US)
.build();
reporter = MetricsAggregationReporter.forRegistry(new Metric2Registry()).addOnShutdownReporter(onShutdownReporter).build();
}
@Test
public void testComputeAverage() throws Exception {
long[] measurements = new long[]{12, 3, 43, 5, 6, 56, 745, 34, 23, 32, 432, 3};
double avg = 0;
for (int i = 0; i < measurements.length; i++) {
avg = MetricsAggregationReporter.computeMovingAverage(avg, i, measurements[i]);
}
Assert.assertEquals(getAverage(measurements), avg, 0.000000000001);
}
private double getAverage(long[] measurements) {
double sum = 0;
for (long measurement : measurements) {
sum += measurement;
}
return sum / measurements.length;
}
@Test
public void testReportGauges() throws Exception {
reporter.reportMetrics(map(name("string").build(), gauge("foo")).add(name("double").build(), gauge(2.5d)).add(name("BigInteger").build(), gauge(new BigInteger("2"))),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map());
reporter.reportMetrics(map(name("string").build(), gauge("bar")).add(name("double").build(), gauge(2.5d * 3)).add(name("BigInteger").build(), gauge(new BigInteger("6"))),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map());
reporter.onShutDown();
verify(logger).info("Metrics ========================================================================\n" +
"\n" +
"-- Gauges ----------------------------------------------------------------------\n" +
"name | value\n" +
" string | bar\n" +
" double | 5.0\n" +
"BigInteger | 4.0\n" +
"\n" +
"\n");
}
@Test
public void testReportCounters() throws Exception {
reporter.reportMetrics(MetricsReporterTestHelper.map(),
map(name("c1").build(), counter(2)),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map());
reporter.reportMetrics(MetricsReporterTestHelper.map(),
map(name("counter1").build(), counter(3)).add(name("counter2").build(), counter(5)),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map());
reporter.onShutDown();
verify(logger).info("Metrics ========================================================================\n" +
"\n" +
"-- Counters --------------------------------------------------------------------\n" +
"name | count\n" +
"counter2 | 5\n" +
"counter1 | 3\n" +
"\n" +
"\n");
}
@Test
public void testReportHistograms() throws Exception {
reporter.reportMetrics(MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
map(name("histogram").build(), histogram(1, snapshot(4, 11L, 2L, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0))),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map());
reporter.reportMetrics(MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
map(name("histogram").build(), histogram(1 * 3, snapshot(4 * 3, 11L * 3, 2L * 3, 5.0 * 3, 6.0 * 3, 7.0 * 3, 8.0 * 3, 9.0 * 3, 10.0 * 3, 11.0 * 3))),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map());
reporter.onShutDown();
verify(logger).info("Metrics ========================================================================\n" +
"\n" +
"-- Histograms ------------------------------------------------------------------\n" +
"name | count | mean | min | max | stddev | p50 | p75 | p95 | p98 | p99 | p999 |\n" +
"histogram | 3 | 8.00 | 2.00 | 33.00 | 10.00 | 12.00 | 14.00 | 16.00 | 18.00 | 20.00 | 22.00 | \n\n\n");
}
@Test
public void reportsMeterValues() throws Exception {
reporter.reportMetrics(MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
map(name("test.meter1").build(), meter(1L)).add(name("test.meter2").build(), meter(2)),
MetricsReporterTestHelper.map());
reporter.onShutDown();
verify(logger).info("Metrics ========================================================================\n" +
"\n" +
"-- Meters ----------------------------------------------------------------------\n" +
"name | count | mean_rate | m1_rate | m5_rate | m15_rate | rate_unit | duration_unit\n" +
"test.meter2 | 2 | 2.00 | 3.00 | 4.00 | 5.00 | second | nanoseconds\n" +
"test.meter1 | 1 | 2.00 | 3.00 | 4.00 | 5.00 | second | nanoseconds\n" +
"\n" +
"\n");
}
@Test
public void testReportTimers() throws Exception {
reporter.reportMetrics(MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
map(name("timer1").build(), timer(1L, 2.0, 3.0, 4.0, 5.0, snapshot(4, 11L, 2L, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0))));
reporter.reportMetrics(MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
MetricsReporterTestHelper.map(),
map(name("timer1").build(), timer(4L, 2.0 * 3, 3.0 * 3, 4.0 * 3, 5.0 * 3, snapshot(4 * 3, 11L * 3, 1, 5.0 * 3, 6.0 * 3, 7.0 * 3, 8.0 * 3, 9.0 * 3, 10.0 * 3, 11.0 * 3))));
reporter.onShutDown();
verify(logger).info("Metrics ========================================================================\n" +
"\n" +
"-- Timers ----------------------------------------------------------------------\n" +
"name | count | mean | min | max | stddev | p50 | p75 | p95 | p98 | p99 | p999 | mean_rate | m1_rate | m5_rate | m15_rate | rate_unit | duration_unit\n" +
"timer1 | 4 | 8.00 | 1.00 | 33.00 | 10.00 | 12.00 | 14.00 | 16.00 | 18.00 | 20.00 | 22.00 | 6.00 | 6.00 | 6.00 | 6.00 | second | nanoseconds\n\n\n");
}
}