package io.prometheus.client.spring.web; import io.prometheus.client.Collector; import io.prometheus.client.CollectorRegistry; import org.junit.Assert; import org.junit.Test; import org.springframework.aop.aspectj.annotation.AspectJProxyFactory; import java.util.Enumeration; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; public class MethodTimerTest { private interface Timeable { void timeMe() throws Exception; } private final class TestClass implements Timeable { @PrometheusTimeMethod(name = "test_class", help = "help one") public void timeMe() throws Exception { Thread.sleep(20); } } private interface Time2 { void timeMe() throws Exception; void aSecondMethod() throws Exception; } @Test public void timeMethod() throws Exception { Timeable cprime = new TestClass(); AspectJProxyFactory factory = new AspectJProxyFactory(cprime); factory.addAspect(MethodTimer.class); Timeable proxy = factory.getProxy(); proxy.timeMe(); final Double tot = CollectorRegistry.defaultRegistry.getSampleValue("test_class_sum"); Assert.assertNotNull(tot); assertEquals(0.02, tot, 0.001); } <T> T getProxy(T source){ AspectJProxyFactory factory = new AspectJProxyFactory(source); factory.addAspect(MethodTimer.class); return factory.getProxy(); } @Test public void testValueParam() throws Exception { final String name = "foobar"; Time2 a = getProxy(new Time2() { @PrometheusTimeMethod(name = name, help="help") @Override public void timeMe() throws Exception { Thread.sleep(35); } @Override public void aSecondMethod() throws Exception { } }); a.timeMe(); final Double tot = CollectorRegistry.defaultRegistry.getSampleValue(name + "_sum"); assertEquals(0.035, tot,0.001); a.timeMe(); a.timeMe(); a.timeMe(); final Double tot2 = CollectorRegistry.defaultRegistry.getSampleValue(name + "_sum"); assertEquals(0.035*4, tot2, 0.008); } @Test public void testHelpParam() throws Exception { final String name = "foo"; final String help = "help"; Time2 a = getProxy(new Time2() { @Override @PrometheusTimeMethod(name = name, help = help) public void timeMe() throws Exception { Thread.sleep(100); } @Override public void aSecondMethod() throws Exception { } }); a.timeMe(); final Enumeration<Collector.MetricFamilySamples> samples = CollectorRegistry.defaultRegistry.metricFamilySamples(); Collector.MetricFamilySamples sample = null; while (samples.hasMoreElements()) { sample = samples.nextElement(); if (name.equals(sample.name)) { break; } } Assert.assertNotNull(sample); assertEquals(help, sample.help); } private class MyException extends Exception { public MyException(String msg) { super(msg); } } @Test public void testThrowWorks() { Time2 p = getProxy(new Time2() { @Override @PrometheusTimeMethod(name="fooasdf", help="bar") public void timeMe() throws Exception { Thread.sleep(10); throw new MyException("Yo this is an exception"); } @Override public void aSecondMethod() throws Exception { } }); MyException e = null; try { p.timeMe(); } catch (Exception e1) { e = (MyException) e1; } final Double tot = CollectorRegistry.defaultRegistry.getSampleValue("fooasdf_sum"); assertEquals(0.01, tot, 0.01); assert(e != null); } @Test public void testSecondMethod() throws Exception { final int sleepTime = 90, misnamedSleepTime = 10; Time2 p = getProxy(new Time2() { @Override @PrometheusTimeMethod(name="fooasdf2", help="bar") public void timeMe() throws Exception { Thread.sleep(misnamedSleepTime); } @Override @PrometheusTimeMethod(name = "second_method_name_seconds", help = "help two") public void aSecondMethod() throws Exception { Thread.sleep(sleepTime); } }); p.timeMe(); int count = 5; for (int i = 0; i < count; i++) { p.aSecondMethod(); } final Double misnamedTotal = CollectorRegistry.defaultRegistry.getSampleValue("fooasdf2_sum"); final Double total = CollectorRegistry.defaultRegistry.getSampleValue("second_method_name_seconds_sum"); assertNotNull(total); assertEquals(0.001*count*sleepTime, total, 0.01); assertNotNull(misnamedTotal); assertEquals(0.001*misnamedSleepTime, misnamedTotal, 0.01); } private interface SameMethodNameTest { void doSomething() throws Exception; void doSomething(String s) throws Exception; } @Test public void testOverloadedMethodName() throws Exception { final int sleep1 = 100, sleep2 = 200; SameMethodNameTest r = getProxy(new SameMethodNameTest() { @Override @PrometheusTimeMethod(name="dosomething_one_test_seconds", help = "halp") public void doSomething() throws Exception { Thread.sleep(sleep1); } @Override @PrometheusTimeMethod(name = "dosomething_two_test_seconds", help = "also halp") public void doSomething(String s) throws Exception { Thread.sleep(sleep2); } }); r.doSomething(); r.doSomething("foobar"); final Double tot1 = CollectorRegistry.defaultRegistry.getSampleValue("dosomething_one_test_seconds_sum"); final Double tot2 = CollectorRegistry.defaultRegistry.getSampleValue("dosomething_two_test_seconds_sum"); assertEquals(.001*sleep2, tot2,.001); assertEquals(.001*sleep1, tot1, .001); } }