package io.pcp.parfait.dropwizard.metricadapters;
import static tec.uom.se.AbstractUnit.ONE;
import com.codahale.metrics.Metered;
import io.pcp.parfait.Monitorable;
import io.pcp.parfait.ValueSemantics;
import io.pcp.parfait.dropwizard.MetricAdapter;
import com.google.common.collect.Maps;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import javax.measure.Unit;
import java.util.Map;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class MeteredAdapterTest {
public static final String NAME = "NAME";
public static final String DESCRIPTION = "DESCRIPTION";
private static final double INITIAL_FIFTEEN_MINUTE_RATE = 1.1;
private static final double INITIAL_FIVE_MINUTE_RATE = 2.2;
private static final double INITIAL_ONE_MINUTE_RATE = 3.3;
private static final double INITIAL_MEAN_RATE = 4.4;
private static final long INITIAL_COUNT = 42;
private static final String FIFTEEN_MINUTE_RATE = "fifteen_minute_rate";
private static final String FIVE_MINUTE_RATE = "five_minute_rate";
private static final String ONE_MINUTE_RATE = "one_minute_rate";
private static final String MEAN_RATE = "mean_rate";
private static final String COUNT = "count";
@Mock
private Metered metered;
private MeteredAdapter meteredAdapter;
@Before
public void setUp() {
when(metered.getFifteenMinuteRate()).thenReturn(INITIAL_FIFTEEN_MINUTE_RATE);
when(metered.getFiveMinuteRate()).thenReturn(INITIAL_FIVE_MINUTE_RATE);
when(metered.getOneMinuteRate()).thenReturn(INITIAL_ONE_MINUTE_RATE);
when(metered.getMeanRate()).thenReturn(INITIAL_MEAN_RATE);
when(metered.getCount()).thenReturn(INITIAL_COUNT);
meteredAdapter = new MeteredAdapter(metered, NAME, DESCRIPTION);
}
@Test
public void shouldPublishFifteenMinuteRateMetricInNanoseconds() {
assertThat(extractMonitorables(meteredAdapter).get(FIFTEEN_MINUTE_RATE), notNullValue());
assertThat(extractMonitorables(meteredAdapter).get(FIFTEEN_MINUTE_RATE).getDescription(), is(DESCRIPTION + " - Fifteen minute rate"));
assertThat(extractMonitorables(meteredAdapter).get(FIFTEEN_MINUTE_RATE).get(), Matchers.<Object>is(INITIAL_FIFTEEN_MINUTE_RATE));
assertThat(extractMonitorables(meteredAdapter).get(FIFTEEN_MINUTE_RATE).getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(extractMonitorables(meteredAdapter).get(FIFTEEN_MINUTE_RATE).getUnit(), Matchers.<Unit>is(ONE));
}
@Test
public void shouldPublishFiveMinuteRateMetric() {
assertThat(extractMonitorables(meteredAdapter).get(FIVE_MINUTE_RATE), notNullValue());
assertThat(extractMonitorables(meteredAdapter).get(FIVE_MINUTE_RATE).getDescription(), is(DESCRIPTION + " - Five minute rate"));
assertThat(extractMonitorables(meteredAdapter).get(FIVE_MINUTE_RATE).get(), Matchers.<Object>is(INITIAL_FIVE_MINUTE_RATE));
assertThat(extractMonitorables(meteredAdapter).get(FIVE_MINUTE_RATE).getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(extractMonitorables(meteredAdapter).get(FIVE_MINUTE_RATE).getUnit(), Matchers.<Unit>is(ONE));
}
@Test
public void shouldPublishOneMinuteRateMetric() {
assertThat(extractMonitorables(meteredAdapter).get(ONE_MINUTE_RATE), notNullValue());
assertThat(extractMonitorables(meteredAdapter).get(ONE_MINUTE_RATE).getDescription(), is(DESCRIPTION + " - One minute rate"));
assertThat(extractMonitorables(meteredAdapter).get(ONE_MINUTE_RATE).get(), Matchers.<Object>is(INITIAL_ONE_MINUTE_RATE));
assertThat(extractMonitorables(meteredAdapter).get(ONE_MINUTE_RATE).getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(extractMonitorables(meteredAdapter).get(ONE_MINUTE_RATE).getUnit(), Matchers.<Unit>is(ONE));
}
@Test
public void shouldPublishMeanRateMetric() {
assertThat(extractMonitorables(meteredAdapter).get(MEAN_RATE), notNullValue());
assertThat(extractMonitorables(meteredAdapter).get(MEAN_RATE).getDescription(), is(DESCRIPTION + " - Mean rate"));
assertThat(extractMonitorables(meteredAdapter).get(MEAN_RATE).get(), Matchers.<Object>is(INITIAL_MEAN_RATE));
assertThat(extractMonitorables(meteredAdapter).get(MEAN_RATE).getSemantics(), is(ValueSemantics.FREE_RUNNING));
assertThat(extractMonitorables(meteredAdapter).get(MEAN_RATE).getUnit(), Matchers.<Unit>is(ONE));
}
@Test
public void shouldPublishCountMetric() {
assertThat(extractMonitorables(meteredAdapter).get(COUNT), notNullValue());
assertThat(extractMonitorables(meteredAdapter).get(COUNT).getDescription(), is(DESCRIPTION + " - Count"));
assertThat(extractMonitorables(meteredAdapter).get(COUNT).get(), Matchers.<Object>is(INITIAL_COUNT));
assertThat(extractMonitorables(meteredAdapter).get(COUNT).getSemantics(), is(ValueSemantics.MONOTONICALLY_INCREASING));
assertThat(extractMonitorables(meteredAdapter).get(COUNT).getUnit(), Matchers.<Unit>is(ONE));
}
@Test
public void shouldUpdateAllMonitorables() {
long updatedCount = INITIAL_COUNT + 1;
double updatedFifteenMinuteRate = INITIAL_FIFTEEN_MINUTE_RATE * 2.0;
double updatedFiveMinuteRate = INITIAL_FIVE_MINUTE_RATE * 2.0;
double updatedOneMinuteRate = INITIAL_ONE_MINUTE_RATE * 2.0;
double updatedMeanRate = INITIAL_MEAN_RATE * 2.0;
when(metered.getCount()).thenReturn(updatedCount);
when(metered.getFifteenMinuteRate()).thenReturn(updatedFifteenMinuteRate);
when(metered.getFiveMinuteRate()).thenReturn(updatedFiveMinuteRate);
when(metered.getOneMinuteRate()).thenReturn(updatedOneMinuteRate);
when(metered.getMeanRate()).thenReturn(updatedMeanRate);
meteredAdapter.updateMonitorables();
assertThat(extractMonitorables(meteredAdapter).get(COUNT).get(), Matchers.<Object>is(updatedCount));
assertThat(extractMonitorables(meteredAdapter).get(FIFTEEN_MINUTE_RATE).get(), Matchers.<Object>is(updatedFifteenMinuteRate));
assertThat(extractMonitorables(meteredAdapter).get(FIVE_MINUTE_RATE).get(), Matchers.<Object>is(updatedFiveMinuteRate));
assertThat(extractMonitorables(meteredAdapter).get(ONE_MINUTE_RATE).get(), Matchers.<Object>is(updatedOneMinuteRate));
assertThat(extractMonitorables(meteredAdapter).get(MEAN_RATE).get(), Matchers.<Object>is(updatedMeanRate));
}
private Map<String, Monitorable> extractMonitorables(MetricAdapter timerAdapter) {
Map<String, Monitorable> monitorables = Maps.newHashMap();
for (Monitorable monitorable : timerAdapter.getMonitorables()) {
final String name = monitorable.getName();
monitorables.put(name.substring(name.lastIndexOf('.') + 1), monitorable);
}
return monitorables;
}
}