Skip to content

Commit 7298b0a

Browse files
author
Andrew Kent
committed
Convert datastax cassandra instrumentation to bytebuddy
1 parent 54a830b commit 7298b0a

File tree

9 files changed

+100
-89
lines changed

9 files changed

+100
-89
lines changed

dd-java-agent/dd-java-agent.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ dependencies {
2424
compile(project(':dd-java-agent:integrations:aws-sdk')) {
2525
transitive = false
2626
}
27+
compile(project(':dd-java-agent:integrations:datastax-cassandra-3.2')) {
28+
transitive = false
29+
}
2730
compile(project(':dd-java-agent:integrations:jms-1')) {
2831
transitive = false
2932
}

dd-java-agent/integrations/cassandra/cassandra.gradle

Lines changed: 0 additions & 12 deletions
This file was deleted.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// TODO: VersionScan plugin does not report which version failed, which is making it hard to get meaningful results out of this block.
2+
// Once versionScan can report on which version failed, this can be enabled.
3+
// The desire is to apply the instrumentation to cassandra-datastax 2.3 and beyond.
4+
// apply plugin: 'version-scan'
5+
6+
// versionScan {
7+
// group = "com.datastax.cassandra"
8+
// module = "cassandra-driver-core"
9+
// versions = "[3.2.0,)"
10+
// verifyPresent = [
11+
// // class we're advising
12+
// 'com.datastax.driver.core.Cluster$Manager': null,
13+
// // used by TracingSession
14+
// 'com.datastax.driver.core.BoundStatement' : null,
15+
// 'com.datastax.driver.core.BoundStatement' : null,
16+
// 'com.datastax.driver.core.CloseFuture' : null,
17+
// 'com.datastax.driver.core.Cluster' : null,
18+
// 'com.datastax.driver.core.Host' : null,
19+
// 'com.datastax.driver.core.PreparedStatement' : null,
20+
// 'com.datastax.driver.core.RegularStatement' : null,
21+
// 'com.datastax.driver.core.ResultSet' : null,
22+
// 'com.datastax.driver.core.ResultSetFuture' : null,
23+
// 'com.datastax.driver.core.Session' : null,
24+
// 'com.datastax.driver.core.Statement' : null,
25+
// 'com.google.common.base.Function' : null,
26+
// 'com.google.common.util.concurrent.Futures' : null,
27+
// 'com.google.common.util.concurrent.ListenableFuture' : null
28+
// ]
29+
// }
30+
31+
apply from: "${rootDir}/gradle/java.gradle"
32+
33+
dependencies {
34+
compile group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '3.2.0'
35+
36+
compile project(':dd-trace')
37+
// include helpers to pick up opentracing-cassandra-driver helper
38+
compile project(':dd-java-agent:integrations:helpers')
39+
compile project(':dd-java-agent:tooling')
40+
41+
compile deps.bytebuddy
42+
compile deps.opentracing
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package dd.inst.datastax.cassandra;
2+
3+
import static dd.trace.ExceptionHandlers.defaultExceptionHandler;
4+
import static net.bytebuddy.matcher.ElementMatchers.*;
5+
6+
import com.datastax.driver.core.Session;
7+
import com.google.auto.service.AutoService;
8+
import dd.trace.Instrumenter;
9+
import io.opentracing.Tracer;
10+
import io.opentracing.util.GlobalTracer;
11+
import java.lang.reflect.Constructor;
12+
import net.bytebuddy.agent.builder.AgentBuilder;
13+
import net.bytebuddy.asm.Advice;
14+
15+
@AutoService(Instrumenter.class)
16+
public class CassandraClientInstrumentation implements Instrumenter {
17+
@Override
18+
public AgentBuilder instrument(AgentBuilder agentBuilder) {
19+
return agentBuilder
20+
.type(named("com.datastax.driver.core.Cluster$Manager"))
21+
.transform(
22+
new AgentBuilder.Transformer.ForAdvice()
23+
.advice(
24+
isMethod().and(isPrivate()).and(named("newSession")).and(takesArguments(0)),
25+
CassandraClientAdvice.class.getName())
26+
.withExceptionHandler(defaultExceptionHandler()))
27+
.asDecorator();
28+
}
29+
30+
public static class CassandraClientAdvice {
31+
/**
32+
* Strategy: each time we build a connection to a Cassandra cluster, the
33+
* com.datastax.driver.core.Cluster$Manager.newSession() method is called. The opentracing
34+
* contribution is a simple wrapper, so we just have to wrap the new session.
35+
*
36+
* @param session The fresh session to patch
37+
* @return A new tracing session
38+
* @throws Exception
39+
*/
40+
@Advice.OnMethodExit(suppress = Throwable.class)
41+
public static void injectTracingSession(@Advice.Return(readOnly = false) Session session)
42+
throws Exception {
43+
if (session.getClass().getName().endsWith("contrib.cassandra.TracingSession")) {
44+
return;
45+
}
46+
47+
Class<?> clazz = Class.forName("io.opentracing.contrib.cassandra.TracingSession");
48+
Constructor<?> constructor = clazz.getDeclaredConstructor(Session.class, Tracer.class);
49+
constructor.setAccessible(true);
50+
session = (Session) constructor.newInstance(session, GlobalTracer.get());
51+
}
52+
}
53+
}

dd-java-agent/integrations/helpers/src/main/java/com/datadoghq/agent/integration/CassandraHelper.java

Lines changed: 0 additions & 43 deletions
This file was deleted.

dd-java-agent/src/main/resources/dd-trace-supported-framework.yaml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,6 @@ opentracing-aws-sdk:
2525
com.amazonaws.http.apache.utils.ApacheUtils:
2626
com.amazonaws.http.request.HttpRequestFactory:
2727

28-
opentracing-cassandra-driver:
29-
- artifact: cassandra-driver-core
30-
supported_version: 3\.2.*
31-
identifying_present_classes:
32-
com.datastax.driver.core.utils.MoreObjects:
33-
com.datastax.driver.core.RemoteEndpointAwareNettySSLOptions:
34-
com.datastax.driver.core.GuavaCompatibility:
35-
3628
opentracing-jms-2_producer:
3729
- artifact: javax.jms-api
3830
supported_version: 2\..*

dd-java-agent/src/main/resources/initializer-rules.btm

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,6 @@
1313
#ENDRULE
1414

1515

16-
# Instrument Cassandra client
17-
# ===========================
18-
RULE Cluster$Manager-init
19-
CLASS com.datastax.driver.core.Cluster$Manager
20-
METHOD <init>
21-
AT EXIT
22-
IF TRUE
23-
DO
24-
com.datadoghq.agent.InstrumentationRulesManager.registerClassLoad($0);
25-
ENDRULE
26-
27-
2816
# Instrument OkHttp
2917
# ===========================
3018
RULE OkHttpClient$Builder-init

dd-java-agent/src/main/resources/integration-rules.btm

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,6 @@ DO
2121
ENDRULE
2222

2323

24-
# Instrument Cassandra client
25-
# ===========================
26-
RULE opentracing-cassandra-driver
27-
CLASS com.datastax.driver.core.Cluster$Manager
28-
METHOD newSession()
29-
HELPER com.datadoghq.agent.integration.CassandraHelper
30-
AT EXIT
31-
IF TRUE
32-
DO
33-
$! = patch($!);
34-
ENDRULE
35-
36-
3724
# Instrument OkHttp
3825
# ===========================
3926
RULE opentracing-okhttp3

settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ include ':dd-trace-annotations'
1515
include ':dd-java-agent:integrations:helpers'
1616
include ':dd-java-agent:integrations:apache-httpclient'
1717
include ':dd-java-agent:integrations:aws-sdk'
18-
include ':dd-java-agent:integrations:cassandra'
18+
include ':dd-java-agent:integrations:datastax-cassandra-3.2'
1919
include ':dd-java-agent:integrations:jms-1'
2020
include ':dd-java-agent:integrations:jms-2'
2121
include ':dd-java-agent:integrations:mongo-3.1'

0 commit comments

Comments
 (0)