package org.stagemonitor.core.metrics.metrics2;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.Metered;
import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricRegistryListener;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.*;
import org.junit.Test;
import org.mockito.Mockito;
public class Metric2RegistryTest {
@Test
public void testWrappingDropwizardMetrics() {
Metric2Registry registry = new Metric2Registry();
MetricRegistryListener listener = Mockito.mock(MetricRegistryListener.class);
registry.getMetricRegistry().addListener(listener);
registry.register(MetricName.name("test").build(), new Gauge<Integer>() {
@Override
public Integer getValue() {
return 1;
}
});
// Verify the underlying Dropwizard listener was called
Mockito.verify(listener).onGaugeAdded(Mockito.eq("test"), Mockito.<Gauge>any());
// Should be able to read the gauge from either registry
Map.Entry<MetricName, Gauge> stagemonitorEntry = registry.getGauges().entrySet().iterator().next();
Map.Entry<String, Gauge> dropwizardEntry = registry.getMetricRegistry().getGauges().entrySet().iterator().next();
assertEquals("test", stagemonitorEntry.getKey().getName());
assertEquals(1,
stagemonitorEntry.getValue().getValue());
assertEquals("test", dropwizardEntry.getKey());
assertEquals(1,
dropwizardEntry.getValue().getValue());
// Unregister should notify Dropwizard listeners
registry.remove(MetricName.name("test").build());
Mockito.verify(listener).onGaugeRemoved(Mockito.eq("test"));
assertEquals(0, registry.getGauges().size());
assertEquals(0, registry.getMetricRegistry().getGauges().size());
}
@Test(expected = IllegalArgumentException.class)
public void testDuplicateMetricNameEndsWithIllegalArgumentException() {
Metric2Registry registry = new Metric2Registry();
MetricName metric1 = MetricName.name("test").build();
registry.register(metric1, getGauge());
registry.register(metric1, getMetered());
}
@Test
public void testRegisterAny() {
Metric2Registry registry = new Metric2Registry();
final MetricName metric1 = MetricName.name("test").build();
final Gauge<Integer> gauge = getGauge();
final Metered metered = getMetered();
Metric2Set metricSet1 = new Metric2Set() {
@Override
public Map<MetricName, Metric> getMetrics() {
Map<MetricName, Metric> map = new HashMap<MetricName, Metric>(1);
map.put(metric1, gauge);
return map;
}
};
Metric2Set metricSet2 = new Metric2Set() {
@Override
public Map<MetricName, Metric> getMetrics() {
Map<MetricName, Metric> map = new HashMap<MetricName, Metric>(1);
map.put(metric1, metered);
return map;
}
};
registry.registerAny(metricSet1);
registry.registerAny(metricSet2);
// first one is registered only
assertEquals(1, registry.getGauges().entrySet().size());
assertEquals(0, registry.getMeters().entrySet().size());
Map.Entry<MetricName, Gauge> stagemonitorEntry = registry.getGauges().entrySet().iterator().next();
assertEquals("test", stagemonitorEntry.getKey().getName());
assertEquals(1, stagemonitorEntry.getValue().getValue());
}
//
// Helper ones
//
private Metered getMetered() {
return new Metered() {
@Override
public long getCount() {
return 1;
}
@Override
public double getFifteenMinuteRate() {
return 1;
}
@Override
public double getFiveMinuteRate() {
return 1;
}
@Override
public double getMeanRate() {
return 1;
}
@Override
public double getOneMinuteRate() {
return 1;
}
};
}
private Gauge getGauge() {
return new Gauge<Integer>() {
@Override
public Integer getValue() {
return 1;
}
};
}
}