private Counter counterOf(String name) { Counter counter = registry.getCounters().get(name); if (counter == null) { synchronized (operation) { counter = registry.getCounters().get(name); if (counter == null) { counter = registry.counter(metadataOf(name, MetricType.COUNTER)); } } } return counter; }
@Test @InSequence(1) public void countedMethodsNotCalledYet() { assertThat("Counters are not registered correctly", registry.getCounters().keySet(), is(equalTo(COUNTER_NAMES))); assertThat("Constructor timer count is incorrect", registry.getCounters().get(CONSTRUCTOR_COUNTER_NAME).getCount(), is(equalTo(CONSTRUCTOR_COUNT.incrementAndGet()))); // Make sure that the counters haven't been incremented assertThat("Method counter counts are incorrect", registry.getCounters(METHOD_COUNTERS).values(), everyItem(Matchers.<Counter> hasProperty("count", equalTo(0L)))); }
@Test @InSequence(1) public void countedMethodsNotCalledYet() { assertThat("Counters are not registered correctly", registry.getCounters().keySet(), is(equalTo(COUNTER_NAMES))); // Make sure that the counters haven't been incremented assertThat("Counter counts are incorrect", registry.getCounters().values(), everyItem(Matchers.<Counter>hasProperty("count", equalTo(0L)))); }
@Test @InSequence(1) public void countedConstructorCalled() { long count = 1L + Math.round(Math.random() * 10); for (int i = 0; i < count; i++) { instance.get(); } assertThat("Counter is not registered correctly", registry.getCounters(), hasKey(COUNTER_NAME)); Counter counter = registry.getCounters().get(COUNTER_NAME); // Make sure that the counter has been called assertThat("Counter count is incorrect", counter.getCount(), is(equalTo(count))); } }
@Test @InSequence(2) public void countedMethodNotCalledYet(@Metric(name = "countedMethod", absolute = true) Counter instance) { assertThat("Counter is not registered correctly", registry.getCounters(), hasKey(COUNTER_NAME)); Counter counter = registry.getCounters().get(COUNTER_NAME); // Make sure that the counter registered and the bean instance are the same assertThat("Counter and bean instance are not equal", instance, is(equalTo(counter))); }
@Test @InSequence(1) public void countedMethodNotCalledYet() { assertThat("Counter is not registered correctly", registry.getCounters(), hasKey(COUNTER_NAME)); Counter counter = registry.getCounters().get(COUNTER_NAME); // Make sure that the counter hasn't been called yet assertThat("Counter count is incorrect", counter.getCount(), is(equalTo(COUNTER_COUNT.get()))); }
@Test @InSequence(1) public void countedMethodNotCalledYet() { assertThat("Counter is not registered correctly", registry.getCounters(), hasKey(COUNTER_NAME)); Counter counter = registry.getCounters().get(COUNTER_NAME); // Make sure that the counter hasn't been called yet assertThat("Counter count is incorrect", counter.getCount(), is(equalTo(COUNTER_COUNT.get()))); }
@Test @InSequence(2) public void incrementCounterField() { assertThat("Counter is not registered correctly", registry.getCounters(), hasKey(COUNTER_NAME)); Counter counter = registry.getCounters().get(COUNTER_NAME); // Call the increment method and assert the counter is up-to-date long value = Math.round(Math.random() * Long.MAX_VALUE); bean.increment(value); assertThat("Counter value is incorrect", counter.getCount(), is(equalTo(value))); } }
@Test @InSequence(2) public void countedMethodNotCalledYet(@Metric(name = "monotonicCountedMethod", absolute = true) Counter instance) { assertThat("Counter is not registered correctly", registry.getCounters(), hasKey(COUNTER_NAME)); Counter counter = registry.getCounters().get(COUNTER_NAME); // Make sure that the counter registered and the bean instance are the same assertThat("Counter and bean instance are not equal", instance, is(equalTo(counter))); }
@Test @InSequence(2) public void callCountedMethodsOnce() { assertThat("Counters are not registered correctly", registry.getCounters().keySet(), is(equalTo(COUNTER_NAMES))); assertThat("Constructor timer count is incorrect", registry.getCounters().get(CONSTRUCTOR_COUNTER_NAME).getCount(), is(equalTo(CONSTRUCTOR_COUNT.incrementAndGet()))); // Call the counted methods and assert they've been incremented bean.countedMethodOne(); bean.countedMethodTwo(); // Let's call the non-public methods as well bean.countedMethodProtected(); bean.countedMethodPackagedPrivate(); // Make sure that the counters have been incremented assertThat("Method counter counts are incorrect", registry.getCounters(METHOD_COUNTERS).values(), everyItem(Matchers.<Counter> hasProperty("count", equalTo(1L)))); } }
@Test @InSequence(1) public void metricsConstructorCalled() { long count = 1L + Math.round(Math.random() * 10); for (int i = 0; i < count; i++) { instance.get(); } // Make sure that the metrics have been called assertThat("Counter count is incorrect", registry.getCounters().get(absoluteMetricName("counter")).getCount(), is(equalTo(count))); assertThat("Meter count is incorrect", registry.getMeters().get(absoluteMetricName("meter")).getCount(), is(equalTo(count))); assertThat("Timer count is incorrect", registry.getTimers().get(absoluteMetricName("timer")).getCount(), is(equalTo(count))); } }
@Test @InSequence(2) public void callCountedMethodsOnce() { assertThat("Counters are not registered correctly", registry.getCounters().keySet(), is(equalTo(COUNTER_NAMES))); // Call the counted methods and assert they're back to zero bean.countedMethodOne(); bean.countedMethodTwo(); // Let's call the non-public methods as well bean.countedMethodProtected(); bean.countedMethodPackagedPrivate(); // Make sure that the counters are back to zero assertThat("Counter counts are incorrect", registry.getCounters().values(), everyItem(Matchers.<Counter>hasProperty("count", equalTo(0L)))); } }
@Test @InSequence(2) public void incrementCountersFromRegistry() { assertThat("Counters are not registered correctly", registry.getCounters(), allOf( hasKey("counter1"), hasKey("counter2"), not(hasKey("not_registered_counter")) ) ); Counter counter1 = registry.getCounters().get("counter1"); Counter counter2 = registry.getCounters().get("counter2"); assertThat("Gauge is not registered correctly", registry.getGauges(), hasKey("ratioGauge")); @SuppressWarnings("unchecked") Gauge<Double> gauge = (Gauge<Double>) registry.getGauges().get("ratioGauge"); counter1.inc(Math.round(Math.random() * Integer.MAX_VALUE)); counter2.inc(Math.round(Math.random() * Integer.MAX_VALUE)); assertThat("Gauge value is incorrect", gauge.getValue(), is(equalTo(((double) counter1.getCount()) / ((double) counter2.getCount())))); }
@Test @InSequence(1) public void countersNotIncrementedYet() { assertThat("Counters are not registered correctly", registry.getCounters(), allOf( hasKey("counter1"), hasKey("counter2"), not(hasKey("not_registered_counter")) ) ); Counter counter1 = registry.getCounters().get("counter1"); Counter counter2 = registry.getCounters().get("counter2"); assertThat("Gauge is not registered correctly", registry.getGauges(), hasKey("ratioGauge")); @SuppressWarnings("unchecked") Gauge<Double> gauge = (Gauge<Double>) registry.getGauges().get("ratioGauge"); assertThat("Gauge value is incorrect", gauge.getValue(), is(equalTo(((double) counter1.getCount()) / ((double) counter2.getCount())))); }
@Test @InSequence(4) public void removeMonotonicCounterFromRegistry() { assertThat("Counter is not registered correctly", registry.getCounters(), hasKey(COUNTER_NAME)); Counter counter = registry.getCounters().get(COUNTER_NAME); // Remove the counter from metrics registry registry.remove(COUNTER_NAME); try { // Call the counted method and assert an exception is thrown bean.monotonicCountedMethod(new Callable<Long>() { @Override public Long call() throws Exception { return null; } }); } catch (Exception cause) { assertThat(cause, is(Matchers.<Exception>instanceOf(IllegalStateException.class))); assertThat(cause.getMessage(), is(equalTo("No counter with name [" + COUNTER_NAME + "] found in registry [" + registry + "]"))); // Make sure that the counter hasn't been called assertThat("Counter count is incorrect", counter.getCount(), is(equalTo(COUNTER_COUNT.get()))); return; } fail("No exception has been re-thrown!"); } }
@Test @InSequence(4) public void removeCounterFromRegistry() { assertThat("Counter is not registered correctly", registry.getCounters(), hasKey(COUNTER_NAME)); Counter counter = registry.getCounters().get(COUNTER_NAME); // Remove the counter from metrics registry registry.remove(COUNTER_NAME); try { // Call the counted method and assert an exception is thrown bean.countedMethod(new Callable<Long>() { @Override public Long call() throws Exception { return null; } }); } catch (Exception cause) { assertThat(cause, is(instanceOf(IllegalStateException.class))); assertThat(cause.getMessage(), is(equalTo("No counter with name [" + COUNTER_NAME + "] found in registry [" + registry + "]"))); // Make sure that the counter hasn't been called assertThat("Counter count is incorrect", counter.getCount(), is(equalTo(COUNTER_COUNT.get()))); return; } fail("No exception has been re-thrown!"); } }
@Test @InSequence(1) public void counterFieldRegistered() { assertThat("Counter is not registered correctly", registry.getCounters(), hasKey(COUNTER_NAME)); }
@Test @InSequence(2) public void callMetricsMethodOnce() { assertThat("Metrics are not registered correctly", registry.getMetrics().keySet(), is(equalTo(absoluteMetricNames()))); // Call the monitored method and assert it's been instrumented bean.metricsMethod(); // Make sure that the metrics have been called assertThat("Counter count is incorrect", registry.getCounters().get(absoluteMetricName("counter")).getCount(), is(equalTo(1L))); assertThat("Meter count is incorrect", registry.getMeters().get(absoluteMetricName("meter")).getCount(), is(equalTo(1L))); assertThat("Timer count is incorrect", registry.getTimers().get(absoluteMetricName("timer")).getCount(), is(equalTo(1L))); // Let's call the gauge at the end as Weld is intercepting the gauge // invocation while OWB not assertThat("Gauge value is incorrect", registry.getGauges().get(absoluteMetricName("gauge")).getValue(), hasToString((equalTo("value")))); } }
@Test @InSequence(2) public void registerTest() { metrics.register("regCountTemp", countTemp); Assert.assertTrue(metrics.getCounters().containsKey("regCountTemp")); metrics.register("regHistoTemp", histoTemp); Assert.assertTrue(metrics.getHistograms().containsKey("regHistoTemp")); metrics.register("regTimerTemp", timerTemp); Assert.assertTrue(metrics.getTimers().containsKey("regTimerTemp")); metrics.register("regMeterTemp", meterTemp); Assert.assertTrue(metrics.getMeters().containsKey("regMeterTemp")); }
private <E extends Member & AnnotatedElement> Object applyInterceptor(InvocationContext context, E member) throws Exception { Metadata metadata = AnnotationMetadata.buildMetadata(bean.getBeanClass(), member, Counted.class); Counter counter = applicationRegistry.getCounters().get(metadata.getName()); if (counter == null) { throw new IllegalStateException("No counter with name [" + metadata.getName() + "] found in registry [" + applicationRegistry + "]"); } counter.inc(); try { return context.proceed(); } finally { Counted annotation = AnnotationMetadata.getAnnotation(bean.getBeanClass(), member, Counted.class); if(annotation != null && !annotation.monotonic()) { counter.dec(); } } } }