diff --git a/dd-java-agent-ittests/build.gradle b/dd-java-agent-ittests/build.gradle index e9bf71af78..b568509da3 100644 --- a/dd-java-agent-ittests/build.gradle +++ b/dd-java-agent-ittests/build.gradle @@ -37,3 +37,7 @@ test { } test.dependsOn project(':dd-java-agent').shadowJar + +parent.subprojects.collect { it.tasks.withType(Test) } each { + test.shouldRunAfter it +} diff --git a/dd-trace/build.gradle b/dd-trace/build.gradle index 3443ea1c64..60e9aac883 100644 --- a/dd-trace/build.gradle +++ b/dd-trace/build.gradle @@ -1,4 +1,5 @@ plugins { + id 'groovy' id "com.github.johnrengelman.shadow" version "2.0.1" } diff --git a/dd-trace/src/main/java/com/datadoghq/trace/DDTracer.java b/dd-trace/src/main/java/com/datadoghq/trace/DDTracer.java index 605f667e1a..83e89526cd 100644 --- a/dd-trace/src/main/java/com/datadoghq/trace/DDTracer.java +++ b/dd-trace/src/main/java/com/datadoghq/trace/DDTracer.java @@ -22,8 +22,13 @@ import java.util.*; */ public class DDTracer implements io.opentracing.Tracer { - public final static String CURRENT_VERSION = DDTracer.class.getPackage().getImplementationVersion(); public final static String JAVA_VERSION = System.getProperty("java.version", "unknown"); + public final static String CURRENT_VERSION; + + static { + String version = DDTracer.class.getPackage().getImplementationVersion(); + CURRENT_VERSION = version != null ? version : "unknown"; + } /** * Writer is an charge of reporting traces and spans to the desired endpoint diff --git a/dd-trace/src/test/groovy/com/datadog/trace/SpanFactory.groovy b/dd-trace/src/test/groovy/com/datadoghq/trace/SpanFactory.groovy similarity index 83% rename from dd-trace/src/test/groovy/com/datadog/trace/SpanFactory.groovy rename to dd-trace/src/test/groovy/com/datadoghq/trace/SpanFactory.groovy index 67b7a1c8b7..ba2b0f2cec 100644 --- a/dd-trace/src/test/groovy/com/datadog/trace/SpanFactory.groovy +++ b/dd-trace/src/test/groovy/com/datadoghq/trace/SpanFactory.groovy @@ -1,7 +1,4 @@ -package com.datadog.trace - -import com.datadoghq.trace.DDSpan -import com.datadoghq.trace.DDSpanContext +package com.datadoghq.trace class SpanFactory { static def newSpanOf(long timestampMicro) { diff --git a/dd-trace/src/test/groovy/com/datadoghq/trace/writer/DDApiTest.groovy b/dd-trace/src/test/groovy/com/datadoghq/trace/writer/DDApiTest.groovy index 2af05eb56c..b82b290b55 100644 --- a/dd-trace/src/test/groovy/com/datadoghq/trace/writer/DDApiTest.groovy +++ b/dd-trace/src/test/groovy/com/datadoghq/trace/writer/DDApiTest.groovy @@ -1,10 +1,10 @@ package com.datadoghq.trace.writer -import com.datadog.trace.SpanFactory -import com.datadoghq.trace.DDSpan +import com.datadoghq.trace.SpanFactory +import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.ObjectMapper +import ratpack.http.Headers import ratpack.http.MediaType -import spock.lang.AutoCleanup import spock.lang.Specification import java.util.concurrent.atomic.AtomicReference @@ -54,11 +54,13 @@ class DDApiTest extends Specification { def "content is sent as JSON"() { setup: def requestContentType = new AtomicReference() + def requestHeaders = new AtomicReference() def requestBody = new AtomicReference() def agent = ratpack { handlers { put("v0.3/traces") { requestContentType.set(request.contentType) + requestHeaders.set(request.headers) request.body.then { requestBody.set(it.text) response.send() @@ -71,47 +73,47 @@ class DDApiTest extends Specification { expect: client.sendTraces(traces) requestContentType.get().type == APPLICATION_JSON - areEqual(requestBody.get(), expectedRequestBody) + requestHeaders.get().get("Datadog-Meta-Lang") == "java" + requestHeaders.get().get("Datadog-Meta-Lang-Version") == System.getProperty("java.version", "unknown"); + requestHeaders.get().get("Datadog-Meta-Tracer-Version") == "unknown" + convert(requestBody.get()) == expectedRequestBody cleanup: agent.close() + // Populate thread info dynamically as it is different when run via gradle vs idea. where: - traces | expectedRequestBody - [] | '[]' - [SpanFactory.newSpanOf(1L)] | '''[{ + traces | expectedRequestBody + [] | [] + [SpanFactory.newSpanOf(1L)] | [new TreeMap<>([ "duration":0, "error":0, - "meta":{"thread-name":"main","thread-id":"1"}, + "meta":["thread-name":Thread.currentThread().getName(),"thread-id":"${Thread.currentThread().id}"], "name":"fakeOperation", "parent_id":0, - "resource":"fakeResource" + "resource":"fakeResource", "service":"fakeService", "span_id":1, "start":1000, "trace_id":1, - "type":"fakeType", - }]''' - [SpanFactory.newSpanOf(100L)] | '''[{ + "type":"fakeType" + ])] + [SpanFactory.newSpanOf(100L)] | [new TreeMap<>([ "duration":0, "error":0, - "meta":{"thread-name":"main","thread-id":"1"}, + "meta":["thread-name":Thread.currentThread().getName(),"thread-id":"${Thread.currentThread().id}"], "name":"fakeOperation", "parent_id":0, - "resource":"fakeResource" + "resource":"fakeResource", "service":"fakeService", "span_id":1, "start":100000, "trace_id":1, - "type":"fakeType", - }]''' + "type":"fakeType" + ])] } - - static void areEqual(String json1, String json2) { - def tree1 = mapper.readTree json1 - def tree2 = mapper.readTree json2 - - assert tree1.equals(tree2) + static List> convert(String json) { + return mapper.readValue(json, new TypeReference>>() {}) } } diff --git a/dd-trace/src/test/java/com/datadoghq/trace/DDSpanBuilderTest.java b/dd-trace/src/test/java/com/datadoghq/trace/DDSpanBuilderTest.java index 6e6d6dabd8..ae3faab009 100644 --- a/dd-trace/src/test/java/com/datadoghq/trace/DDSpanBuilderTest.java +++ b/dd-trace/src/test/java/com/datadoghq/trace/DDSpanBuilderTest.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -124,15 +125,14 @@ public class DDSpanBuilderTest { assertThat(span.getStartTime()).isEqualTo(expectedTimestamp * 1000L); // auto-timestamp in nanoseconds - long tick = System.currentTimeMillis() * 1000 * 1000L; + long tick = System.currentTimeMillis(); span = tracer .buildSpan(expectedName) .withServiceName("foo") .start(); - // between now and now + 100ms - assertThat(span.getStartTime()).isBetween(tick, tick + 100 * 1000L); - + // Give a range of +/- 2 millis + assertThat(span.getStartTime()).isBetween(MILLISECONDS.toNanos(tick - 2), MILLISECONDS.toNanos(tick + 2)); } @@ -143,7 +143,7 @@ public class DDSpanBuilderTest { final long expectedParentId = spanId; DDSpanContext mockedContext = mock(DDSpanContext.class); - + when(mockedContext.getSpanId()).thenReturn(spanId); when(mockedContext.getServiceName()).thenReturn("foo");