package io.dropwizard.metrics.jvm;
import org.junit.Before;
import org.junit.Test;
import io.dropwizard.metrics.jvm.MemoryUsageGaugeSet;
import io.dropwizard.metrics.Gauge;
import io.dropwizard.metrics.MetricName;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryUsage;
import java.util.Arrays;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class MemoryUsageGaugeSetTest {
private final MemoryUsage heap = mock(MemoryUsage.class);
private final MemoryUsage nonHeap = mock(MemoryUsage.class);
private final MemoryUsage pool = mock(MemoryUsage.class);
private final MemoryUsage weirdPool = mock(MemoryUsage.class);
private final MemoryUsage weirdCollection = mock(MemoryUsage.class);
private final MemoryMXBean mxBean = mock(MemoryMXBean.class);
private final MemoryPoolMXBean memoryPool = mock(MemoryPoolMXBean.class);
private final MemoryPoolMXBean weirdMemoryPool = mock(MemoryPoolMXBean.class);
private final MemoryUsageGaugeSet gauges = new MemoryUsageGaugeSet(mxBean,
Arrays.asList(memoryPool,
weirdMemoryPool));
private static final MetricName TOTAL = MetricName.build("total");
private static final MetricName HEAP = MetricName.build("heap");
private static final MetricName NON_HEAP = MetricName.build("non-heap");
private static final MetricName POOLS = MetricName.build("pools");
private static final MetricName BIG_POOL = POOLS.resolve("Big-Pool");
private static final MetricName WEIRD_POOL = POOLS.resolve("Weird-Pool");
private static final MetricName TOTAL_MAX = TOTAL.resolve("max");
private static final MetricName TOTAL_INIT = TOTAL.resolve("init");
private static final MetricName TOTAL_USED = TOTAL.resolve("used");
private static final MetricName TOTAL_COMMITTED = TOTAL.resolve("committed");
private static final MetricName HEAP_INIT = HEAP.resolve("init");
private static final MetricName HEAP_COMMITTED = HEAP.resolve("committed");
private static final MetricName HEAP_USAGE = HEAP.resolve("usage");
private static final MetricName HEAP_USED = HEAP.resolve("used");
private static final MetricName HEAP_MAX = HEAP.resolve("max");
private static final MetricName NON_HEAP_USAGE = NON_HEAP.resolve("usage");
private static final MetricName NON_HEAP_MAX = NON_HEAP.resolve("max");
private static final MetricName NON_HEAP_USED = NON_HEAP.resolve("used");
private static final MetricName NON_HEAP_INIT = NON_HEAP.resolve("init");
private static final MetricName NON_HEAP_COMMITTED = NON_HEAP.resolve("committed");
@Before
public void setUp() throws Exception {
when(heap.getCommitted()).thenReturn(10L);
when(heap.getInit()).thenReturn(20L);
when(heap.getUsed()).thenReturn(30L);
when(heap.getMax()).thenReturn(40L);
when(nonHeap.getCommitted()).thenReturn(1L);
when(nonHeap.getInit()).thenReturn(2L);
when(nonHeap.getUsed()).thenReturn(3L);
when(nonHeap.getMax()).thenReturn(4L);
when(pool.getCommitted()).thenReturn(100L);
when(pool.getInit()).thenReturn(200L);
when(pool.getUsed()).thenReturn(300L);
when(pool.getMax()).thenReturn(400L);
when(weirdPool.getCommitted()).thenReturn(100L);
when(weirdPool.getInit()).thenReturn(200L);
when(weirdPool.getUsed()).thenReturn(300L);
when(weirdPool.getMax()).thenReturn(-1L);
when(weirdCollection.getUsed()).thenReturn(290L);
when(mxBean.getHeapMemoryUsage()).thenReturn(heap);
when(mxBean.getNonHeapMemoryUsage()).thenReturn(nonHeap);
when(memoryPool.getUsage()).thenReturn(pool);
// Mock that "Big Pool" is a non-collected pool therefore doesn't
// have collection usage statistics.
when(memoryPool.getCollectionUsage()).thenReturn(null);
when(memoryPool.getName()).thenReturn("Big Pool");
when(weirdMemoryPool.getUsage()).thenReturn(weirdPool);
when(weirdMemoryPool.getCollectionUsage()).thenReturn(weirdCollection);
when(weirdMemoryPool.getName()).thenReturn("Weird Pool");
}
@Test
public void hasASetOfGauges() throws Exception {
assertThat(gauges.getMetrics().keySet())
.containsOnly(
HEAP_INIT,
HEAP_COMMITTED,
HEAP_USED,
HEAP_USAGE,
HEAP_MAX,
NON_HEAP_INIT,
NON_HEAP_COMMITTED,
NON_HEAP_USED,
NON_HEAP_USAGE,
NON_HEAP_MAX,
TOTAL_INIT,
TOTAL_COMMITTED,
TOTAL_USED,
TOTAL_MAX,
BIG_POOL.resolve("init"),
BIG_POOL.resolve("committed"),
BIG_POOL.resolve("used"),
BIG_POOL.resolve("usage"),
BIG_POOL.resolve("max"),
// skip in non-collected pools - "pools.Big-Pool.used-after-gc",
WEIRD_POOL.resolve("init"),
WEIRD_POOL.resolve("committed"),
WEIRD_POOL.resolve("used"),
WEIRD_POOL.resolve("used-after-gc"),
WEIRD_POOL.resolve("usage"),
WEIRD_POOL.resolve("max"));
}
@Test
public void hasAGaugeForTotalCommitted() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(TOTAL_COMMITTED);
assertThat(gauge.getValue())
.isEqualTo(11L);
}
@Test
public void hasAGaugeForTotalInit() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(TOTAL_INIT);
assertThat(gauge.getValue())
.isEqualTo(22L);
}
@Test
public void hasAGaugeForTotalUsed() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(TOTAL_USED);
assertThat(gauge.getValue())
.isEqualTo(33L);
}
@Test
public void hasAGaugeForTotalMax() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(TOTAL_MAX);
assertThat(gauge.getValue())
.isEqualTo(44L);
}
@Test
public void hasAGaugeForHeapCommitted() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(HEAP_COMMITTED);
assertThat(gauge.getValue())
.isEqualTo(10L);
}
@Test
public void hasAGaugeForHeapInit() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(HEAP_INIT);
assertThat(gauge.getValue())
.isEqualTo(20L);
}
@Test
public void hasAGaugeForHeapUsed() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(HEAP_USED);
assertThat(gauge.getValue())
.isEqualTo(30L);
}
@Test
public void hasAGaugeForHeapMax() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(HEAP_MAX);
assertThat(gauge.getValue())
.isEqualTo(40L);
}
@Test
public void hasAGaugeForHeapUsage() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(HEAP_USAGE);
assertThat(gauge.getValue())
.isEqualTo(0.75);
}
@Test
public void hasAGaugeForNonHeapCommitted() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(NON_HEAP_COMMITTED);
assertThat(gauge.getValue())
.isEqualTo(1L);
}
@Test
public void hasAGaugeForNonHeapInit() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(NON_HEAP_INIT);
assertThat(gauge.getValue())
.isEqualTo(2L);
}
@Test
public void hasAGaugeForNonHeapUsed() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(NON_HEAP_USED);
assertThat(gauge.getValue())
.isEqualTo(3L);
}
@Test
public void hasAGaugeForNonHeapMax() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(NON_HEAP_MAX);
assertThat(gauge.getValue())
.isEqualTo(4L);
}
@Test
public void hasAGaugeForNonHeapUsage() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(NON_HEAP_USAGE);
assertThat(gauge.getValue())
.isEqualTo(0.75);
}
@Test
public void hasAGaugeForMemoryPoolUsage() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(BIG_POOL.resolve("usage"));
assertThat(gauge.getValue())
.isEqualTo(0.75);
}
@Test
public void hasAGaugeForWeirdMemoryPoolInit() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(WEIRD_POOL.resolve("init"));
assertThat(gauge.getValue())
.isEqualTo(200L);
}
@Test
public void hasAGaugeForWeirdMemoryPoolCommitted() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(WEIRD_POOL.resolve("committed"));
assertThat(gauge.getValue())
.isEqualTo(100L);
}
@Test
public void hasAGaugeForWeirdMemoryPoolUsed() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(WEIRD_POOL.resolve("used"));
assertThat(gauge.getValue())
.isEqualTo(300L);
}
@Test
public void hasAGaugeForWeirdMemoryPoolUsage() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(WEIRD_POOL.resolve("usage"));
assertThat(gauge.getValue())
.isEqualTo(3.0);
}
@Test
public void hasAGaugeForWeirdMemoryPoolMax() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(WEIRD_POOL.resolve("max"));
assertThat(gauge.getValue())
.isEqualTo(-1L);
}
@Test
public void hasAGaugeForWeirdCollectionPoolUsed() throws Exception {
final Gauge gauge = (Gauge) gauges.getMetrics().get(WEIRD_POOL.resolve("used-after-gc"));
assertThat(gauge.getValue())
.isEqualTo(290L);
}
@Test
public void autoDetectsMemoryUsageBeanAndMemoryPools() throws Exception {
assertThat(new MemoryUsageGaugeSet().getMetrics().keySet())
.isNotEmpty();
}
}