Skip to content

Commit 73d15fc

Browse files
Fix instrumentation to work when org.gradle.jvmargs is specified either in the file or via command line
1 parent 0bff977 commit 73d15fc

3 files changed

Lines changed: 96 additions & 63 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package datadog.trace.instrumentation.gradle;
2+
3+
import datadog.trace.api.Config;
4+
import java.io.File;
5+
import java.nio.file.Path;
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
import java.util.Properties;
9+
10+
public class GradleDaemonInjectionUtils {
11+
12+
public static Map<String, String> addJavaagentToGradleDaemonProperties(
13+
Map<String, String> jvmOptions) {
14+
File agentJar = Config.get().getCiVisibilityAgentJarFile();
15+
Path agentJarPath = agentJar.toPath();
16+
17+
StringBuilder agentArg = new StringBuilder("-javaagent:").append(agentJarPath).append('=');
18+
19+
Properties systemProperties = System.getProperties();
20+
for (Map.Entry<Object, Object> e : systemProperties.entrySet()) {
21+
String propertyName = (String) e.getKey();
22+
Object propertyValue = e.getValue();
23+
if (propertyName.startsWith(Config.PREFIX)) {
24+
agentArg.append(propertyName).append('=').append(propertyValue).append(',');
25+
}
26+
}
27+
28+
// creating a new map in case jvmOptions is immutable
29+
Map<String, String> updatedJvmOptions = new HashMap<>(jvmOptions);
30+
updatedJvmOptions.merge("org.gradle.jvmargs", agentArg.toString(), (o, n) -> o + " " + n);
31+
return updatedJvmOptions;
32+
}
33+
}

dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonJvmOptionsInstrumentation.java

Lines changed: 0 additions & 63 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package datadog.trace.instrumentation.gradle;
2+
3+
import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.implementsInterface;
4+
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
5+
6+
import com.google.auto.service.AutoService;
7+
import datadog.trace.agent.tooling.Instrumenter;
8+
import datadog.trace.agent.tooling.InstrumenterModule;
9+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
10+
import java.util.Map;
11+
import net.bytebuddy.asm.Advice;
12+
import net.bytebuddy.description.type.TypeDescription;
13+
import net.bytebuddy.matcher.ElementMatcher;
14+
15+
/**
16+
* This instrumentation targets Gradle Launcher, which is the process that is started with
17+
* `gradle`/`gradlew` commands. The launcher starts Gradle Daemon (if not started yet), which is a
18+
* long-lived process that actually runs builds. The instrumentation injects the tracer and its
19+
* config properties into Gradle Daemon JVM settings when the daemon is started.
20+
*/
21+
@AutoService(InstrumenterModule.class)
22+
public class GradleLauncherInstrumentation extends InstrumenterModule.CiVisibility
23+
implements Instrumenter.ForTypeHierarchy {
24+
25+
public GradleLauncherInstrumentation() {
26+
super("gradle", "gradle-daemon-jvm-options");
27+
}
28+
29+
@Override
30+
public String hierarchyMarkerType() {
31+
return "org.gradle.launcher.configuration.AllProperties";
32+
}
33+
34+
@Override
35+
public ElementMatcher<TypeDescription> hierarchyMatcher() {
36+
return implementsInterface(named(hierarchyMarkerType()));
37+
}
38+
39+
@Override
40+
public void methodAdvice(MethodTransformer transformer) {
41+
transformer.applyAdvice(
42+
named("getProperties"),
43+
GradleLauncherInstrumentation.class.getName() + "$PropertiesAugmentationAdvice");
44+
}
45+
46+
@Override
47+
public String[] helperClassNames() {
48+
return new String[] {
49+
packageName + ".GradleDaemonInjectionUtils",
50+
};
51+
}
52+
53+
@SuppressFBWarnings(
54+
value = "UC_USELESS_OBJECT",
55+
justification = "jvmOptions is the return value of the original method")
56+
public static class PropertiesAugmentationAdvice {
57+
@Advice.OnMethodExit(suppress = Throwable.class)
58+
public static void addJavaagentToGradleDaemonProperties(
59+
@Advice.Return(readOnly = false) Map<String, String> jvmOptions) {
60+
jvmOptions = GradleDaemonInjectionUtils.addJavaagentToGradleDaemonProperties(jvmOptions);
61+
}
62+
}
63+
}

0 commit comments

Comments
 (0)