Convert datastax cassandra instrumentation to bytebuddy
This commit is contained in:
parent
54a830ba9e
commit
7298b0a31a
|
@ -24,6 +24,9 @@ dependencies {
|
||||||
compile(project(':dd-java-agent:integrations:aws-sdk')) {
|
compile(project(':dd-java-agent:integrations:aws-sdk')) {
|
||||||
transitive = false
|
transitive = false
|
||||||
}
|
}
|
||||||
|
compile(project(':dd-java-agent:integrations:datastax-cassandra-3.2')) {
|
||||||
|
transitive = false
|
||||||
|
}
|
||||||
compile(project(':dd-java-agent:integrations:jms-1')) {
|
compile(project(':dd-java-agent:integrations:jms-1')) {
|
||||||
transitive = false
|
transitive = false
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
apply plugin: 'version-scan'
|
|
||||||
|
|
||||||
versionScan {
|
|
||||||
group = "com.datastax.cassandra"
|
|
||||||
module = "cassandra-driver-core"
|
|
||||||
versions = "[3.2,)"
|
|
||||||
verifyPresent = [
|
|
||||||
"com.datastax.driver.core.utils.MoreObjects" : null,
|
|
||||||
"com.datastax.driver.core.RemoteEndpointAwareNettySSLOptions": null,
|
|
||||||
"com.datastax.driver.core.GuavaCompatibility" : null,
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
// TODO: VersionScan plugin does not report which version failed, which is making it hard to get meaningful results out of this block.
|
||||||
|
// Once versionScan can report on which version failed, this can be enabled.
|
||||||
|
// The desire is to apply the instrumentation to cassandra-datastax 2.3 and beyond.
|
||||||
|
// apply plugin: 'version-scan'
|
||||||
|
|
||||||
|
// versionScan {
|
||||||
|
// group = "com.datastax.cassandra"
|
||||||
|
// module = "cassandra-driver-core"
|
||||||
|
// versions = "[3.2.0,)"
|
||||||
|
// verifyPresent = [
|
||||||
|
// // class we're advising
|
||||||
|
// 'com.datastax.driver.core.Cluster$Manager': null,
|
||||||
|
// // used by TracingSession
|
||||||
|
// 'com.datastax.driver.core.BoundStatement' : null,
|
||||||
|
// 'com.datastax.driver.core.BoundStatement' : null,
|
||||||
|
// 'com.datastax.driver.core.CloseFuture' : null,
|
||||||
|
// 'com.datastax.driver.core.Cluster' : null,
|
||||||
|
// 'com.datastax.driver.core.Host' : null,
|
||||||
|
// 'com.datastax.driver.core.PreparedStatement' : null,
|
||||||
|
// 'com.datastax.driver.core.RegularStatement' : null,
|
||||||
|
// 'com.datastax.driver.core.ResultSet' : null,
|
||||||
|
// 'com.datastax.driver.core.ResultSetFuture' : null,
|
||||||
|
// 'com.datastax.driver.core.Session' : null,
|
||||||
|
// 'com.datastax.driver.core.Statement' : null,
|
||||||
|
// 'com.google.common.base.Function' : null,
|
||||||
|
// 'com.google.common.util.concurrent.Futures' : null,
|
||||||
|
// 'com.google.common.util.concurrent.ListenableFuture' : null
|
||||||
|
// ]
|
||||||
|
// }
|
||||||
|
|
||||||
|
apply from: "${rootDir}/gradle/java.gradle"
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '3.2.0'
|
||||||
|
|
||||||
|
compile project(':dd-trace')
|
||||||
|
// include helpers to pick up opentracing-cassandra-driver helper
|
||||||
|
compile project(':dd-java-agent:integrations:helpers')
|
||||||
|
compile project(':dd-java-agent:tooling')
|
||||||
|
|
||||||
|
compile deps.bytebuddy
|
||||||
|
compile deps.opentracing
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
package dd.inst.datastax.cassandra;
|
||||||
|
|
||||||
|
import static dd.trace.ExceptionHandlers.defaultExceptionHandler;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.*;
|
||||||
|
|
||||||
|
import com.datastax.driver.core.Session;
|
||||||
|
import com.google.auto.service.AutoService;
|
||||||
|
import dd.trace.Instrumenter;
|
||||||
|
import io.opentracing.Tracer;
|
||||||
|
import io.opentracing.util.GlobalTracer;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import net.bytebuddy.agent.builder.AgentBuilder;
|
||||||
|
import net.bytebuddy.asm.Advice;
|
||||||
|
|
||||||
|
@AutoService(Instrumenter.class)
|
||||||
|
public class CassandraClientInstrumentation implements Instrumenter {
|
||||||
|
@Override
|
||||||
|
public AgentBuilder instrument(AgentBuilder agentBuilder) {
|
||||||
|
return agentBuilder
|
||||||
|
.type(named("com.datastax.driver.core.Cluster$Manager"))
|
||||||
|
.transform(
|
||||||
|
new AgentBuilder.Transformer.ForAdvice()
|
||||||
|
.advice(
|
||||||
|
isMethod().and(isPrivate()).and(named("newSession")).and(takesArguments(0)),
|
||||||
|
CassandraClientAdvice.class.getName())
|
||||||
|
.withExceptionHandler(defaultExceptionHandler()))
|
||||||
|
.asDecorator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class CassandraClientAdvice {
|
||||||
|
/**
|
||||||
|
* Strategy: each time we build a connection to a Cassandra cluster, the
|
||||||
|
* com.datastax.driver.core.Cluster$Manager.newSession() method is called. The opentracing
|
||||||
|
* contribution is a simple wrapper, so we just have to wrap the new session.
|
||||||
|
*
|
||||||
|
* @param session The fresh session to patch
|
||||||
|
* @return A new tracing session
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@Advice.OnMethodExit(suppress = Throwable.class)
|
||||||
|
public static void injectTracingSession(@Advice.Return(readOnly = false) Session session)
|
||||||
|
throws Exception {
|
||||||
|
if (session.getClass().getName().endsWith("contrib.cassandra.TracingSession")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Class<?> clazz = Class.forName("io.opentracing.contrib.cassandra.TracingSession");
|
||||||
|
Constructor<?> constructor = clazz.getDeclaredConstructor(Session.class, Tracer.class);
|
||||||
|
constructor.setAccessible(true);
|
||||||
|
session = (Session) constructor.newInstance(session, GlobalTracer.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,43 +0,0 @@
|
||||||
package com.datadoghq.agent.integration;
|
|
||||||
|
|
||||||
import com.datastax.driver.core.Session;
|
|
||||||
import io.opentracing.Tracer;
|
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
import org.jboss.byteman.rule.Rule;
|
|
||||||
|
|
||||||
/** Patch each new sessions created when trying to connect to a Cassandra cluster. */
|
|
||||||
public class CassandraHelper extends DDAgentTracingHelper<Session> {
|
|
||||||
|
|
||||||
protected CassandraHelper(Rule rule) {
|
|
||||||
super(rule);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Session patch(Session session) {
|
|
||||||
return super.patch(session);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Strategy: each time we build a connection to a Cassandra cluster, the
|
|
||||||
* com.datastax.driver.core.Cluster$Manager.newSession() method is called. The opentracing
|
|
||||||
* contribution is a simple wrapper, so we just have to wrap the new session.
|
|
||||||
*
|
|
||||||
* @param session The fresh session to patch
|
|
||||||
* @return A new tracing session
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
protected Session doPatch(Session session) throws Exception {
|
|
||||||
|
|
||||||
if ("io.opentracing.contrib.cassandra.TracingSession"
|
|
||||||
.equals(session.getClass().getCanonicalName())) {
|
|
||||||
return session;
|
|
||||||
}
|
|
||||||
|
|
||||||
Class<?> clazz = Class.forName("io.opentracing.contrib.cassandra.TracingSession");
|
|
||||||
Constructor<?> constructor = clazz.getDeclaredConstructor(Session.class, Tracer.class);
|
|
||||||
constructor.setAccessible(true);
|
|
||||||
Session newSession = (Session) constructor.newInstance(session, tracer);
|
|
||||||
|
|
||||||
return newSession;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -25,14 +25,6 @@ opentracing-aws-sdk:
|
||||||
com.amazonaws.http.apache.utils.ApacheUtils:
|
com.amazonaws.http.apache.utils.ApacheUtils:
|
||||||
com.amazonaws.http.request.HttpRequestFactory:
|
com.amazonaws.http.request.HttpRequestFactory:
|
||||||
|
|
||||||
opentracing-cassandra-driver:
|
|
||||||
- artifact: cassandra-driver-core
|
|
||||||
supported_version: 3\.2.*
|
|
||||||
identifying_present_classes:
|
|
||||||
com.datastax.driver.core.utils.MoreObjects:
|
|
||||||
com.datastax.driver.core.RemoteEndpointAwareNettySSLOptions:
|
|
||||||
com.datastax.driver.core.GuavaCompatibility:
|
|
||||||
|
|
||||||
opentracing-jms-2_producer:
|
opentracing-jms-2_producer:
|
||||||
- artifact: javax.jms-api
|
- artifact: javax.jms-api
|
||||||
supported_version: 2\..*
|
supported_version: 2\..*
|
||||||
|
|
|
@ -13,18 +13,6 @@
|
||||||
#ENDRULE
|
#ENDRULE
|
||||||
|
|
||||||
|
|
||||||
# Instrument Cassandra client
|
|
||||||
# ===========================
|
|
||||||
RULE Cluster$Manager-init
|
|
||||||
CLASS com.datastax.driver.core.Cluster$Manager
|
|
||||||
METHOD <init>
|
|
||||||
AT EXIT
|
|
||||||
IF TRUE
|
|
||||||
DO
|
|
||||||
com.datadoghq.agent.InstrumentationRulesManager.registerClassLoad($0);
|
|
||||||
ENDRULE
|
|
||||||
|
|
||||||
|
|
||||||
# Instrument OkHttp
|
# Instrument OkHttp
|
||||||
# ===========================
|
# ===========================
|
||||||
RULE OkHttpClient$Builder-init
|
RULE OkHttpClient$Builder-init
|
||||||
|
|
|
@ -21,19 +21,6 @@ DO
|
||||||
ENDRULE
|
ENDRULE
|
||||||
|
|
||||||
|
|
||||||
# Instrument Cassandra client
|
|
||||||
# ===========================
|
|
||||||
RULE opentracing-cassandra-driver
|
|
||||||
CLASS com.datastax.driver.core.Cluster$Manager
|
|
||||||
METHOD newSession()
|
|
||||||
HELPER com.datadoghq.agent.integration.CassandraHelper
|
|
||||||
AT EXIT
|
|
||||||
IF TRUE
|
|
||||||
DO
|
|
||||||
$! = patch($!);
|
|
||||||
ENDRULE
|
|
||||||
|
|
||||||
|
|
||||||
# Instrument OkHttp
|
# Instrument OkHttp
|
||||||
# ===========================
|
# ===========================
|
||||||
RULE opentracing-okhttp3
|
RULE opentracing-okhttp3
|
||||||
|
|
|
@ -15,7 +15,7 @@ include ':dd-trace-annotations'
|
||||||
include ':dd-java-agent:integrations:helpers'
|
include ':dd-java-agent:integrations:helpers'
|
||||||
include ':dd-java-agent:integrations:apache-httpclient'
|
include ':dd-java-agent:integrations:apache-httpclient'
|
||||||
include ':dd-java-agent:integrations:aws-sdk'
|
include ':dd-java-agent:integrations:aws-sdk'
|
||||||
include ':dd-java-agent:integrations:cassandra'
|
include ':dd-java-agent:integrations:datastax-cassandra-3.2'
|
||||||
include ':dd-java-agent:integrations:jms-1'
|
include ':dd-java-agent:integrations:jms-1'
|
||||||
include ':dd-java-agent:integrations:jms-2'
|
include ':dd-java-agent:integrations:jms-2'
|
||||||
include ':dd-java-agent:integrations:mongo-3.1'
|
include ':dd-java-agent:integrations:mongo-3.1'
|
||||||
|
|
Loading…
Reference in New Issue