package org.stagemonitor.tracing; import org.junit.Test; import org.mockito.Mockito; import io.opentracing.Tracer; import io.opentracing.mock.MockTracer; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.stagemonitor.core.metrics.metrics2.MetricName.name; public class RequestMonitorTest extends AbstractRequestMonitorTest { protected Tracer getTracer() { return new MockTracer(); } @Test public void testDeactivated() throws Exception { doReturn(false).when(corePlugin).isStagemonitorActive(); final SpanContextInformation spanContext = requestMonitor.monitor(createMonitoredRequest()); assertNull(spanContext); } @Test public void testRecordException() throws Exception { final MonitoredRequest monitoredRequest = createMonitoredRequest(); doThrow(new RuntimeException("test")).when(monitoredRequest).execute(); try { requestMonitor.monitor(monitoredRequest); } catch (Exception e) { } assertEquals("java.lang.RuntimeException", tags.get("exception.class")); assertEquals("test", tags.get("exception.message")); assertNotNull(tags.get("exception.stack_trace")); } @Test public void testInternalMetricsDeactive() throws Exception { internalMonitoringTestHelper(false); } @Test public void testInternalMetricsActive() throws Exception { doReturn(true).when(corePlugin).isInternalMonitoringActive(); requestMonitor.monitor(createMonitoredRequest()); verify(registry, times(1)).timer(name("internal_overhead_request_monitor").build()); } private void internalMonitoringTestHelper(boolean active) throws Exception { doReturn(active).when(corePlugin).isInternalMonitoringActive(); requestMonitor.monitor(createMonitoredRequest()); verify(registry, times(active ? 1 : 0)).timer(name("internal_overhead_request_monitor").build()); } private MonitoredRequest createMonitoredRequest() throws Exception { return Mockito.spy(new MonitoredMethodRequest(configuration, "test", () -> { })); } @Test public void testDontMonitorClientRootSpans() throws Exception { when(tracingPlugin.getRateLimitClientSpansPerMinute()).thenReturn(1_000_000.0); requestMonitor.monitorStart(new AbstractExternalRequest(tracingPlugin.getTracer()) { @Override protected String getType() { return "jdbc"; } }); assertFalse(SpanContextInformation.getCurrent().isSampled()); requestMonitor.monitorStop(); } }