From cef86291e316f77fc156e2c0017147a28b05a217 Mon Sep 17 00:00:00 2001 From: Gihad Murad Date: Mon, 5 Feb 2018 12:59:42 -0500 Subject: [PATCH 1/7] Added Redis instrumentation via Jedis client 2.9 and changed spring-boot-jdbc to spring-boot-jdbc-redis --- .../jedis-2.9/jedis-2.9.gradle | 13 +++ .../jedis/JedisInstrumentation.java | 74 ++++++++++++++++++ examples/README.md | 2 +- .../README.md | 10 ++- .../docker-compose.yml | 4 + .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../spring-boot-jdbc-redis.gradle} | 14 ++-- .../java/datadog/examples/Application.java | 0 .../datadog/examples/ApplicationConfig.java | 0 .../java/datadog/examples/entities/User.java | 0 .../examples/entities/UserRepository.java | 0 .../examples/resources/DBResource.java | 25 +++++- .../examples/resources/HomeResource.java | 6 +- .../main}/resources/application.properties | 0 .../src/main/resources/application.properties | 7 -- settings.gradle | 3 +- 19 files changed, 137 insertions(+), 21 deletions(-) create mode 100644 dd-java-agent/instrumentation/jedis-2.9/jedis-2.9.gradle create mode 100644 dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java rename examples/{spring-boot-jdbc => spring-boot-jdbc-redis}/README.md (82%) rename examples/{spring-boot-jdbc => spring-boot-jdbc-redis}/docker-compose.yml (70%) rename examples/{spring-boot-jdbc => spring-boot-jdbc-redis}/gradle/wrapper/gradle-wrapper.jar (100%) rename examples/{spring-boot-jdbc => spring-boot-jdbc-redis}/gradle/wrapper/gradle-wrapper.properties (100%) rename examples/{spring-boot-jdbc => spring-boot-jdbc-redis}/gradlew (100%) rename examples/{spring-boot-jdbc => spring-boot-jdbc-redis}/gradlew.bat (100%) rename examples/{spring-boot-jdbc/spring-boot-jdbc.gradle => spring-boot-jdbc-redis/spring-boot-jdbc-redis.gradle} (70%) rename examples/{spring-boot-jdbc => spring-boot-jdbc-redis}/src/main/java/datadog/examples/Application.java (100%) rename examples/{spring-boot-jdbc => spring-boot-jdbc-redis}/src/main/java/datadog/examples/ApplicationConfig.java (100%) rename examples/{spring-boot-jdbc => spring-boot-jdbc-redis}/src/main/java/datadog/examples/entities/User.java (100%) rename examples/{spring-boot-jdbc => spring-boot-jdbc-redis}/src/main/java/datadog/examples/entities/UserRepository.java (100%) rename examples/{spring-boot-jdbc => spring-boot-jdbc-redis}/src/main/java/datadog/examples/resources/DBResource.java (70%) rename examples/{spring-boot-jdbc => spring-boot-jdbc-redis}/src/main/java/datadog/examples/resources/HomeResource.java (69%) rename examples/{spring-boot-jdbc/out/production => spring-boot-jdbc-redis/src/main}/resources/application.properties (100%) delete mode 100644 examples/spring-boot-jdbc/src/main/resources/application.properties diff --git a/dd-java-agent/instrumentation/jedis-2.9/jedis-2.9.gradle b/dd-java-agent/instrumentation/jedis-2.9/jedis-2.9.gradle new file mode 100644 index 00000000000..11e7fa280ec --- /dev/null +++ b/dd-java-agent/instrumentation/jedis-2.9/jedis-2.9.gradle @@ -0,0 +1,13 @@ + +apply from: "${rootDir}/gradle/java.gradle" + +dependencies { + compileOnly group: 'redis.clients', name: 'jedis', version: '2.9.0' + + compile project(':dd-trace-ot') + compile project(':dd-java-agent:tooling') + + compile deps.bytebuddy + compile deps.opentracing + compile deps.autoservice +} diff --git a/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java b/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java new file mode 100644 index 00000000000..cab3ec851bb --- /dev/null +++ b/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java @@ -0,0 +1,74 @@ +package datadog.trace.instrumentation.jedis; + +import static net.bytebuddy.matcher.ElementMatchers.hasSuperType; +import static net.bytebuddy.matcher.ElementMatchers.isInterface; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.isProtected; +import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.DDAdvice; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.api.DDTags; +import io.opentracing.Scope; +import io.opentracing.Span; +import io.opentracing.tag.Tags; +import io.opentracing.util.GlobalTracer; +import java.util.Collections; +import net.bytebuddy.agent.builder.AgentBuilder; +import net.bytebuddy.asm.Advice; +import redis.clients.jedis.Protocol.Command; + +@AutoService(Instrumenter.class) +public final class JedisInstrumentation implements Instrumenter { + + @Override + public AgentBuilder instrument(final AgentBuilder agentBuilder) { + return agentBuilder + .type(not(isInterface()).and(hasSuperType(named("redis.clients.jedis.Connection")))) + .transform( + DDAdvice.create() + .advice( + isMethod() + .and(isProtected()) + .and(nameStartsWith("sendCommand")) + .and(takesArgument(1, byte[][].class)), + JedisAdvice.class.getName())) + .asDecorator(); + } + + public static class JedisAdvice { + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static Scope nameResource(@Advice.Argument(0) final Command command) { + + final Scope scope = GlobalTracer.get().buildSpan("redis.command").startActive(true); + + final Span span = scope.span(); + Tags.DB_TYPE.set(span, "redis"); + Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); + Tags.COMPONENT.set(span, "redis-command"); + + span.setTag(DDTags.RESOURCE_NAME, command.name()); + span.setTag(DDTags.SERVICE_NAME, "redis"); + span.setTag(DDTags.SPAN_TYPE, "redis"); + span.setTag("span.origin.type", command.getClass().getName()); + + return scope; + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void stopSpan( + @Advice.Enter final Scope scope, @Advice.Thrown final Throwable throwable) { + if (throwable != null) { + final Span span = scope.span(); + Tags.ERROR.set(span, true); + span.log(Collections.singletonMap("error.object", throwable)); + } + scope.close(); + } + } +} diff --git a/examples/README.md b/examples/README.md index 872a3592fe2..0a7348ddfda 100644 --- a/examples/README.md +++ b/examples/README.md @@ -7,7 +7,7 @@ using the OpenTracing API and the DD Tracer. Here are the examples * [Dropwizard (Jax-Rs) + Mongo database + HTTP Client](dropwizard-mongo-client/README.md) -* [Spring-boot + MySQL JDBC database](spring-boot-jdbc/README.md) +* [Spring-boot + MySQL JDBC database + Redis (Jedis client)](spring-boot-jdbc-redis/README.md) * [Instrumenting using a Java Agent](javaagent/README.md) diff --git a/examples/spring-boot-jdbc/README.md b/examples/spring-boot-jdbc-redis/README.md similarity index 82% rename from examples/spring-boot-jdbc/README.md rename to examples/spring-boot-jdbc-redis/README.md index 425e153b2a4..065f1cc18a5 100644 --- a/examples/spring-boot-jdbc/README.md +++ b/examples/spring-boot-jdbc-redis/README.md @@ -15,9 +15,9 @@ all libraries and examples launching from the ``dd-trace-java`` root folder: ./gradlew clean shadowJar bootRepackage ``` -Then you can launch the Datadog agent as follows: +Then you can launch the Datadog agent and a Redis instance as follows: ```bash -cd examples/spring-boot-jdbc +cd examples/spring-boot-jdbc-redis DD_API_KEY= docker-compose up -d ``` @@ -31,12 +31,12 @@ To launch the application, just: ``` *Note: The ``bootRun`` Gradle command appends automatically the ``-javaagent`` argument, so that you don't need to specify -the path of the Java Agent. Gradle executes the ``:examples:spring-boot-jdbc:bootRun`` task until you +the path of the Java Agent. Gradle executes the ``:examples:spring-boot-jdbc-redis:bootRun`` task until you stop it.* Or as an executable jar: ```bash -java -javaagent:../../dd-java-agent/build/libs/dd-java-agent-{version}.jar -Ddd.service.name=spring-boot-jdbc -jar build/libs/spring-boot-jdbc-demo.jar +java -javaagent:../../dd-java-agent/build/libs/dd-java-agent-{version}.jar -Ddd.service.name=spring-boot-jdbc-redis -jar build/libs/spring-boot-jdbc-redis-demo.jar ``` ### Generate traces @@ -45,6 +45,7 @@ Once the Gradle task is running. Go to the following urls: * [http://localhost:8080/user/add?name=foo&email=bar](http://localhost:8080/user/add?name=foo&email=bar) * [http://localhost:8080/user/all](http://localhost:8080/user/all) +* [http://localhost:8080/user/all](http://localhost:8080/user/random) Then get back to Datadog and wait a bit to see a trace coming. @@ -55,5 +56,6 @@ instruments: - The java servlet filters - The JDBC driver +- The Jedis Redis client The Java Agent embeds the [OpenTracing Java Agent](https://github.com/opentracing-contrib/java-agent). diff --git a/examples/spring-boot-jdbc/docker-compose.yml b/examples/spring-boot-jdbc-redis/docker-compose.yml similarity index 70% rename from examples/spring-boot-jdbc/docker-compose.yml rename to examples/spring-boot-jdbc-redis/docker-compose.yml index fb4e6e3fd6f..2ef28b663ce 100644 --- a/examples/spring-boot-jdbc/docker-compose.yml +++ b/examples/spring-boot-jdbc-redis/docker-compose.yml @@ -5,3 +5,7 @@ ddagent: - DD_API_KEY ports: - "127.0.0.1:8126:8126" +redis: + image: redis + ports: + - "127.0.0.1:6379:6379" diff --git a/examples/spring-boot-jdbc/gradle/wrapper/gradle-wrapper.jar b/examples/spring-boot-jdbc-redis/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from examples/spring-boot-jdbc/gradle/wrapper/gradle-wrapper.jar rename to examples/spring-boot-jdbc-redis/gradle/wrapper/gradle-wrapper.jar diff --git a/examples/spring-boot-jdbc/gradle/wrapper/gradle-wrapper.properties b/examples/spring-boot-jdbc-redis/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from examples/spring-boot-jdbc/gradle/wrapper/gradle-wrapper.properties rename to examples/spring-boot-jdbc-redis/gradle/wrapper/gradle-wrapper.properties diff --git a/examples/spring-boot-jdbc/gradlew b/examples/spring-boot-jdbc-redis/gradlew similarity index 100% rename from examples/spring-boot-jdbc/gradlew rename to examples/spring-boot-jdbc-redis/gradlew diff --git a/examples/spring-boot-jdbc/gradlew.bat b/examples/spring-boot-jdbc-redis/gradlew.bat similarity index 100% rename from examples/spring-boot-jdbc/gradlew.bat rename to examples/spring-boot-jdbc-redis/gradlew.bat diff --git a/examples/spring-boot-jdbc/spring-boot-jdbc.gradle b/examples/spring-boot-jdbc-redis/spring-boot-jdbc-redis.gradle similarity index 70% rename from examples/spring-boot-jdbc/spring-boot-jdbc.gradle rename to examples/spring-boot-jdbc-redis/spring-boot-jdbc-redis.gradle index 94339af63ae..487dc27600f 100644 --- a/examples/spring-boot-jdbc/spring-boot-jdbc.gradle +++ b/examples/spring-boot-jdbc-redis/spring-boot-jdbc-redis.gradle @@ -1,19 +1,21 @@ plugins { - id 'org.springframework.boot' version '1.5.4.RELEASE' + id 'org.springframework.boot' version '1.5.10.RELEASE' } apply from: "${rootDir}/gradle/java.gradle" apply from: "${rootDir}/gradle/jacoco.gradle" version = 'demo' -description = 'spring-boot-jdbc' +description = 'spring-boot-jdbc-redis' dependencies { compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.3' compile group: 'com.h2database', name: 'h2', version: '1.4.196' - compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.4.RELEASE' - compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '1.5.4.RELEASE' + compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.10.RELEASE' + compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '1.5.10.RELEASE' + compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '1.5.10.RELEASE' + } bootRepackage { @@ -22,9 +24,9 @@ bootRepackage { bootRun { if (project.hasProperty('javaagent')) { - jvmArgs = ["-javaagent:$javaagent", "-Ddd.service.name=spring-boot-jdbc"] + jvmArgs = ["-javaagent:$javaagent", "-Ddd.service.name=spring-boot-jdbc-redis"] } else { - jvmArgs = ["-javaagent:${project(':dd-java-agent').tasks.shadowJar.outputs.files.getFiles().iterator().next()}", "-Ddd.service.name=spring-boot-jdbc"] + jvmArgs = ["-javaagent:${project(':dd-java-agent').tasks.shadowJar.outputs.files.getFiles().iterator().next()}", "-Ddd.service.name=spring-boot-jdbc-redis"] } } diff --git a/examples/spring-boot-jdbc/src/main/java/datadog/examples/Application.java b/examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/Application.java similarity index 100% rename from examples/spring-boot-jdbc/src/main/java/datadog/examples/Application.java rename to examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/Application.java diff --git a/examples/spring-boot-jdbc/src/main/java/datadog/examples/ApplicationConfig.java b/examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/ApplicationConfig.java similarity index 100% rename from examples/spring-boot-jdbc/src/main/java/datadog/examples/ApplicationConfig.java rename to examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/ApplicationConfig.java diff --git a/examples/spring-boot-jdbc/src/main/java/datadog/examples/entities/User.java b/examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/entities/User.java similarity index 100% rename from examples/spring-boot-jdbc/src/main/java/datadog/examples/entities/User.java rename to examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/entities/User.java diff --git a/examples/spring-boot-jdbc/src/main/java/datadog/examples/entities/UserRepository.java b/examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/entities/UserRepository.java similarity index 100% rename from examples/spring-boot-jdbc/src/main/java/datadog/examples/entities/UserRepository.java rename to examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/entities/UserRepository.java diff --git a/examples/spring-boot-jdbc/src/main/java/datadog/examples/resources/DBResource.java b/examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/resources/DBResource.java similarity index 70% rename from examples/spring-boot-jdbc/src/main/java/datadog/examples/resources/DBResource.java rename to examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/resources/DBResource.java index 5b5503b46a0..93c4cc07594 100644 --- a/examples/spring-boot-jdbc/src/main/java/datadog/examples/resources/DBResource.java +++ b/examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/resources/DBResource.java @@ -3,6 +3,8 @@ import datadog.examples.entities.User; import datadog.examples.entities.UserRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -17,9 +19,16 @@ public class DBResource { // Which is auto-generated by Spring, we will use it to handle the data private UserRepository userRepository; + private ValueOperations ops; + + public DBResource(@Autowired StringRedisTemplate template) { + this.ops = template.opsForValue(); + } + @GetMapping(path = "/add") // Map ONLY GET Requests public @ResponseBody String addNewUser( @RequestParam final String name, @RequestParam final String email) { + // @ResponseBody means the returned String is the response, not a view name // @RequestParam means it is a parameter from the GET or POST request @@ -27,6 +36,10 @@ public class DBResource { n.setName(name); n.setEmail(email); userRepository.save(n); + + // Also save to redis as key/value + ops.set(name, email); + return "Saved"; } @@ -38,7 +51,17 @@ public class DBResource { @GetMapping(path = "/get") public @ResponseBody User getUser(@RequestParam final int id) { - // This returns a JSON or XML with the users + // This returns a JSON or XML with the user return userRepository.findOne(id); } + + @GetMapping(path = "/getredis") + public @ResponseBody String getUserRedis(@RequestParam final String name) { + return ops.get(name); + } + + @GetMapping(path = "/random") + public @ResponseBody String flushRedis() { + return ops.getOperations().randomKey(); + } } diff --git a/examples/spring-boot-jdbc/src/main/java/datadog/examples/resources/HomeResource.java b/examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/resources/HomeResource.java similarity index 69% rename from examples/spring-boot-jdbc/src/main/java/datadog/examples/resources/HomeResource.java rename to examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/resources/HomeResource.java index 893603c3f8c..c4fca29ccb0 100644 --- a/examples/spring-boot-jdbc/src/main/java/datadog/examples/resources/HomeResource.java +++ b/examples/spring-boot-jdbc-redis/src/main/java/datadog/examples/resources/HomeResource.java @@ -15,9 +15,13 @@ public String test() { template.append("Demo links"); template.append(""); return template.toString(); diff --git a/examples/spring-boot-jdbc/out/production/resources/application.properties b/examples/spring-boot-jdbc-redis/src/main/resources/application.properties similarity index 100% rename from examples/spring-boot-jdbc/out/production/resources/application.properties rename to examples/spring-boot-jdbc-redis/src/main/resources/application.properties diff --git a/examples/spring-boot-jdbc/src/main/resources/application.properties b/examples/spring-boot-jdbc/src/main/resources/application.properties deleted file mode 100644 index 57104fffacd..00000000000 --- a/examples/spring-boot-jdbc/src/main/resources/application.properties +++ /dev/null @@ -1,7 +0,0 @@ -# you must set the following so that OpenTracing traced driver is used -spring.datasource.driver-class-name=org.h2.Driver -spring.datasource.url=jdbc:h2:mem:spring-test;DB_CLOSE_ON_EXIT=FALSE - -# set the logging level -logging.level.root=INFO -logging.level.datadog.trace=DEBUG diff --git a/settings.gradle b/settings.gradle index c54b760d5a2..0b39cfac6c7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -12,6 +12,7 @@ include ':dd-java-agent:instrumentation:apache-httpclient-4.3' include ':dd-java-agent:instrumentation:aws-sdk' include ':dd-java-agent:instrumentation:datastax-cassandra-3.2' include ':dd-java-agent:instrumentation:jdbc' +include ':dd-java-agent:instrumentation:jedis-2.9' include ':dd-java-agent:instrumentation:jms-1' include ':dd-java-agent:instrumentation:jms-2' include ':dd-java-agent:instrumentation:mongo-3.1' @@ -31,7 +32,7 @@ if (JavaVersion.current().isJava8Compatible()) { // examples include ':examples:dropwizard-mongo-client' - include ':examples:spring-boot-jdbc' + include ':examples:spring-boot-jdbc-redis' include ':examples:rest-spark' } From fb7a81c2bdfdaffc93ead047d9152983e0cfdee9 Mon Sep 17 00:00:00 2001 From: Gihad Murad Date: Tue, 13 Feb 2018 17:56:36 -0500 Subject: [PATCH 2/7] Removed unused tag, extended Instrumenter.Configurable (disabled by default) --- .../jedis/JedisInstrumentation.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java b/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java index cab3ec851bb..606b306d41e 100644 --- a/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java +++ b/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java @@ -23,10 +23,21 @@ import redis.clients.jedis.Protocol.Command; @AutoService(Instrumenter.class) -public final class JedisInstrumentation implements Instrumenter { +public final class JedisInstrumentation extends Instrumenter.Configurable { + + private static final String SERVICE_NAME = "redis"; + + public JedisInstrumentation() { + super(SERVICE_NAME); + } + + @Override + protected boolean defaultEnabled() { + return false; + } @Override - public AgentBuilder instrument(final AgentBuilder agentBuilder) { + public AgentBuilder apply(final AgentBuilder agentBuilder) { return agentBuilder .type(not(isInterface()).and(hasSuperType(named("redis.clients.jedis.Connection")))) .transform( @@ -48,14 +59,13 @@ public static Scope nameResource(@Advice.Argument(0) final Command command) { final Scope scope = GlobalTracer.get().buildSpan("redis.command").startActive(true); final Span span = scope.span(); - Tags.DB_TYPE.set(span, "redis"); + Tags.DB_TYPE.set(span, SERVICE_NAME); Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); Tags.COMPONENT.set(span, "redis-command"); span.setTag(DDTags.RESOURCE_NAME, command.name()); - span.setTag(DDTags.SERVICE_NAME, "redis"); - span.setTag(DDTags.SPAN_TYPE, "redis"); - span.setTag("span.origin.type", command.getClass().getName()); + span.setTag(DDTags.SERVICE_NAME, SERVICE_NAME); + span.setTag(DDTags.SPAN_TYPE, SERVICE_NAME); return scope; } From 7c42e2e791818d2bbe8fd790407df83fb10b4279 Mon Sep 17 00:00:00 2001 From: gihad Date: Sat, 17 Feb 2018 21:30:18 -0500 Subject: [PATCH 3/7] Added jedis instrumentation integration tests with embedded redis --- .../jedis-2.9/jedis-2.9.gradle | 5 ++ .../src/test/groovy/JedisClientTest.groovy | 83 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy diff --git a/dd-java-agent/instrumentation/jedis-2.9/jedis-2.9.gradle b/dd-java-agent/instrumentation/jedis-2.9/jedis-2.9.gradle index 11e7fa280ec..bf364a98b01 100644 --- a/dd-java-agent/instrumentation/jedis-2.9/jedis-2.9.gradle +++ b/dd-java-agent/instrumentation/jedis-2.9/jedis-2.9.gradle @@ -10,4 +10,9 @@ dependencies { compile deps.bytebuddy compile deps.opentracing compile deps.autoservice + + testCompile project(':dd-java-agent:testing') + testCompile group: 'com.github.kstyrc', name: 'embedded-redis', version: '0.6' + testCompile group: 'redis.clients', name: 'jedis', version: '2.9.0' + } diff --git a/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy b/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy new file mode 100644 index 00000000000..d048cd93b93 --- /dev/null +++ b/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy @@ -0,0 +1,83 @@ +import datadog.opentracing.DDSpan +import datadog.trace.agent.test.AgentTestRunner +import org.junit.ClassRule +import redis.clients.jedis.Jedis +import redis.embedded.RedisServer +import spock.lang.Shared +import ch.qos.logback.classic.Level +import ch.qos.logback.classic.Logger +import org.slf4j.LoggerFactory +import io.opentracing.tag.Tags +import datadog.trace.api.DDTags + +class JedisClientTest extends AgentTestRunner { + + public static final int PORT = 6399 + + static { + ((Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).setLevel(Level.WARN) + ((Logger) LoggerFactory.getLogger("datadog")).setLevel(Level.DEBUG) + System.setProperty("dd.integration.redis.enabled", "true") + } + + @Shared + RedisServer redisServer = new RedisServer(PORT); + @Shared + Jedis jedis = new Jedis("localhost",PORT); + + def setupSpec() { + redisServer.start(); + } + + def cleanupSpec() { + redisServer.stop(); + jedis.close(); + } + + def "set command"() { + jedis.set("foo", "bar"); + + expect: + final DDSpan setTrace = TEST_WRITER.get(TEST_WRITER.size() - 1).get(0) + setTrace.getServiceName() == "redis" + setTrace.getOperationName() == "redis.query" + setTrace.getResourceName() == "SET" + setTrace.getTags().get(Tags.COMPONENT.getKey()) == "redis-command" + setTrace.getTags().get(Tags.DB_TYPE.getKey()) == "redis" + setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == "client" + setTrace.getTags().get(DDTags.SPAN_TYPE) == "redis" + } + + def "get command"() { + jedis.set("foo", "bar") + def value = jedis.get("foo") + + expect: + value == "bar" + final DDSpan setTrace = TEST_WRITER.get(TEST_WRITER.size() - 1).get(0) + setTrace.getServiceName() == "redis" + setTrace.getOperationName() == "redis.query" + setTrace.getResourceName() == "GET" + setTrace.getTags().get(Tags.COMPONENT.getKey()) == "redis-command" + setTrace.getTags().get(Tags.DB_TYPE.getKey()) == "redis" + setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == "client" + setTrace.getTags().get(DDTags.SPAN_TYPE) == "redis" + } + + def "command with no arguments"() { + jedis.flushAll() + jedis.set("foo", "bar") + def value = jedis.randomKey() + + expect: + value == "foo" + final DDSpan setTrace = TEST_WRITER.get(TEST_WRITER.size() - 1).get(0) + setTrace.getServiceName() == "redis" + setTrace.getOperationName() == "redis.query" + setTrace.getResourceName() == "RANDOMKEY" + setTrace.getTags().get(Tags.COMPONENT.getKey()) == "redis-command" + setTrace.getTags().get(Tags.DB_TYPE.getKey()) == "redis" + setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == "client" + setTrace.getTags().get(DDTags.SPAN_TYPE) == "redis" + } +} \ No newline at end of file From 3613b9bd7d18dd7c16b0a4691d92e3f5f36adf13 Mon Sep 17 00:00:00 2001 From: gihad Date: Sat, 17 Feb 2018 22:35:45 -0500 Subject: [PATCH 4/7] removed unused import --- .../src/test/groovy/JedisClientTest.groovy | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy b/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy index d048cd93b93..958623f24a6 100644 --- a/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy +++ b/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy @@ -1,14 +1,14 @@ +import org.slf4j.LoggerFactory + +import ch.qos.logback.classic.Level +import ch.qos.logback.classic.Logger import datadog.opentracing.DDSpan import datadog.trace.agent.test.AgentTestRunner -import org.junit.ClassRule +import datadog.trace.api.DDTags +import io.opentracing.tag.Tags import redis.clients.jedis.Jedis import redis.embedded.RedisServer import spock.lang.Shared -import ch.qos.logback.classic.Level -import ch.qos.logback.classic.Logger -import org.slf4j.LoggerFactory -import io.opentracing.tag.Tags -import datadog.trace.api.DDTags class JedisClientTest extends AgentTestRunner { @@ -21,21 +21,21 @@ class JedisClientTest extends AgentTestRunner { } @Shared - RedisServer redisServer = new RedisServer(PORT); + RedisServer redisServer = new RedisServer(PORT) @Shared - Jedis jedis = new Jedis("localhost",PORT); + Jedis jedis = new Jedis("localhost",PORT) def setupSpec() { - redisServer.start(); + redisServer.start() } def cleanupSpec() { - redisServer.stop(); - jedis.close(); + redisServer.stop() + jedis.close() } def "set command"() { - jedis.set("foo", "bar"); + jedis.set("foo", "bar") expect: final DDSpan setTrace = TEST_WRITER.get(TEST_WRITER.size() - 1).get(0) From 692b6e7508f72993c787d0a62de0532b4d80d500 Mon Sep 17 00:00:00 2001 From: gihad Date: Sun, 18 Feb 2018 08:24:54 -0500 Subject: [PATCH 5/7] removed tabs for spaces --- .../src/test/groovy/JedisClientTest.groovy | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy b/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy index 958623f24a6..15d44cb7674 100644 --- a/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy +++ b/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy @@ -37,15 +37,15 @@ class JedisClientTest extends AgentTestRunner { def "set command"() { jedis.set("foo", "bar") - expect: - final DDSpan setTrace = TEST_WRITER.get(TEST_WRITER.size() - 1).get(0) - setTrace.getServiceName() == "redis" - setTrace.getOperationName() == "redis.query" - setTrace.getResourceName() == "SET" - setTrace.getTags().get(Tags.COMPONENT.getKey()) == "redis-command" - setTrace.getTags().get(Tags.DB_TYPE.getKey()) == "redis" - setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == "client" - setTrace.getTags().get(DDTags.SPAN_TYPE) == "redis" + expect: + final DDSpan setTrace = TEST_WRITER.get(TEST_WRITER.size() - 1).get(0) + setTrace.getServiceName() == "redis" + setTrace.getOperationName() == "redis.query" + setTrace.getResourceName() == "SET" + setTrace.getTags().get(Tags.COMPONENT.getKey()) == "redis-command" + setTrace.getTags().get(Tags.DB_TYPE.getKey()) == "redis" + setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == "client" + setTrace.getTags().get(DDTags.SPAN_TYPE) == "redis" } def "get command"() { From 44dd384648e3cad42512a35f64c9d813bb0f7d88 Mon Sep 17 00:00:00 2001 From: gihad Date: Sun, 18 Feb 2018 08:38:47 -0500 Subject: [PATCH 6/7] reusing declared values to make tests more roboust --- .../jedis/JedisInstrumentation.java | 3 +- .../src/test/groovy/JedisClientTest.groovy | 31 ++++++++++--------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java b/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java index 606b306d41e..7cb27ae7e27 100644 --- a/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java +++ b/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java @@ -26,6 +26,7 @@ public final class JedisInstrumentation extends Instrumenter.Configurable { private static final String SERVICE_NAME = "redis"; + private static final String COMPONENT_NAME = SERVICE_NAME + "-command"; public JedisInstrumentation() { super(SERVICE_NAME); @@ -61,7 +62,7 @@ public static Scope nameResource(@Advice.Argument(0) final Command command) { final Span span = scope.span(); Tags.DB_TYPE.set(span, SERVICE_NAME); Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); - Tags.COMPONENT.set(span, "redis-command"); + Tags.COMPONENT.set(span, COMPONENT_NAME); span.setTag(DDTags.RESOURCE_NAME, command.name()); span.setTag(DDTags.SERVICE_NAME, SERVICE_NAME); diff --git a/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy b/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy index 15d44cb7674..bbfff2afca5 100644 --- a/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy +++ b/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy @@ -9,6 +9,7 @@ import io.opentracing.tag.Tags import redis.clients.jedis.Jedis import redis.embedded.RedisServer import spock.lang.Shared +import datadog.trace.instrumentation.jedis.JedisInstrumentation class JedisClientTest extends AgentTestRunner { @@ -39,13 +40,13 @@ class JedisClientTest extends AgentTestRunner { expect: final DDSpan setTrace = TEST_WRITER.get(TEST_WRITER.size() - 1).get(0) - setTrace.getServiceName() == "redis" + setTrace.getServiceName() == JedisInstrumentation.SERVICE_NAME setTrace.getOperationName() == "redis.query" setTrace.getResourceName() == "SET" - setTrace.getTags().get(Tags.COMPONENT.getKey()) == "redis-command" - setTrace.getTags().get(Tags.DB_TYPE.getKey()) == "redis" - setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == "client" - setTrace.getTags().get(DDTags.SPAN_TYPE) == "redis" + setTrace.getTags().get(Tags.COMPONENT.getKey()) == JedisInstrumentation.COMPONENT_NAME + setTrace.getTags().get(Tags.DB_TYPE.getKey()) == JedisInstrumentation.SERVICE_NAME + setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == Tags.SPAN_KIND_CLIENT + setTrace.getTags().get(DDTags.SPAN_TYPE) == JedisInstrumentation.SERVICE_NAME } def "get command"() { @@ -55,13 +56,13 @@ class JedisClientTest extends AgentTestRunner { expect: value == "bar" final DDSpan setTrace = TEST_WRITER.get(TEST_WRITER.size() - 1).get(0) - setTrace.getServiceName() == "redis" + setTrace.getServiceName() == JedisInstrumentation.SERVICE_NAME setTrace.getOperationName() == "redis.query" setTrace.getResourceName() == "GET" - setTrace.getTags().get(Tags.COMPONENT.getKey()) == "redis-command" - setTrace.getTags().get(Tags.DB_TYPE.getKey()) == "redis" - setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == "client" - setTrace.getTags().get(DDTags.SPAN_TYPE) == "redis" + setTrace.getTags().get(Tags.COMPONENT.getKey()) == JedisInstrumentation.COMPONENT_NAME + setTrace.getTags().get(Tags.DB_TYPE.getKey()) == JedisInstrumentation.SERVICE_NAME + setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == Tags.SPAN_KIND_CLIENT + setTrace.getTags().get(DDTags.SPAN_TYPE) == JedisInstrumentation.SERVICE_NAME } def "command with no arguments"() { @@ -72,12 +73,12 @@ class JedisClientTest extends AgentTestRunner { expect: value == "foo" final DDSpan setTrace = TEST_WRITER.get(TEST_WRITER.size() - 1).get(0) - setTrace.getServiceName() == "redis" + setTrace.getServiceName() == JedisInstrumentation.SERVICE_NAME setTrace.getOperationName() == "redis.query" setTrace.getResourceName() == "RANDOMKEY" - setTrace.getTags().get(Tags.COMPONENT.getKey()) == "redis-command" - setTrace.getTags().get(Tags.DB_TYPE.getKey()) == "redis" - setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == "client" - setTrace.getTags().get(DDTags.SPAN_TYPE) == "redis" + setTrace.getTags().get(Tags.COMPONENT.getKey()) == JedisInstrumentation.COMPONENT_NAME + setTrace.getTags().get(Tags.DB_TYPE.getKey()) == JedisInstrumentation.SERVICE_NAME + setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == Tags.SPAN_KIND_CLIENT + setTrace.getTags().get(DDTags.SPAN_TYPE) == JedisInstrumentation.SERVICE_NAME } } \ No newline at end of file From 163b285868c4b350a266250378c0642f9f28e891 Mon Sep 17 00:00:00 2001 From: Tyler Benson Date: Fri, 23 Feb 2018 11:32:11 +1000 Subject: [PATCH 7/7] =?UTF-8?q?Rename=20to=20jedis-1.4=20since=20that?= =?UTF-8?q?=E2=80=99s=20the=20earliest=20working=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also change instrumentation binding for better coverage. --- .../src/test/groovy/AWSClientTest.groovy | 1 + .../jedis-1.4/jedis-1.4.gradle | 28 ++++++ .../jedis/JedisInstrumentation.java | 19 ++-- .../src/test/groovy/JedisClientTest.groovy | 99 +++++++++++++++++++ .../jedis-2.9/jedis-2.9.gradle | 18 ---- .../src/test/groovy/JedisClientTest.groovy | 84 ---------------- .../trace/api/writer/WriterQueueTest.groovy | 5 +- settings.gradle | 2 +- 8 files changed, 139 insertions(+), 117 deletions(-) create mode 100644 dd-java-agent/instrumentation/jedis-1.4/jedis-1.4.gradle rename dd-java-agent/instrumentation/{jedis-2.9 => jedis-1.4}/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java (77%) create mode 100644 dd-java-agent/instrumentation/jedis-1.4/src/test/groovy/JedisClientTest.groovy delete mode 100644 dd-java-agent/instrumentation/jedis-2.9/jedis-2.9.gradle delete mode 100644 dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy diff --git a/dd-java-agent/instrumentation/aws-sdk/src/test/groovy/AWSClientTest.groovy b/dd-java-agent/instrumentation/aws-sdk/src/test/groovy/AWSClientTest.groovy index 7b63c72264e..12ac772118f 100644 --- a/dd-java-agent/instrumentation/aws-sdk/src/test/groovy/AWSClientTest.groovy +++ b/dd-java-agent/instrumentation/aws-sdk/src/test/groovy/AWSClientTest.groovy @@ -61,6 +61,7 @@ class AWSClientTest extends AgentTestRunner { false | 1 } + @Timeout(10) def "send request with mocked back end"() { setup: def receivedHeaders = new AtomicReference() diff --git a/dd-java-agent/instrumentation/jedis-1.4/jedis-1.4.gradle b/dd-java-agent/instrumentation/jedis-1.4/jedis-1.4.gradle new file mode 100644 index 00000000000..8213199b91a --- /dev/null +++ b/dd-java-agent/instrumentation/jedis-1.4/jedis-1.4.gradle @@ -0,0 +1,28 @@ +apply plugin: 'version-scan' + +versionScan { + group = "redis.clients" + module = "jedis" + versions = "[1.4.0,)" + legacyModule = "jms-api" + verifyPresent = [ + 'redis.clients.jedis.Protocol$Command': null, + ] +} + +apply from: "${rootDir}/gradle/java.gradle" + +dependencies { + compileOnly group: 'redis.clients', name: 'jedis', version: '1.4.0' + + compile project(':dd-java-agent:agent-tooling') + + compile deps.bytebuddy + compile deps.opentracing + compile deps.autoservice + + testCompile project(':dd-java-agent:testing') + testCompile group: 'com.github.kstyrc', name: 'embedded-redis', version: '0.6' + testCompile group: 'redis.clients', name: 'jedis', version: '1.4.0' + +} diff --git a/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java b/dd-java-agent/instrumentation/jedis-1.4/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java similarity index 77% rename from dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java rename to dd-java-agent/instrumentation/jedis-1.4/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java index 7cb27ae7e27..bdcd63f0546 100644 --- a/dd-java-agent/instrumentation/jedis-2.9/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java +++ b/dd-java-agent/instrumentation/jedis-1.4/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java @@ -1,12 +1,9 @@ package datadog.trace.instrumentation.jedis; -import static net.bytebuddy.matcher.ElementMatchers.hasSuperType; -import static net.bytebuddy.matcher.ElementMatchers.isInterface; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses; import static net.bytebuddy.matcher.ElementMatchers.isMethod; -import static net.bytebuddy.matcher.ElementMatchers.isProtected; -import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; +import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -40,14 +37,16 @@ protected boolean defaultEnabled() { @Override public AgentBuilder apply(final AgentBuilder agentBuilder) { return agentBuilder - .type(not(isInterface()).and(hasSuperType(named("redis.clients.jedis.Connection")))) + .type( + named("redis.clients.jedis.Protocol"), + classLoaderHasClasses("redis.clients.jedis.Protocol$Command")) .transform( DDAdvice.create() .advice( isMethod() - .and(isProtected()) - .and(nameStartsWith("sendCommand")) - .and(takesArgument(1, byte[][].class)), + .and(isPublic()) + .and(named("sendCommand")) + .and(takesArgument(1, named("redis.clients.jedis.Protocol$Command"))), JedisAdvice.class.getName())) .asDecorator(); } @@ -55,7 +54,7 @@ public AgentBuilder apply(final AgentBuilder agentBuilder) { public static class JedisAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static Scope nameResource(@Advice.Argument(0) final Command command) { + public static Scope startSpan(@Advice.Argument(1) final Command command) { final Scope scope = GlobalTracer.get().buildSpan("redis.command").startActive(true); diff --git a/dd-java-agent/instrumentation/jedis-1.4/src/test/groovy/JedisClientTest.groovy b/dd-java-agent/instrumentation/jedis-1.4/src/test/groovy/JedisClientTest.groovy new file mode 100644 index 00000000000..e0c30ea80e0 --- /dev/null +++ b/dd-java-agent/instrumentation/jedis-1.4/src/test/groovy/JedisClientTest.groovy @@ -0,0 +1,99 @@ +import datadog.opentracing.DDSpan +import datadog.trace.agent.test.AgentTestRunner +import datadog.trace.api.DDTags +import datadog.trace.instrumentation.jedis.JedisInstrumentation +import io.opentracing.tag.Tags +import redis.clients.jedis.Jedis +import redis.embedded.RedisServer +import spock.lang.Shared +import spock.lang.Timeout + +@Timeout(5) +class JedisClientTest extends AgentTestRunner { + + public static final int PORT = 6399 + + static { + System.setProperty("dd.integration.redis.enabled", "true") + } + + @Shared + RedisServer redisServer = RedisServer.builder() + // bind to localhost to avoid firewall popup + .setting("bind 127.0.0.1") + // set max memory to avoid problems in CI + .setting("maxmemory 128M") + .port(PORT).build() + @Shared + Jedis jedis = new Jedis("localhost", PORT) + + def setupSpec() { + println "Using redis: $redisServer.args" + redisServer.start() + } + + def cleanupSpec() { + redisServer.stop() +// jedis.close() // not available in the early version we're using. + } + + def setup() { + jedis.flushAll() + TEST_WRITER.start() + } + + def "set command"() { + jedis.set("foo", "bar") + + expect: + TEST_WRITER.size() == 1 + def trace = TEST_WRITER.firstTrace() + trace.size() == 1 + final DDSpan setTrace = trace.get(0) + setTrace.getServiceName() == JedisInstrumentation.SERVICE_NAME + setTrace.getOperationName() == "redis.query" + setTrace.getResourceName() == "SET" + setTrace.getTags().get(Tags.COMPONENT.getKey()) == JedisInstrumentation.COMPONENT_NAME + setTrace.getTags().get(Tags.DB_TYPE.getKey()) == JedisInstrumentation.SERVICE_NAME + setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == Tags.SPAN_KIND_CLIENT + setTrace.getTags().get(DDTags.SPAN_TYPE) == JedisInstrumentation.SERVICE_NAME + } + + def "get command"() { + jedis.set("foo", "bar") + def value = jedis.get("foo") + + expect: + value == "bar" + TEST_WRITER.size() == 2 + def trace = TEST_WRITER.get(1) + trace.size() == 1 + final DDSpan getSpan = trace.get(0) + getSpan.getServiceName() == JedisInstrumentation.SERVICE_NAME + getSpan.getOperationName() == "redis.query" + getSpan.getResourceName() == "GET" + getSpan.getTags().get(Tags.COMPONENT.getKey()) == JedisInstrumentation.COMPONENT_NAME + getSpan.getTags().get(Tags.DB_TYPE.getKey()) == JedisInstrumentation.SERVICE_NAME + getSpan.getTags().get(Tags.SPAN_KIND.getKey()) == Tags.SPAN_KIND_CLIENT + getSpan.getTags().get(DDTags.SPAN_TYPE) == JedisInstrumentation.SERVICE_NAME + } + + def "command with no arguments"() { + jedis.set("foo", "bar") + def value = jedis.randomKey() + + expect: + value == "foo" + TEST_WRITER.size() == 2 + def trace = TEST_WRITER.get(1) + trace.size() == 1 + final DDSpan randomKeySpan = trace.get(0) + randomKeySpan.getServiceName() == JedisInstrumentation.SERVICE_NAME + randomKeySpan.getOperationName() == "redis.query" + randomKeySpan.getResourceName() == "RANDOMKEY" + randomKeySpan.getTags().get(Tags.COMPONENT.getKey()) == JedisInstrumentation.COMPONENT_NAME + randomKeySpan.getTags().get(Tags.DB_TYPE.getKey()) == JedisInstrumentation.SERVICE_NAME + randomKeySpan.getTags().get(Tags.SPAN_KIND.getKey()) == Tags.SPAN_KIND_CLIENT + randomKeySpan.getTags().get(DDTags.SPAN_TYPE) == JedisInstrumentation.SERVICE_NAME + } +} diff --git a/dd-java-agent/instrumentation/jedis-2.9/jedis-2.9.gradle b/dd-java-agent/instrumentation/jedis-2.9/jedis-2.9.gradle deleted file mode 100644 index bf364a98b01..00000000000 --- a/dd-java-agent/instrumentation/jedis-2.9/jedis-2.9.gradle +++ /dev/null @@ -1,18 +0,0 @@ - -apply from: "${rootDir}/gradle/java.gradle" - -dependencies { - compileOnly group: 'redis.clients', name: 'jedis', version: '2.9.0' - - compile project(':dd-trace-ot') - compile project(':dd-java-agent:tooling') - - compile deps.bytebuddy - compile deps.opentracing - compile deps.autoservice - - testCompile project(':dd-java-agent:testing') - testCompile group: 'com.github.kstyrc', name: 'embedded-redis', version: '0.6' - testCompile group: 'redis.clients', name: 'jedis', version: '2.9.0' - -} diff --git a/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy b/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy deleted file mode 100644 index bbfff2afca5..00000000000 --- a/dd-java-agent/instrumentation/jedis-2.9/src/test/groovy/JedisClientTest.groovy +++ /dev/null @@ -1,84 +0,0 @@ -import org.slf4j.LoggerFactory - -import ch.qos.logback.classic.Level -import ch.qos.logback.classic.Logger -import datadog.opentracing.DDSpan -import datadog.trace.agent.test.AgentTestRunner -import datadog.trace.api.DDTags -import io.opentracing.tag.Tags -import redis.clients.jedis.Jedis -import redis.embedded.RedisServer -import spock.lang.Shared -import datadog.trace.instrumentation.jedis.JedisInstrumentation - -class JedisClientTest extends AgentTestRunner { - - public static final int PORT = 6399 - - static { - ((Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).setLevel(Level.WARN) - ((Logger) LoggerFactory.getLogger("datadog")).setLevel(Level.DEBUG) - System.setProperty("dd.integration.redis.enabled", "true") - } - - @Shared - RedisServer redisServer = new RedisServer(PORT) - @Shared - Jedis jedis = new Jedis("localhost",PORT) - - def setupSpec() { - redisServer.start() - } - - def cleanupSpec() { - redisServer.stop() - jedis.close() - } - - def "set command"() { - jedis.set("foo", "bar") - - expect: - final DDSpan setTrace = TEST_WRITER.get(TEST_WRITER.size() - 1).get(0) - setTrace.getServiceName() == JedisInstrumentation.SERVICE_NAME - setTrace.getOperationName() == "redis.query" - setTrace.getResourceName() == "SET" - setTrace.getTags().get(Tags.COMPONENT.getKey()) == JedisInstrumentation.COMPONENT_NAME - setTrace.getTags().get(Tags.DB_TYPE.getKey()) == JedisInstrumentation.SERVICE_NAME - setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == Tags.SPAN_KIND_CLIENT - setTrace.getTags().get(DDTags.SPAN_TYPE) == JedisInstrumentation.SERVICE_NAME - } - - def "get command"() { - jedis.set("foo", "bar") - def value = jedis.get("foo") - - expect: - value == "bar" - final DDSpan setTrace = TEST_WRITER.get(TEST_WRITER.size() - 1).get(0) - setTrace.getServiceName() == JedisInstrumentation.SERVICE_NAME - setTrace.getOperationName() == "redis.query" - setTrace.getResourceName() == "GET" - setTrace.getTags().get(Tags.COMPONENT.getKey()) == JedisInstrumentation.COMPONENT_NAME - setTrace.getTags().get(Tags.DB_TYPE.getKey()) == JedisInstrumentation.SERVICE_NAME - setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == Tags.SPAN_KIND_CLIENT - setTrace.getTags().get(DDTags.SPAN_TYPE) == JedisInstrumentation.SERVICE_NAME - } - - def "command with no arguments"() { - jedis.flushAll() - jedis.set("foo", "bar") - def value = jedis.randomKey() - - expect: - value == "foo" - final DDSpan setTrace = TEST_WRITER.get(TEST_WRITER.size() - 1).get(0) - setTrace.getServiceName() == JedisInstrumentation.SERVICE_NAME - setTrace.getOperationName() == "redis.query" - setTrace.getResourceName() == "RANDOMKEY" - setTrace.getTags().get(Tags.COMPONENT.getKey()) == JedisInstrumentation.COMPONENT_NAME - setTrace.getTags().get(Tags.DB_TYPE.getKey()) == JedisInstrumentation.SERVICE_NAME - setTrace.getTags().get(Tags.SPAN_KIND.getKey()) == Tags.SPAN_KIND_CLIENT - setTrace.getTags().get(DDTags.SPAN_TYPE) == JedisInstrumentation.SERVICE_NAME - } -} \ No newline at end of file diff --git a/dd-trace-ot/src/test/groovy/datadog/trace/api/writer/WriterQueueTest.groovy b/dd-trace-ot/src/test/groovy/datadog/trace/api/writer/WriterQueueTest.groovy index 7632cca6d79..1402f4d85b1 100644 --- a/dd-trace-ot/src/test/groovy/datadog/trace/api/writer/WriterQueueTest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/trace/api/writer/WriterQueueTest.groovy @@ -7,7 +7,7 @@ import spock.lang.Timeout import java.util.concurrent.Phaser import java.util.concurrent.atomic.AtomicInteger -@Timeout(1) +@Timeout(5) class WriterQueueTest extends Specification { def "instantiate a empty queue throws an exception"() { @@ -120,7 +120,6 @@ class WriterQueueTest extends Specification { capacity = 100 numberThreads << [1, 10, 100] numberInsertionsPerThread = 100 - } @@ -180,7 +179,5 @@ class WriterQueueTest extends Specification { numberThreadsReads << [1, 5, 10] numberInsertionsPerThread = 100 numberGetsPerThread = 5 - } - } diff --git a/settings.gradle b/settings.gradle index 6883fe4e160..89ae5570b68 100644 --- a/settings.gradle +++ b/settings.gradle @@ -16,7 +16,7 @@ include ':dd-java-agent:instrumentation:datastax-cassandra-3.2' include ':dd-java-agent:instrumentation:jax-rs' include ':dd-java-agent:instrumentation:jboss-classloading' include ':dd-java-agent:instrumentation:jdbc' -include ':dd-java-agent:instrumentation:jedis-2.9' +include ':dd-java-agent:instrumentation:jedis-1.4' include ':dd-java-agent:instrumentation:jms-1' include ':dd-java-agent:instrumentation:jms-2' include ':dd-java-agent:instrumentation:kafka-clients-0.11'