package org.stagemonitor.tracing.elasticsearch; import com.fasterxml.jackson.databind.JsonNode; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.stagemonitor.AbstractElasticsearchTest; import org.stagemonitor.configuration.ConfigurationRegistry; import org.stagemonitor.core.CorePlugin; import org.stagemonitor.core.metrics.metrics2.Metric2Registry; import org.stagemonitor.tracing.SpanContextInformation; import org.stagemonitor.tracing.TracingPlugin; import org.stagemonitor.tracing.reporter.ReadbackSpan; import org.stagemonitor.util.IOUtils; import io.opentracing.tag.Tags; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ElasticsearchExternalSpanReporterIntegrationTest extends AbstractElasticsearchTest { protected ElasticsearchSpanReporter reporter; protected TracingPlugin tracingPlugin; protected ConfigurationRegistry configuration; @Before public void setUp() throws Exception { this.configuration = mock(ConfigurationRegistry.class); this.tracingPlugin = mock(TracingPlugin.class); when(configuration.getConfig(CorePlugin.class)).thenReturn(corePlugin); when(configuration.getConfig(TracingPlugin.class)).thenReturn(tracingPlugin); when(configuration.getConfig(ElasticsearchTracingPlugin.class)).thenReturn(mock(ElasticsearchTracingPlugin.class)); when(corePlugin.getElasticsearchClient()).thenReturn(elasticsearchClient); when(corePlugin.getMetricRegistry()).thenReturn(new Metric2Registry()); when(tracingPlugin.getRateLimitClientSpansPerMinute()).thenReturn(1000000d); reporter = new ElasticsearchSpanReporter(); reporter.init(configuration); final String mappingTemplate = IOUtils.getResourceAsString("stagemonitor-elasticsearch-span-index-template.json"); elasticsearchClient.sendMappingTemplateAsync(mappingTemplate, "stagemonitor-spans"); elasticsearchClient.waitForCompletion(); } @Test public void reportTemplateCreated() throws Exception { final JsonNode template = elasticsearchClient.getJson("/_template/stagemonitor-spans").get("stagemonitor-spans"); Assert.assertEquals("stagemonitor-spans-*", template.get("template").asText()); Assert.assertEquals(false, template.get("mappings").get("_default_").get("_all").get("enabled").asBoolean()); } @Test public void reportSpan() throws Exception { SpanContextInformation spanContextInformation = mock(SpanContextInformation.class); when(spanContextInformation.getReadbackSpan()).thenReturn(getSpan(100)); reporter.report(spanContextInformation); elasticsearchClient.waitForCompletion(); refresh(); final JsonNode hits = elasticsearchClient.getJson("/stagemonitor-spans*/_search").get("hits"); Assert.assertEquals(1, hits.get("total").intValue()); final JsonNode spanJson = hits.get("hits").elements().next().get("_source"); Assert.assertEquals("jdbc", spanJson.get("type").asText()); Assert.assertEquals("SELECT", spanJson.get("method").asText()); Assert.assertEquals(100, spanJson.get("duration_ms").asInt()); Assert.assertEquals("SELECT * from STAGEMONITOR where 1 < 2", spanJson.get("db").get("statement").asText()); Assert.assertEquals("ElasticsearchExternalSpanReporterIntegrationTest#test", spanJson.get("name").asText()); } private ReadbackSpan getSpan(long executionTimeMillis) { final ReadbackSpan readbackSpan = new ReadbackSpan(); readbackSpan.setName("ElasticsearchExternalSpanReporterIntegrationTest#test"); readbackSpan.setDuration(executionTimeMillis); readbackSpan.setTag("type", "jdbc"); readbackSpan.setTag("method", "SELECT"); readbackSpan.setTag("db.statement", "SELECT * from STAGEMONITOR where 1 < 2"); readbackSpan.setTag(Tags.PEER_SERVICE.getKey(), "foo@jdbc:bar"); return readbackSpan; } }