package org.stagemonitor.web.monitor.jaxrs;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
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.metrics.metrics2.Metric2Filter;
import org.stagemonitor.core.metrics.metrics2.Metric2Registry;
import org.stagemonitor.tracing.MockTracer;
import org.stagemonitor.tracing.MonitoredMethodRequest;
import org.stagemonitor.tracing.MonitoredRequest;
import org.stagemonitor.tracing.RequestMonitor;
import org.stagemonitor.tracing.SpanCapturingReporter;
import org.stagemonitor.tracing.SpanContextInformation;
import org.stagemonitor.tracing.TracingPlugin;
import org.stagemonitor.tracing.reporter.ReportingSpanEventListener;
import org.stagemonitor.tracing.sampling.SamplePriorityDeterminingSpanEventListener;
import org.stagemonitor.tracing.wrapper.SpanWrappingTracer;
import org.stagemonitor.web.WebPlugin;
import java.util.ArrayList;
import java.util.Collections;
import java.util.regex.Pattern;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.stagemonitor.tracing.BusinessTransactionNamingStrategy.METHOD_NAME_SPLIT_CAMEL_CASE;
public class JaxRsRequestNameDeterminerTransformerTest {
private TestResource resource = new TestResource();
private SpanCapturingReporter spanCapturingReporter;
@BeforeClass
@AfterClass
public static void reset() {
Stagemonitor.reset();
}
private ConfigurationRegistry configuration = mock(ConfigurationRegistry.class);
private TracingPlugin tracingPlugin = mock(TracingPlugin.class);
private WebPlugin webPlugin = mock(WebPlugin.class);
private CorePlugin corePlugin = mock(CorePlugin.class);
private RequestMonitor requestMonitor;
private Metric2Registry registry = new Metric2Registry();
@Before
public void before() throws Exception {
Stagemonitor.startMonitoring(new MeasurementSession("JaxRsRequestNameDeterminerTransformerTest", "testHost", "testInstance"));
registry.removeMatching(Metric2Filter.ALL);
when(configuration.getConfig(TracingPlugin.class)).thenReturn(tracingPlugin);
when(configuration.getConfig(WebPlugin.class)).thenReturn(webPlugin);
when(configuration.getConfig(CorePlugin.class)).thenReturn(corePlugin);
when(corePlugin.isStagemonitorActive()).thenReturn(true);
when(corePlugin.getThreadPoolQueueCapacityLimit()).thenReturn(1000);
when(corePlugin.getApplicationName()).thenReturn("JaxRsRequestNameDeterminerTransformerTest");
when(corePlugin.getInstanceName()).thenReturn("test");
when(tracingPlugin.getRateLimitServerSpansPerMinute()).thenReturn(1000000d);
when(tracingPlugin.getRateLimitServerSpansPerMinuteOption()).thenReturn(mock(ConfigurationOption.class));
when(tracingPlugin.getRateLimitClientSpansPerMinuteOption()).thenReturn(mock(ConfigurationOption.class));
when(tracingPlugin.getRateLimitClientSpansPerTypePerMinuteOption()).thenReturn(mock(ConfigurationOption.class));
when(tracingPlugin.getProfilerRateLimitPerMinuteOption()).thenReturn(mock(ConfigurationOption.class));
when(tracingPlugin.getBusinessTransactionNamingStrategy()).thenReturn(METHOD_NAME_SPLIT_CAMEL_CASE);
when(webPlugin.getGroupUrls()).thenReturn(Collections.singletonMap(Pattern.compile("(.*).js$"), "*.js"));
requestMonitor = new RequestMonitor(configuration, registry);
when(tracingPlugin.getRequestMonitor()).thenReturn(requestMonitor);
final ReportingSpanEventListener reportingSpanEventListener = new ReportingSpanEventListener(configuration);
spanCapturingReporter = new SpanCapturingReporter();
reportingSpanEventListener.addReporter(spanCapturingReporter);
final SpanWrappingTracer tracer = TracingPlugin.createSpanWrappingTracer(new MockTracer(),
configuration, registry, new ArrayList<>(),
new SamplePriorityDeterminingSpanEventListener(configuration), reportingSpanEventListener);
when(tracingPlugin.getTracer()).thenReturn(tracer);
}
@Test
public void testSetNameForRestCalls() throws Exception {
final MonitoredRequest request = new MonitoredMethodRequest(configuration, "override me", () -> resource.getTestString());
requestMonitor.monitor(request);
final SpanContextInformation info = spanCapturingReporter.get();
assertNotNull(info);
assertEquals("Get Test String", info.getOperationName());
}
@Path("/")
public class TestResource {
@GET
public String getTestString() {
return "test";
}
}
}