package io.dropwizard.metrics.json; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import io.dropwizard.metrics.json.MetricsModule; import io.dropwizard.metrics.Counter; import io.dropwizard.metrics.Gauge; import io.dropwizard.metrics.Histogram; import io.dropwizard.metrics.Meter; import io.dropwizard.metrics.MetricFilter; import io.dropwizard.metrics.MetricRegistry; import io.dropwizard.metrics.Snapshot; import io.dropwizard.metrics.Timer; import java.util.concurrent.TimeUnit; public class MetricsModuleTest { private final ObjectMapper mapper = new ObjectMapper().registerModule( new MetricsModule(TimeUnit.SECONDS, TimeUnit.MILLISECONDS, false, MetricFilter.ALL)); @Test public void serializesGauges() throws Exception { final Gauge<Integer> gauge = new Gauge<Integer>() { @Override public Integer getValue() { return 100; } }; assertThat(mapper.writeValueAsString(gauge)) .isEqualTo("{\"value\":100}"); } @Test public void serializesGaugesThatThrowExceptions() throws Exception { final Gauge<Integer> gauge = new Gauge<Integer>() { @Override public Integer getValue() { throw new IllegalArgumentException("poops"); } }; assertThat(mapper.writeValueAsString(gauge)) .isEqualTo("{\"error\":\"java.lang.IllegalArgumentException: poops\"}"); } @Test public void serializesCounters() throws Exception { final Counter counter = mock(Counter.class); when(counter.getCount()).thenReturn(100L); assertThat(mapper.writeValueAsString(counter)) .isEqualTo("{\"count\":100}"); } @Test public void serializesHistograms() throws Exception { final Histogram histogram = mock(Histogram.class); when(histogram.getCount()).thenReturn(1L); final Snapshot snapshot = mock(Snapshot.class); when(snapshot.getMax()).thenReturn(2L); when(snapshot.getMean()).thenReturn(3.0); when(snapshot.getMin()).thenReturn(4L); when(snapshot.getStdDev()).thenReturn(5.0); when(snapshot.getMedian()).thenReturn(6.0); when(snapshot.get75thPercentile()).thenReturn(7.0); when(snapshot.get95thPercentile()).thenReturn(8.0); when(snapshot.get98thPercentile()).thenReturn(9.0); when(snapshot.get99thPercentile()).thenReturn(10.0); when(snapshot.get999thPercentile()).thenReturn(11.0); when(snapshot.getValues()).thenReturn(new long[]{ 1, 2, 3 }); when(histogram.getSnapshot()).thenReturn(snapshot); assertThat(mapper.writeValueAsString(histogram)) .isEqualTo("{" + "\"count\":1," + "\"max\":2," + "\"mean\":3.0," + "\"min\":4," + "\"p50\":6.0," + "\"p75\":7.0," + "\"p95\":8.0," + "\"p98\":9.0," + "\"p99\":10.0," + "\"p999\":11.0," + "\"stddev\":5.0}"); final ObjectMapper fullMapper = new ObjectMapper().registerModule( new MetricsModule(TimeUnit.SECONDS, TimeUnit.MILLISECONDS, true, MetricFilter.ALL)); assertThat(fullMapper.writeValueAsString(histogram)) .isEqualTo("{" + "\"count\":1," + "\"max\":2," + "\"mean\":3.0," + "\"min\":4," + "\"p50\":6.0," + "\"p75\":7.0," + "\"p95\":8.0," + "\"p98\":9.0," + "\"p99\":10.0," + "\"p999\":11.0," + "\"values\":[1,2,3]," + "\"stddev\":5.0}"); } @Test public void serializesMeters() throws Exception { final Meter meter = mock(Meter.class); when(meter.getCount()).thenReturn(1L); when(meter.getMeanRate()).thenReturn(2.0); when(meter.getOneMinuteRate()).thenReturn(5.0); when(meter.getFiveMinuteRate()).thenReturn(4.0); when(meter.getFifteenMinuteRate()).thenReturn(3.0); assertThat(mapper.writeValueAsString(meter)) .isEqualTo("{" + "\"count\":1," + "\"m1_rate\":5.0," + "\"m5_rate\":4.0," + "\"m15_rate\":3.0," + "\"mean_rate\":2.0," + "\"units\":\"events/second\"}"); } @Test public void serializesTimers() throws Exception { final Timer timer = mock(Timer.class); when(timer.getCount()).thenReturn(1L); when(timer.getMeanRate()).thenReturn(2.0); when(timer.getOneMinuteRate()).thenReturn(3.0); when(timer.getFiveMinuteRate()).thenReturn(4.0); when(timer.getFifteenMinuteRate()).thenReturn(5.0); final Snapshot snapshot = mock(Snapshot.class); when(snapshot.getMax()).thenReturn(TimeUnit.MILLISECONDS.toNanos(100)); when(snapshot.getMean()).thenReturn((double) TimeUnit.MILLISECONDS.toNanos(200)); when(snapshot.getMin()).thenReturn(TimeUnit.MILLISECONDS.toNanos(300)); when(snapshot.getStdDev()).thenReturn((double) TimeUnit.MILLISECONDS.toNanos(400)); when(snapshot.getMedian()).thenReturn((double) TimeUnit.MILLISECONDS.toNanos(500)); when(snapshot.get75thPercentile()).thenReturn((double) TimeUnit.MILLISECONDS.toNanos(600)); when(snapshot.get95thPercentile()).thenReturn((double) TimeUnit.MILLISECONDS.toNanos(700)); when(snapshot.get98thPercentile()).thenReturn((double) TimeUnit.MILLISECONDS.toNanos(800)); when(snapshot.get99thPercentile()).thenReturn((double) TimeUnit.MILLISECONDS.toNanos(900)); when(snapshot.get999thPercentile()).thenReturn((double) TimeUnit.MILLISECONDS.toNanos(1000)); when(snapshot.getValues()).thenReturn(new long[]{ TimeUnit.MILLISECONDS.toNanos(1), TimeUnit.MILLISECONDS.toNanos(2), TimeUnit.MILLISECONDS.toNanos(3) }); when(timer.getSnapshot()).thenReturn(snapshot); assertThat(mapper.writeValueAsString(timer)) .isEqualTo("{" + "\"count\":1," + "\"max\":100.0," + "\"mean\":200.0," + "\"min\":300.0," + "\"p50\":500.0," + "\"p75\":600.0," + "\"p95\":700.0," + "\"p98\":800.0," + "\"p99\":900.0," + "\"p999\":1000.0," + "\"stddev\":400.0," + "\"m1_rate\":3.0," + "\"m5_rate\":4.0," + "\"m15_rate\":5.0," + "\"mean_rate\":2.0," + "\"duration_units\":\"milliseconds\"," + "\"rate_units\":\"calls/second\"}"); final ObjectMapper fullMapper = new ObjectMapper().registerModule( new MetricsModule(TimeUnit.SECONDS, TimeUnit.MILLISECONDS, true, MetricFilter.ALL)); assertThat(fullMapper.writeValueAsString(timer)) .isEqualTo("{" + "\"count\":1," + "\"max\":100.0," + "\"mean\":200.0," + "\"min\":300.0," + "\"p50\":500.0," + "\"p75\":600.0," + "\"p95\":700.0," + "\"p98\":800.0," + "\"p99\":900.0," + "\"p999\":1000.0," + "\"values\":[1.0,2.0,3.0]," + "\"stddev\":400.0," + "\"m1_rate\":3.0," + "\"m5_rate\":4.0," + "\"m15_rate\":5.0," + "\"mean_rate\":2.0," + "\"duration_units\":\"milliseconds\"," + "\"rate_units\":\"calls/second\"}"); } @Test public void serializesMetricRegistries() throws Exception { final MetricRegistry registry = new MetricRegistry(); assertThat(mapper.writeValueAsString(registry)) .isEqualTo("{" + "\"version\":\"4.0.0\"," + "\"gauges\":{}," + "\"counters\":{}," + "\"histograms\":{}," + "\"meters\":{}," + "\"timers\":{}}"); } }