package org.stagemonitor.tracing; import com.codahale.metrics.Meter; import com.codahale.metrics.Timer; import com.uber.jaeger.context.TracingUtils; import org.junit.After; import org.junit.Before; import org.stagemonitor.configuration.ConfigurationOption; import org.stagemonitor.configuration.ConfigurationRegistry; import org.stagemonitor.core.CorePlugin; import org.stagemonitor.core.MeasurementSession; import org.stagemonitor.core.Stagemonitor; import org.stagemonitor.core.elasticsearch.ElasticsearchClient; import org.stagemonitor.core.metrics.metrics2.Metric2Filter; import org.stagemonitor.core.metrics.metrics2.Metric2Registry; import org.stagemonitor.core.metrics.metrics2.MetricName; import org.stagemonitor.tracing.reporter.ReportingSpanEventListener; import org.stagemonitor.tracing.sampling.SamplePriorityDeterminingSpanEventListener; import org.stagemonitor.tracing.wrapper.SpanWrappingTracer; import java.util.Collections; import java.util.HashMap; import java.util.Map; import io.opentracing.Tracer; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public abstract class AbstractRequestMonitorTest { protected CorePlugin corePlugin; protected TracingPlugin tracingPlugin; protected Metric2Registry registry; protected RequestMonitor requestMonitor; protected ConfigurationRegistry configuration; protected Map<String, Object> tags = new HashMap<>(); protected SamplePriorityDeterminingSpanEventListener samplePriorityDeterminingSpanInterceptor; protected SpanWrappingTracer tracer; protected SpanCapturingReporter spanCapturingReporter; @Before public void before() { tracingPlugin = mock(TracingPlugin.class); configuration = mock(ConfigurationRegistry.class); corePlugin = mock(CorePlugin.class); registry = mock(Metric2Registry.class); doReturn(corePlugin).when(configuration).getConfig(CorePlugin.class); doReturn(tracingPlugin).when(configuration).getConfig(TracingPlugin.class); doReturn(true).when(corePlugin).isStagemonitorActive(); doReturn(1000).when(corePlugin).getThreadPoolQueueCapacityLimit(); doReturn(new Metric2Registry()).when(corePlugin).getMetricRegistry(); doReturn(Collections.singletonList("http://mockhost:9200")).when(corePlugin).getElasticsearchUrls(); ElasticsearchClient elasticsearchClient = mock(ElasticsearchClient.class); doReturn(true).when(elasticsearchClient).isElasticsearchAvailable(); doReturn(elasticsearchClient).when(corePlugin).getElasticsearchClient(); doReturn(false).when(corePlugin).isOnlyLogElasticsearchMetricReports(); doReturn(true).when(tracingPlugin).isProfilerActive(); doReturn(1000000d).when(tracingPlugin).getRateLimitServerSpansPerMinute(); doReturn(mock(ConfigurationOption.class)).when(tracingPlugin).getRateLimitServerSpansPerMinuteOption(); doReturn(mock(ConfigurationOption.class)).when(tracingPlugin).getRateLimitClientSpansPerMinuteOption(); when(tracingPlugin.getRateLimitClientSpansPerTypePerMinuteOption()).thenReturn(mock(ConfigurationOption.class)); doReturn(mock(ConfigurationOption.class)).when(tracingPlugin).getProfilerRateLimitPerMinuteOption(); doReturn(mock(Timer.class)).when(registry).timer(any(MetricName.class)); doReturn(mock(Meter.class)).when(registry).meter(any(MetricName.class)); requestMonitor = new RequestMonitor(configuration, registry); when(tracingPlugin.isLogSpans()).thenReturn(true); when(tracingPlugin.getRequestMonitor()).thenReturn(requestMonitor); samplePriorityDeterminingSpanInterceptor = new SamplePriorityDeterminingSpanEventListener(configuration); final ReportingSpanEventListener reportingSpanEventListener = new ReportingSpanEventListener(configuration); spanCapturingReporter = new SpanCapturingReporter(); reportingSpanEventListener.addReporter(spanCapturingReporter); tracer = TracingPlugin.createSpanWrappingTracer(getTracer(), configuration, registry, TagRecordingSpanEventListener.asList(tags), samplePriorityDeterminingSpanInterceptor, reportingSpanEventListener); when(corePlugin.getMeasurementSession()).thenReturn(new MeasurementSession(getClass().getSimpleName(), "test", "test")); when(tracingPlugin.getTracer()).then((invocation) -> { if (corePlugin.isStagemonitorActive()) { return tracer; } else { return NoopTracer.INSTANCE; } }); assertTrue(TracingUtils.getTraceContext().isEmpty()); } protected Tracer getTracer() { return new MockTracer(); } @After public void after() { Stagemonitor.getMetric2Registry().removeMatching(Metric2Filter.ALL); Stagemonitor.reset(); assertTrue(TracingUtils.getTraceContext().isEmpty()); } }