package org.stagemonitor.tracing.tracing.jaeger; import org.junit.Before; import org.junit.Test; import org.stagemonitor.configuration.ConfigurationRegistry; import org.stagemonitor.configuration.source.SimpleSource; import org.stagemonitor.tracing.SpanContextInformation; import org.stagemonitor.tracing.TracingPlugin; import org.stagemonitor.tracing.sampling.PreExecutionInterceptorContext; import org.stagemonitor.tracing.sampling.RateLimitingPreExecutionInterceptor; import java.util.Collections; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class RateLimitingPreExecutionInterceptorTest { private RateLimitingPreExecutionInterceptor interceptor; private TracingPlugin tracingPlugin; private PreExecutionInterceptorContext context; private SpanContextInformation spanContext; @Before public void setUp() throws Exception { tracingPlugin = new TracingPlugin(); final ConfigurationRegistry configuration = new ConfigurationRegistry(Collections.singletonList(tracingPlugin), Collections.singletonList(new SimpleSource()), null); spanContext = mock(SpanContextInformation.class); when(spanContext.isExternalRequest()).thenReturn(false); context = new PreExecutionInterceptorContext(spanContext); interceptor = new RateLimitingPreExecutionInterceptor(); interceptor.init(configuration); } @Test public void testNeverReportServerSpan() throws Exception { tracingPlugin.getRateLimitServerSpansPerMinuteOption().update(0d, SimpleSource.NAME); when(spanContext.isExternalRequest()).thenReturn(false); when(spanContext.isServerRequest()).thenReturn(true); interceptor.interceptReport(context); assertFalse(context.isReport()); interceptor.interceptReport(context); assertFalse(context.isReport()); } @Test public void testAlwaysReportServerSpan() throws Exception { when(spanContext.isExternalRequest()).thenReturn(false); when(spanContext.isServerRequest()).thenReturn(true); tracingPlugin.getRateLimitServerSpansPerMinuteOption().update(1_000_000.0, SimpleSource.NAME); interceptor.interceptReport(context); assertTrue(context.isReport()); } @Test public void testRateNotExceededThenExceededServerSpan() throws Exception { when(spanContext.isExternalRequest()).thenReturn(false); when(spanContext.isServerRequest()).thenReturn(true); tracingPlugin.getRateLimitServerSpansPerMinuteOption().update(60d, SimpleSource.NAME); interceptor.interceptReport(context); assertTrue(context.isReport()); interceptor.interceptReport(context); assertFalse(context.isReport()); } @Test public void testNeverReportExternalRequest() throws Exception { when(spanContext.isExternalRequest()).thenReturn(true); when(spanContext.isServerRequest()).thenReturn(false); tracingPlugin.getRateLimitClientSpansPerMinuteOption().update(0d, SimpleSource.NAME); interceptor.interceptReport(context); assertFalse(context.isReport()); } @Test public void testAlwaysReportExternalRequest() throws Exception { when(spanContext.isExternalRequest()).thenReturn(true); when(spanContext.isServerRequest()).thenReturn(false); tracingPlugin.getRateLimitClientSpansPerMinuteOption().update(10_000_000.0, SimpleSource.NAME); interceptor.interceptReport(context); assertTrue(context.isReport()); } @Test public void testRateExceededThenNotExceededExternalRequest() throws Exception { when(spanContext.isExternalRequest()).thenReturn(true); when(spanContext.isServerRequest()).thenReturn(false); tracingPlugin.getRateLimitClientSpansPerMinuteOption().update(60.0, SimpleSource.NAME); interceptor.interceptReport(context); assertTrue(context.isReport()); interceptor.interceptReport(context); assertFalse(context.isReport()); } @Test public void testReportExternalRequestGenericType() throws Exception { when(spanContext.isExternalRequest()).thenReturn(true); when(spanContext.isServerRequest()).thenReturn(false); when(spanContext.getOperationType()).thenReturn("jdbc"); tracingPlugin.getRateLimitClientSpansPerMinuteOption().update(0d, SimpleSource.NAME); tracingPlugin.getRateLimitClientSpansPerTypePerMinuteOption().update(Collections.singletonMap("http", 1000000d), SimpleSource.NAME); interceptor.interceptReport(context); assertFalse(context.isReport()); } @Test public void testReportExternalRequestType() throws Exception { when(spanContext.isExternalRequest()).thenReturn(true); when(spanContext.isServerRequest()).thenReturn(false); when(spanContext.getOperationType()).thenReturn("http"); tracingPlugin.getRateLimitClientSpansPerMinuteOption().update(0d, SimpleSource.NAME); tracingPlugin.getRateLimitClientSpansPerTypePerMinuteOption().update(Collections.singletonMap("http", 1000000d), SimpleSource.NAME); interceptor.interceptReport(context); assertTrue(context.isReport()); } }