Enable instrumenting old java bytecode

This commit is contained in:
Andrew Kent 2018-03-20 10:35:20 -07:00
parent 0714139b31
commit 123c5beab3
4 changed files with 69 additions and 0 deletions

View File

@ -0,0 +1,26 @@
package datadog.trace.agent.tooling;
import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.asm.TypeConstantAdjustment;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.utility.JavaModule;
public class DDTransformers {
private static final AgentBuilder.Transformer CONSTANT_ADJUSTER =
new AgentBuilder.Transformer() {
@Override
public DynamicType.Builder<?> transform(
DynamicType.Builder<?> builder,
TypeDescription typeDescription,
ClassLoader classLoader,
JavaModule javaModule) {
return builder.visit(TypeConstantAdjustment.INSTANCE);
}
};
public static AgentBuilder.Transformer defaultTransformers() {
return CONSTANT_ADJUSTER;
}
}

View File

@ -0,0 +1,9 @@
import com.ibm.as400.resource.ResourceLevel
import datadog.trace.agent.test.AgentTestRunner
class InstrumentOldBytecode extends AgentTestRunner {
def "can instrument old bytecode"() {
expect:
new ResourceLevel().toString() == "instrumented"
}
}

View File

@ -0,0 +1,31 @@
import static net.bytebuddy.matcher.ElementMatchers.named;
import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.DDAdvice;
import datadog.trace.agent.tooling.DDTransformers;
import datadog.trace.agent.tooling.Instrumenter;
import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.asm.Advice;
@AutoService(Instrumenter.class)
public class IBMResourceLevelInstrumentation extends Instrumenter.Configurable {
public IBMResourceLevelInstrumentation() {
super(IBMResourceLevelInstrumentation.class.getName());
}
@Override
protected AgentBuilder apply(AgentBuilder agentBuilder) {
return agentBuilder
.type(named("com.ibm.as400.resource.ResourceLevel"))
.transform(DDTransformers.defaultTransformers())
.transform(DDAdvice.create().advice(named("toString"), ToStringAdvice.class.getName()))
.asDecorator();
}
public static class ToStringAdvice {
@Advice.OnMethodExit(suppress = Throwable.class)
static void toStringReplace(@Advice.Return(readOnly = false) String ret) {
ret = "instrumented";
}
}
}

View File

@ -10,4 +10,7 @@ dependencies {
compile project(':dd-trace-ot')
compile project(':dd-java-agent:agent-tooling')
// test instrumenting java 1.1 bytecode
testCompile group: 'net.sf.jt400', name: 'jt400', version: '6.1'
}