Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,5 @@ Thumbs.db
dd-java-agent/integrations/*/out
dd-trace-examples/*/out
derby.log

!dd-java-agent/benchmark/releases/*.jar
73 changes: 73 additions & 0 deletions dd-java-agent/benchmark/benchmark.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
plugins {
id "me.champeau.gradle.jmh" version "0.4.4"
}

apply from: "${rootDir}/gradle/java.gradle"

dependencies {
jmh project(':dd-trace-annotations')
jmh group: 'net.bytebuddy', name: 'byte-buddy-agent', version: '1.7.6'

// Add a bunch of dependencies so instrumentation is not disabled.
jmh group: 'javax.jms', name: 'javax.jms-api', version: '2.0.1'
jmh group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
jmh group: 'org.mongodb', name: 'mongo-java-driver', version: '3.4.2'
jmh group: 'org.mongodb', name: 'mongodb-driver-async', version: '3.4.2'
jmh(group: 'com.amazonaws', name: 'aws-java-sdk', version: '1.11.119') {
exclude(module: 'httpclient')
exclude(module: 'jackson-databind')
exclude(module: 'jackson-dataformat-cbor')
}
jmh group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.6.0'
jmh group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.3'
jmh(group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '3.2.0')
}

configurations.testRuntimeClasspath.dependencies.clear()


jmh {
timeUnit = 'us' // Output time unit. Available time units are: [m, s, ms, us, ns].
benchmarkMode = ['thrpt', 'avgt']
// timeOnIteration = '5s'
iterations = 5 // Number of measurement iterations to do.
fork = 1 // How many times to forks a single benchmark. Use 0 to disable forking altogether
// jvmArgs = ["-Dasdf=123"]
// jvmArgs = ["-javaagent:${project(':dd-java-agent').shadowJar.archivePath}"]
failOnError = true // Should JMH fail immediately if any benchmark had experienced the unrecoverable error?
// warmup = '2s' // Time to spend at each warmup iteration.
// warmupIterations = 2 // Number of warmup iterations to do.
// warmupForks = 0 // How many warmup forks to make for a single benchmark. 0 to disable warmup forks.

// profilers = ['stack']
// Use profilers to collect additional data. Supported profilers: [cl, comp, gc, stack, perf, perfnorm, perfasm, xperf, xperfasm, hs_cl, hs_comp, hs_gc, hs_rt, hs_thr]

// humanOutputFile = project.file("${project.buildDir}/reports/jmh/human.txt") // human-readable output file
// operationsPerInvocation = 10 // Operations per invocation.
// synchronizeIterations = false // Synchronize iterations?
timeout = '1s' // Timeout for benchmark iteration.
includeTests = false
// Allows to include test sources into generate JMH jar, i.e. use it when benchmarks depend on the test classes.

duplicateClassesStrategy = 'fail'
jmhVersion = '1.19' // Specifies JMH version
}

// configured as a separate task since the 'jmh' task did not like adding a javaagent argument.
task jmhAgent(type: JavaExec, dependsOn: project.tasks.jmhCompileGeneratedClasses) {
classpath = files(project.jmhCompileGeneratedClasses.destinationDir)
classpath += sourceSets.jmh.runtimeClasspath
main = "org.openjdk.jmh.Main"
args += ["-tu", "us"]
args += ["-bm", "avgt"]
args += ["-prof", "stack"]
// args += ["-r", "5s"]
// args += ["-i", "5"]
args += ["-f", "1"]
args += ["-foe", "true"]
// args += ["-w", "2s"]
// args += ["-wi", "2"]
}

tasks.jmhAgent.dependsOn project(':dd-java-agent').shadowJar

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
package com.datadoghq.benchmark;

import com.datadoghq.trace.Trace;
import java.lang.instrument.Instrumentation;
import java.lang.instrument.UnmodifiableClassException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.file.Paths;
import net.bytebuddy.agent.ByteBuddyAgent;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.TearDown;

public class ClassRetransformingBenchmark {
public static final String BENCHMARK_HOME =
Paths.get(".").toAbsolutePath().normalize().toString();

static {
if (!BENCHMARK_HOME.endsWith("benchmark")) {
throw new IllegalArgumentException("Invalid Home directory: " + BENCHMARK_HOME);
}
}

@State(Scope.Benchmark)
public static class BenchmarkState {
private final Instrumentation inst = ByteBuddyAgent.install();

@Setup
public void initializeInstrumentation() {
try {
final Class<?> manager = Class.forName("com.datadoghq.agent.InstrumentationRulesManager");
final Method registerClassLoad = manager.getMethod("registerClassLoad");
registerClassLoad.invoke(null);
} catch (final Exception e) {
}
}

@TearDown
public void stopAgent() {
try {
final Class<?> gt = Class.forName("io.opentracing.util.GlobalTracer");
final Field tracerField = gt.getDeclaredField("tracer");
tracerField.setAccessible(true);
final Object tracer = tracerField.get(null);
final Method close = tracer.getClass().getMethod("close");
close.invoke(tracer);
} catch (final Exception e) {
}
}
}

@Benchmark
public void testIgnoredRetransform(final BenchmarkState state) throws UnmodifiableClassException {
state.inst.retransformClasses(Object.class);
}

@Benchmark
public void testSimpleRetransform(final BenchmarkState state) throws UnmodifiableClassException {
state.inst.retransformClasses(SimpleClass.class);
}

@Benchmark
public void testDeepRetransform(final BenchmarkState state) throws UnmodifiableClassException {
state.inst.retransformClasses(DeepClass.class);
}

@Fork(jvmArgsAppend = "-javaagent:releases/dd-java-agent-0.2.2.jar")
public static class WithAgent022 extends ClassRetransformingBenchmark {}

@Fork(jvmArgsAppend = "-javaagent:releases/dd-java-agent-0.2.4.jar")
public static class WithAgent024 extends ClassRetransformingBenchmark {}

@Fork(jvmArgsAppend = "-javaagent:releases/dd-java-agent-0.2.6.jar")
public static class WithAgent026 extends ClassRetransformingBenchmark {}

@Fork(jvmArgsAppend = "-javaagent:releases/dd-java-agent-0.2.7.jar")
public static class WithAgent027 extends ClassRetransformingBenchmark {}

@Fork(jvmArgsAppend = "-javaagent:releases/dd-java-agent-0.2.8.jar")
public static class WithAgent028 extends ClassRetransformingBenchmark {}

@Fork(jvmArgsAppend = "-javaagent:releases/dd-java-agent-0.2.9.jar")
public static class WithAgent029 extends ClassRetransformingBenchmark {}

@Fork(jvmArgsAppend = "-javaagent:releases/dd-java-agent-0.2.10.jar")
public static class WithAgent0210 extends ClassRetransformingBenchmark {}

@Fork(jvmArgsAppend = "-javaagent:../build/libs/dd-java-agent.jar")
public static class WithAgent extends ClassRetransformingBenchmark {}

public static class SimpleClass {
@Trace
public void aMethodToTrace() {}
}

public static interface A {
@Trace
void interfaceTrace();
}

public static interface B extends A {
void something();
}

public static interface C extends B {
void somethingElse();
}

public static class DeepClass implements C {

@Override
public void interfaceTrace() {}

@Override
public void something() {}

@Override
public void somethingElse() {}
}
}
1 change: 1 addition & 0 deletions dd-java-agent/benchmark/src/jmh/resources/dd-trace.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
enableCustomAnnotationTracingOver: ["com.datadoghq.benchmark"]
7 changes: 5 additions & 2 deletions gradle/dependencies.gradle
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
def groovyVer = GroovySystem.version
def spockGroovyVer = GroovySystem.version.replaceAll(/\.\d+$/, '')

ext {
version = [
opentracing: '0.30.0',
Expand All @@ -6,8 +9,8 @@ ext {
guava : "21.0",
jackson : "2.8.7",

spock : "1.0-groovy-2.4",
groovy : "2.4.11",
spock : "1.0-groovy-$spockGroovyVer",
groovy : groovyVer,
junit : "4.12",
logback : "1.2.3",
]
Expand Down
1 change: 1 addition & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ rootProject.name = 'dd-trace-java'

include ':dd-trace'
include ':dd-java-agent'
include ':dd-java-agent:benchmark'
include ':dd-java-agent:tooling'
include ':dd-java-agent-ittests'
include ':dd-trace-examples:async-tracing'
Expand Down