package com.yammer.telemetry.agent.handlers; import com.yammer.metrics.Metrics; import com.yammer.metrics.core.*; import com.yammer.telemetry.test.TransformedTest; import com.yammer.telemetry.tracing.*; import javassist.ClassPool; import javassist.CtClass; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import static com.yammer.telemetry.test.TelemetryTestHelpers.runTransformed; import static org.junit.Assert.*; public class MetricsRegistryHandlerTest { private MetricsRegistryHandler handler = new MetricsRegistryHandler(); @After public void clearSpanSinkRegistry() { SpanSinkRegistry.clear(); } @Test public void testNothingForNonMetricsRegistryClass() throws Exception { ClassPool cp = ClassPool.getDefault(); CtClass ctClass = cp.get("java.lang.String"); assertFalse(handler.transformed(ctClass, cp)); } @Test public void testTransformsMetricsRegistryClass() throws Exception { ClassPool cp = ClassPool.getDefault(); CtClass ctClass = cp.get("com.yammer.metrics.core.MetricsRegistry"); assertTrue(handler.transformed(ctClass, cp)); } @Test public void testUnwrappedTimer() throws Exception { MetricsRegistry registry = new MetricsRegistry(); Timer timer = registry.newTimer(MetricsRegistryHandlerTest.class, "example"); TimerContext context = timer.time(); context.stop(); assertEquals(1, timer.count()); } @Test public void testUnwrappedMeter() throws Exception { MetricsRegistry registry = new MetricsRegistry(); Meter meter = registry.newMeter(MetricsRegistryHandlerTest.class, "example", "things", TimeUnit.SECONDS); meter.mark(10); assertEquals(10, meter.count()); } @Test public void testRunTransformedTests() throws Exception { runTransformed(TransformedTests.class, handler); } @SuppressWarnings("UnusedDeclaration") public static class TransformedTests { @Before public static void clearSpanSinkRegistry() { SpanSinkRegistry.clear(); } @TransformedTest public static void testRecordsSpanAnnotationsAroundCallable() throws Exception { InMemorySpanSinkSource sink = new InMemorySpanSinkSource(); SpanSinkRegistry.register(sink); try (Span trace = SpanHelper.startTrace("trace")) { Timer timer = Metrics.newTimer(TransformedTests.class, "testRecordsSpanAnnotationsAroundCallable"); timer.time(new Callable<Void>() { @Override public Void call() throws Exception { return null; } }); } assertEquals(1, sink.recordedTraceCount()); Trace trace = sink.getTraces().iterator().next(); SpanData root = trace.getRoot(); assertEquals("trace", root.getName()); List<AnnotationData> annotations = trace.getAnnotations(root.getSpanId()); assertEquals(2, annotations.size()); AnnotationData data0 = annotations.get(0); assertEquals("Start Timer", data0.getName()); assertEquals("\"com.yammer.telemetry.agent.handlers\":type=\"TransformedTests\",name=\"testRecordsSpanAnnotationsAroundCallable\"", data0.getMessage()); AnnotationData data1 = annotations.get(1); assertEquals("Stop Timer", data1.getName()); assertEquals("\"com.yammer.telemetry.agent.handlers\":type=\"TransformedTests\",name=\"testRecordsSpanAnnotationsAroundCallable\"", data1.getMessage()); } @TransformedTest public static void testRecordsSpanAnnotationsAroundTimerContext() throws Exception { InMemorySpanSinkSource sink = new InMemorySpanSinkSource(); SpanSinkRegistry.register(sink); try (Span trace = SpanHelper.startTrace("trace")) { Timer timer = Metrics.newTimer(TransformedTests.class, "testRecordsSpanAnnotationsAroundTimerContext"); TimerContext timerContext = timer.time(); timerContext.stop(); } assertEquals(1, sink.recordedTraceCount()); Trace trace = sink.getTraces().iterator().next(); SpanData root = trace.getRoot(); assertEquals("trace", root.getName()); List<AnnotationData> annotations = trace.getAnnotations(root.getSpanId()); assertEquals(2, annotations.size()); AnnotationData data0 = annotations.get(0); assertEquals("Start Timer", data0.getName()); assertEquals("\"com.yammer.telemetry.agent.handlers\":type=\"TransformedTests\",name=\"testRecordsSpanAnnotationsAroundTimerContext\"", data0.getMessage()); AnnotationData data1 = annotations.get(1); assertEquals("Stop Timer", data1.getName()); assertEquals("\"com.yammer.telemetry.agent.handlers\":type=\"TransformedTests\",name=\"testRecordsSpanAnnotationsAroundTimerContext\"", data1.getMessage()); } @TransformedTest public static void testRecordsSpanAnnotationAroundMeter() throws Exception { InMemorySpanSinkSource sink = new InMemorySpanSinkSource(); SpanSinkRegistry.register(sink); try (Span trace = SpanHelper.startTrace("trace")) { Meter meter = Metrics.newMeter(TransformedTests.class, "testRecordsSpanAnnotationAroundMeter", "tests", TimeUnit.MILLISECONDS); meter.mark(13); } assertEquals(1, sink.recordedTraceCount()); Trace trace = sink.getTraces().iterator().next(); SpanData root = trace.getRoot(); assertEquals("trace", root.getName()); List<AnnotationData> annotations = trace.getAnnotations(root.getSpanId()); assertEquals(1, annotations.size()); AnnotationData data = annotations.get(0); assertEquals("Mark Meter: \"com.yammer.telemetry.agent.handlers\":type=\"TransformedTests\",name=\"testRecordsSpanAnnotationAroundMeter\"", data.getName()); assertEquals("13", data.getMessage()); } @TransformedTest public static void testRecordsSpanAnnotationsAroundCounter() throws Exception { InMemorySpanSinkSource sink = new InMemorySpanSinkSource(); SpanSinkRegistry.register(sink); try (Span trace = SpanHelper.startTrace("trace")) { Counter meter = Metrics.newCounter(TransformedTests.class, "testRecordsSpanAnnotationsAroundCounter"); meter.inc(13); meter.dec(10); meter.clear(); } assertEquals(1, sink.recordedTraceCount()); Trace trace = sink.getTraces().iterator().next(); SpanData root = trace.getRoot(); assertEquals("trace", root.getName()); List<AnnotationData> annotations = trace.getAnnotations(root.getSpanId()); assertEquals(3, annotations.size()); AnnotationData data0 = annotations.get(0); assertEquals("Inc Counter: \"com.yammer.telemetry.agent.handlers\":type=\"TransformedTests\",name=\"testRecordsSpanAnnotationsAroundCounter\"", data0.getName()); assertEquals("13", data0.getMessage()); AnnotationData data1 = annotations.get(1); assertEquals("Dec Counter: \"com.yammer.telemetry.agent.handlers\":type=\"TransformedTests\",name=\"testRecordsSpanAnnotationsAroundCounter\"", data1.getName()); assertEquals("10", data1.getMessage()); AnnotationData data3 = annotations.get(2); assertEquals("Cleared Counter: \"com.yammer.telemetry.agent.handlers\":type=\"TransformedTests\",name=\"testRecordsSpanAnnotationsAroundCounter\"", data3.getName()); assertEquals(null, data3.getMessage()); } } }