diff --git a/.circleci/config.yml b/.circleci/config.yml index 05c4a686a0..72c96e5548 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,16 +9,16 @@ jobs: - checkout - restore_cache: - key: dd-trace-java-{{ checksum "build.gradle" }}-{{ checksum "dd-java-agent/build.gradle" }}-{{ checksum "dd-trace/build.gradle" }} + key: dd-trace-java-{{ checksum "dd-trace-java.gradle" }}-{{ checksum "dd-java-agent/dd-java-agent.gradle" }}-{{ checksum "dd-trace/dd-trace.gradle" }} - run: name: Run Tests - command: ./gradlew clean shadowJar check + command: ./gradlew clean shadowJar check --parallel - save_cache: paths: - ~/.gradle - key: dd-trace-java-{{ checksum "build.gradle" }}-{{ checksum "dd-java-agent/build.gradle" }}-{{ checksum "dd-trace/build.gradle" }} + key: dd-trace-java-{{ checksum "dd-trace-java.gradle" }}-{{ checksum "dd-java-agent/dd-java-agent.gradle" }}-{{ checksum "dd-trace/dd-trace.gradle" }} - store_test_results: path: dd-java-agent/build/test-results diff --git a/dd-java-agent-ittests/build.gradle b/dd-java-agent-ittests/dd-java-agent-ittests.gradle similarity index 95% rename from dd-java-agent-ittests/build.gradle rename to dd-java-agent-ittests/dd-java-agent-ittests.gradle index b568509da3..97c63df1c1 100644 --- a/dd-java-agent-ittests/build.gradle +++ b/dd-java-agent-ittests/dd-java-agent-ittests.gradle @@ -1,3 +1,6 @@ +// Not adding jacoco here as it inexplicably breaks our tests. +// apply from: "${rootDir}/gradle/jacoco.gradle" + description = 'dd-java-agent-ittests' dependencies { testCompile project(':dd-java-agent') diff --git a/dd-java-agent/build.gradle b/dd-java-agent/dd-java-agent.gradle similarity index 91% rename from dd-java-agent/build.gradle rename to dd-java-agent/dd-java-agent.gradle index a661cfd5d8..d43d6fb0cd 100644 --- a/dd-java-agent/build.gradle +++ b/dd-java-agent/dd-java-agent.gradle @@ -4,6 +4,16 @@ plugins { description = 'dd-java-agent' +apply from: "${rootDir}/gradle/jacoco.gradle" +jacocoTestReport.dependsOn project(':dd-java-agent-ittests').test +whitelistedInstructionClasses += whitelistedBranchClasses += [ + "com.datadoghq.trace.agent.integration.*", + 'com.datadoghq.trace.agent.AnnotationsTracingAgent', + 'com.datadoghq.trace.agent.AgentTracerConfig', + 'com.datadoghq.trace.agent.TraceAnnotationsManager', + 'com.datadoghq.trace.agent.InstrumentationChecker' +] + dependencies { compile project(':dd-trace') compile project(':dd-trace-annotations') diff --git a/dd-trace-annotations/build.gradle b/dd-trace-annotations/dd-trace-annotations.gradle similarity index 71% rename from dd-trace-annotations/build.gradle rename to dd-trace-annotations/dd-trace-annotations.gradle index f2988510b2..a548953b44 100644 --- a/dd-trace-annotations/build.gradle +++ b/dd-trace-annotations/dd-trace-annotations.gradle @@ -1,3 +1,5 @@ +apply from: "${rootDir}/gradle/jacoco.gradle" + description = 'dd-trace-annotations' dependencies { testCompile group: 'junit', name: 'junit', version: '3.8.1' diff --git a/dd-trace-examples/async-tracing/build.gradle b/dd-trace-examples/async-tracing/async-tracing.gradle similarity index 100% rename from dd-trace-examples/async-tracing/build.gradle rename to dd-trace-examples/async-tracing/async-tracing.gradle diff --git a/dd-trace-examples/dropwizard-mongo-client/build.gradle b/dd-trace-examples/dropwizard-mongo-client/dropwizard-mongo-client.gradle similarity index 100% rename from dd-trace-examples/dropwizard-mongo-client/build.gradle rename to dd-trace-examples/dropwizard-mongo-client/dropwizard-mongo-client.gradle diff --git a/dd-trace-examples/spring-boot-jdbc/build.gradle b/dd-trace-examples/spring-boot-jdbc/spring-boot-jdbc.gradle similarity index 100% rename from dd-trace-examples/spring-boot-jdbc/build.gradle rename to dd-trace-examples/spring-boot-jdbc/spring-boot-jdbc.gradle diff --git a/build.gradle b/dd-trace-java.gradle similarity index 100% rename from build.gradle rename to dd-trace-java.gradle diff --git a/dd-trace/build.gradle b/dd-trace/dd-trace.gradle similarity index 88% rename from dd-trace/build.gradle rename to dd-trace/dd-trace.gradle index 60e9aac883..07d999d617 100644 --- a/dd-trace/build.gradle +++ b/dd-trace/dd-trace.gradle @@ -4,6 +4,15 @@ plugins { } description = 'dd-trace' + +apply from: "${rootDir}/gradle/jacoco.gradle" +minimumBranchCoverage = 0.3 +minimumInstructionCoverage = 0.5 +whitelistedInstructionClasses += whitelistedBranchClasses += [ + "com.datadoghq.trace.integration.*", + 'com.datadoghq.trace.DDTags' +] + dependencies { compile group: 'io.opentracing', name: 'opentracing-api', version: '0.30.0' compile group: 'io.opentracing', name: 'opentracing-noop', version: '0.30.0' diff --git a/dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerResolver.java b/dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerResolver.java index 5900c076cd..25b92113ff 100644 --- a/dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerResolver.java +++ b/dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerResolver.java @@ -41,19 +41,10 @@ public class DDTracerResolver extends TracerResolver { @SuppressWarnings("static-access") public static Tracer registerTracer() { - - ServiceLoader RESOLVERS = ServiceLoader.load(TracerResolver.class); - - Tracer tracer = null; - for (TracerResolver value : RESOLVERS) { - tracer = value.resolveTracer(); - if (tracer != null) { - break; - } - } + Tracer tracer = TracerResolver.resolveTracer(); if (tracer == null) { - tracer = NoopTracerFactory.create(); + return NoopTracerFactory.create(); } GlobalTracer.register(tracer); diff --git a/dd-trace/src/test/java/com/datadoghq/trace/resolver/TracerResolverTest.java b/dd-trace/src/test/java/com/datadoghq/trace/resolver/TracerResolverTest.java index 84023cfdf0..d166b9c10b 100644 --- a/dd-trace/src/test/java/com/datadoghq/trace/resolver/TracerResolverTest.java +++ b/dd-trace/src/test/java/com/datadoghq/trace/resolver/TracerResolverTest.java @@ -2,9 +2,14 @@ package com.datadoghq.trace.resolver; import static org.assertj.core.api.Assertions.assertThat; +import java.lang.reflect.Field; import java.util.List; +import io.opentracing.NoopTracerFactory; +import io.opentracing.Tracer; +import io.opentracing.contrib.tracerresolver.TracerResolver; import io.opentracing.tag.Tags; +import io.opentracing.util.GlobalTracer; import org.junit.Test; import com.datadoghq.trace.DDTracer; @@ -15,7 +20,7 @@ import com.datadoghq.trace.integration.URLAsResourceName; public class TracerResolverTest { @Test - public void test() { + public void testResolve() { DDTracerResolver tracerResolver = new DDTracerResolver(); DDTracer tracer = (DDTracer) tracerResolver.resolve(); @@ -39,4 +44,34 @@ public class TracerResolverTest { } + @Test + public void testResolveTracer() throws Exception { + Field tracerField = GlobalTracer.class.getDeclaredField("tracer"); + tracerField.setAccessible(true); + tracerField.set(null, NoopTracerFactory.create()); + + assertThat(GlobalTracer.isRegistered()).isFalse(); + + Tracer tracer = TracerResolver.resolveTracer(); + + assertThat(GlobalTracer.isRegistered()).isFalse(); + assertThat(tracer).isInstanceOf(DDTracer.class); + } + + @Test + public void testRegisterTracer() throws Exception { + Field tracerField = GlobalTracer.class.getDeclaredField("tracer"); + tracerField.setAccessible(true); + tracerField.set(null, NoopTracerFactory.create()); + + assertThat(GlobalTracer.isRegistered()).isFalse(); + + DDTracerResolver.registerTracer(); + + assertThat(GlobalTracer.isRegistered()).isTrue(); + assertThat(tracerField.get(null)).isInstanceOf(DDTracer.class); + + tracerField.set(null, NoopTracerFactory.create()); + } + } diff --git a/gradle/jacoco.gradle b/gradle/jacoco.gradle new file mode 100644 index 0000000000..5587550670 --- /dev/null +++ b/gradle/jacoco.gradle @@ -0,0 +1,43 @@ +apply plugin: "jacoco" + +jacocoTestReport { + dependsOn test + reports { + xml.enabled true + csv.enabled false + html.destination file("${buildDir}/reports/jacoco/") + } +} + +project.ext.whitelistedBranchClasses = [] +project.ext.whitelistedInstructionClasses = [] + +project.ext.minimumBranchCoverage = 0.6 +project.ext.minimumInstructionCoverage = 0.6 + +afterEvaluate { + jacocoTestCoverageVerification { + violationRules { + rule { + element = 'CLASS' + excludes = project.whitelistedBranchClasses + limit { + counter = 'BRANCH' + minimum = project.minimumBranchCoverage + } + } + + rule { + element = 'CLASS' + excludes = project.whitelistedInstructionClasses + limit { + counter = 'INSTRUCTION' + minimum = project.minimumInstructionCoverage + } + } + } + } + + jacocoTestCoverageVerification.dependsOn jacocoTestReport + check.dependsOn jacocoTestCoverageVerification +} diff --git a/settings.gradle b/settings.gradle index 760270f6e9..4dbeabab43 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,5 @@ rootProject.name = 'dd-trace-java' + include ':dd-trace' include ':dd-java-agent' include ':dd-java-agent-ittests' @@ -8,11 +9,11 @@ include ':dd-trace-examples:spring-boot-jdbc' include ':dd-trace-examples' include ':dd-trace-annotations' -project(':dd-trace').projectDir = "$rootDir/dd-trace" as File -project(':dd-java-agent').projectDir = "$rootDir/dd-java-agent" as File -project(':dd-java-agent-ittests').projectDir = "$rootDir/dd-java-agent-ittests" as File -project(':dd-trace-examples:async-tracing').projectDir = "$rootDir/dd-trace-examples/async-tracing" as File -project(':dd-trace-examples:dropwizard-mongo-client').projectDir = "$rootDir/dd-trace-examples/dropwizard-mongo-client" as File -project(':dd-trace-examples:spring-boot-jdbc').projectDir = "$rootDir/dd-trace-examples/spring-boot-jdbc" as File -project(':dd-trace-examples').projectDir = "$rootDir/dd-trace-examples" as File -project(':dd-trace-annotations').projectDir = "$rootDir/dd-trace-annotations" as File \ No newline at end of file +def setBuildFile(project) { + project.buildFileName = "${project.name}.gradle" + project.children.each { + setBuildFile(it) + } +} + +setBuildFile(rootProject)