Skip to content

Commit b0b5681

Browse files
authored
Merge branch 'master' into cbeauchesne/final_status
2 parents f35fbbd + 93c3816 commit b0b5681

5 files changed

Lines changed: 86 additions & 24 deletions

File tree

.github/CODEOWNERS

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,10 @@
5151
**/InferredProxy*.groovy @DataDog/apm-serverless
5252

5353
# @DataDog/apm-lang-platform-java
54-
/.circleci/ @DataDog/apm-lang-platform-java
5554
/.github/ @DataDog/apm-lang-platform-java
5655
/benchmark/ @DataDog/apm-lang-platform-java
5756
/components/ @DataDog/apm-lang-platform-java
58-
/dd-java-agent/instrumentation/java-*/ @DataDog/apm-lang-platform-java
57+
/dd-java-agent/instrumentation/java/ @DataDog/apm-lang-platform-java
5958
/dd-smoke-tests/concurrent/ @DataDog/apm-lang-platform-java
6059
/dd-smoke-tests/lib-injection/ @DataDog/apm-lang-platform-java
6160
/metadata/ @DataDog/apm-lang-platform-java
@@ -80,7 +79,7 @@
8079
/dd-smoke-tests/iast-propagation/ @DataDog/asm-java
8180
/dd-smoke-tests/iast-util/ @DataDog/asm-java
8281
/dd-smoke-tests/spring-security/ @DataDog/asm-java
83-
/dd-java-agent/instrumentation/commons-fileupload/ @DataDog/asm-java
82+
/dd-java-agent/instrumentation/commons-fileupload-1.5/ @DataDog/asm-java
8483
/dd-java-agent/instrumentation/spring/spring-security/ @DataDog/asm-java
8584
/dd-trace-api/src/main/java/datadog/trace/api/aiguard/ @DataDog/asm-java
8685
/dd-trace-api/src/main/java/datadog/trace/api/EventTracker.java @DataDog/asm-java
@@ -103,12 +102,12 @@
103102
/dd-java-agent/instrumentation/cucumber-5.4/ @DataDog/ci-app-libraries
104103
/dd-java-agent/instrumentation/jacoco-0.8.9/ @DataDog/ci-app-libraries
105104
/dd-java-agent/instrumentation/junit @DataDog/ci-app-libraries
106-
/dd-java-agent/instrumentation/karate/ @DataDog/ci-app-libraries
105+
/dd-java-agent/instrumentation/karate-1.0/ @DataDog/ci-app-libraries
107106
/dd-java-agent/instrumentation/scalatest-3.0.8/ @DataDog/ci-app-libraries
108-
/dd-java-agent/instrumentation/selenium/ @DataDog/ci-app-libraries
107+
/dd-java-agent/instrumentation/selenium-3.13/ @DataDog/ci-app-libraries
109108
/dd-java-agent/instrumentation/testng/ @DataDog/ci-app-libraries
110109
/dd-java-agent/instrumentation/gradle/ @DataDog/ci-app-libraries
111-
/dd-java-agent/instrumentation/gradle-testing/ @DataDog/ci-app-libraries
110+
/dd-java-agent/instrumentation/gradle-testing-5.1/ @DataDog/ci-app-libraries
112111
/dd-java-agent/instrumentation/maven @DataDog/ci-app-libraries
113112
/dd-java-agent/instrumentation/weaver-0.9/ @DataDog/ci-app-libraries
114113
/dd-smoke-tests/gradle/ @DataDog/ci-app-libraries
@@ -130,24 +129,24 @@
130129
/dd-java-agent/instrumentation/spark/ @DataDog/data-jobs-monitoring
131130

132131
# @DataDog/data-streams-monitoring
133-
/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/datastreams @DataDog/data-streams-monitoring
134-
/dd-trace-core/src/main/java/datadog/trace/core/datastreams @DataDog/data-streams-monitoring
135-
/dd-trace-core/src/test/groovy/datadog/trace/core/datastreams @DataDog/data-streams-monitoring
136-
/internal-api/src/main/java/datadog/trace/api/datastreams @DataDog/data-streams-monitoring
137-
/dd-smoke-tests/datastreams/ @DataDog/data-streams-monitoring
138-
/internal-api/src/test/groovy/datadog/trace/api/datastreams @DataDog/data-streams-monitoring
139-
**/datastreams/ @DataDog/data-streams-monitoring
140-
**/DataStreams* @DataDog/data-streams-monitoring
141-
**/dsmTest/** @DataDog/data-streams-monitoring
132+
/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/datastreams @DataDog/data-streams-monitoring
133+
/dd-trace-core/src/main/java/datadog/trace/core/datastreams @DataDog/data-streams-monitoring
134+
/dd-trace-core/src/test/groovy/datadog/trace/core/datastreams @DataDog/data-streams-monitoring
135+
/internal-api/src/main/java/datadog/trace/api/datastreams @DataDog/data-streams-monitoring
136+
/dd-smoke-tests/datastreams/ @DataDog/data-streams-monitoring
137+
/internal-api/src/test/groovy/datadog/trace/api/datastreams @DataDog/data-streams-monitoring
138+
**/datastreams/ @DataDog/data-streams-monitoring
139+
**/DataStreams* @DataDog/data-streams-monitoring
140+
**/dsmTest/** @DataDog/data-streams-monitoring
142141

143142
/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
144-
/dd-java-agent/instrumentation/avro/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
143+
/dd-java-agent/instrumentation/avro-1.11.3/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
145144
/dd-java-agent/instrumentation/aws-java/aws-java-sns-1.0/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
146145
/dd-java-agent/instrumentation/aws-java/aws-java-sns-2.0/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
147146
/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
148147
/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
149148
/dd-java-agent/instrumentation/confluent-schema-registry/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
150-
/dd-java-agent/instrumentation/google-pubsub/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
149+
/dd-java-agent/instrumentation/google-pubsub-1.116/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
151150
/dd-java-agent/instrumentation/grpc-1.5/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
152151
/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
153152
/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/ @DataDog/data-streams-monitoring @DataDog/apm-idm-java
@@ -183,7 +182,8 @@
183182
/dd-trace-core/src/test/groovy/datadog/trace/llmobs/ @DataDog/ml-observability
184183

185184
# @DataDog/database-monitoring
186-
datadog/trace/bootstrap/instrumentation/dbm @DataDog/database-monitoring @DataDog/apm-idm-java
185+
/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/dbm/ @DataDog/database-monitoring @DataDog/apm-idm-java
186+
/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/dbm/ @DataDog/database-monitoring @DataDog/apm-idm-java
187187

188188
# @DataDog/rum
189189
/internal-api/src/main/java/datadog/trace/api/rum/ @DataDog/rum

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,19 @@ public class DebuggerTransformer implements ClassFileTransformer {
9595
SpanProbe.class);
9696
private static final String JAVA_IO_TMPDIR = "java.io.tmpdir";
9797
private static final boolean JAVA_AT_LEAST_19 = JavaVirtualMachine.isJavaVersionAtLeast(19);
98-
9998
public static Path DUMP_PATH = Paths.get(SystemProperties.get(JAVA_IO_TMPDIR), "debugger");
99+
private static final String[] SKIPPED_PACKAGES =
100+
new String[] {
101+
"com/datadog/debugger/agent/",
102+
"com/datadog/debugger/codeorigin/",
103+
"com/datadog/debugger/exception/",
104+
"com/datadog/debugger/instrumentation/",
105+
"com/datadog/debugger/probe/",
106+
"com/datadog/debugger/sink/",
107+
"com/datadog/debugger/symbol/",
108+
"com/datadog/debugger/uploader/",
109+
"com/datadog/debugger/util/"
110+
};
100111

101112
private final Config config;
102113
private final TransformerDefinitionMatcher definitionMatcher;
@@ -331,6 +342,16 @@ private boolean skipInstrumentation(ClassLoader loader, String classFilePath) {
331342
// in case of anonymous classes
332343
return true;
333344
}
345+
if (classFilePath.startsWith("com/datadog/debugger/")) {
346+
// skip classes/packages that are part of debugger agent to avoid
347+
// LinkageError: attempted duplicate class definition
348+
// while retransforming a class used by instrumentation
349+
for (int i = 0; i < SKIPPED_PACKAGES.length; i++) {
350+
if (classFilePath.startsWith(SKIPPED_PACKAGES[i])) {
351+
return true;
352+
}
353+
}
354+
}
334355
return false;
335356
}
336357

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import static utils.InstrumentationTestHelper.compileAndLoadClass;
2525
import static utils.InstrumentationTestHelper.getLineForLineProbe;
2626
import static utils.InstrumentationTestHelper.loadClass;
27+
import static utils.TestClassFileHelper.getClassFileBytes;
2728
import static utils.TestHelper.getFixtureContent;
2829
import static utils.TestHelper.setFieldInConfig;
2930

@@ -32,6 +33,8 @@
3233
import com.datadog.debugger.el.ValueScript;
3334
import com.datadog.debugger.el.values.StringValue;
3435
import com.datadog.debugger.instrumentation.InstrumentationResult;
36+
import com.datadog.debugger.instrumentation.Types;
37+
import com.datadog.debugger.probe.CodeOriginProbe;
3538
import com.datadog.debugger.probe.LogProbe;
3639
import com.datadog.debugger.probe.MetricProbe;
3740
import com.datadog.debugger.probe.SpanDecorationProbe;
@@ -3091,6 +3094,44 @@ public void methodParametersAttributeRecord() throws IOException, URISyntaxExcep
30913094
}
30923095
}
30933096

3097+
/*
3098+
* Regression test for: DatadogClassLoader attempted duplicate class definition for
3099+
* com.datadog.debugger.instrumentation.Types (LinkageError).
3100+
*
3101+
* When a CodeOriginProbe matches the agent's Types class (by FQN or simple name), and Types
3102+
* is being loaded for the first time by DatadogClassLoader, DebuggerTransformer.transform() is
3103+
* invoked as a ClassFileTransformer. Inside performInstrumentation(), CodeOriginInstrumenter
3104+
* accesses the static field Types.DEBUGGER_CONTEXT_TYPE, triggering a re-entrant loadClass()
3105+
* call for Types on the same thread. Because Java's synchronized is reentrant and Types is not
3106+
* yet registered in the JVM (defineClass hasn't completed), findLoadedClass() returns null and
3107+
* defineClass is called a second time, producing the LinkageError.
3108+
*/
3109+
@Test
3110+
public void noInstrumentationForAgentClasses() throws Exception {
3111+
// Install a CodeOriginProbe targeting the agent's Types class by FQN.
3112+
// This simulates a probe accidentally matching an agent class (e.g. via simple-name fallback
3113+
// in TransformerDefinitionMatcher when a user class is also named "Types").
3114+
CodeOriginProbe probe =
3115+
new CodeOriginProbe(
3116+
PROBE_ID,
3117+
true,
3118+
Where.of("com.datadog.debugger.instrumentation.Types", "descriptorToSignature", null));
3119+
installProbes(probe);
3120+
byte[] typeBytes = getClassFileBytes(Types.class);
3121+
// transform() proceeds to performInstrumentation(), which calls
3122+
// CodeOriginInstrumenter.codeOriginCall() → accesses Types.DEBUGGER_CONTEXT_TYPE.
3123+
// In production (when Types is not yet loaded), this re-enters DatadogClassLoader.loadClass()
3124+
// and triggers LinkageError: duplicate class definition for Types.
3125+
byte[] result =
3126+
currentTransformer.transform(
3127+
Types.class.getClassLoader(),
3128+
"com/datadog/debugger/instrumentation/Types",
3129+
null,
3130+
null,
3131+
typeBytes);
3132+
assertNull(result);
3133+
}
3134+
30943135
private TestSnapshotListener setupInstrumentTheWorldTransformer(
30953136
String excludeFileName, String includeFileName) {
30963137
Config config = mock(Config.class);

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerTransformerTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,8 @@ public void classBeingRedefinedNull() {
306306
disabledReason = "Issue with J9: Flaky")
307307
public void classGenerationFailed() {
308308
Config config = createConfig();
309-
final String CLASS_NAME = DebuggerAgent.class.getTypeName();
310-
final String METHOD_NAME = "run";
309+
final String CLASS_NAME = ArrayList.class.getTypeName();
310+
final String METHOD_NAME = "add";
311311
MockProbe mockProbe = MockProbe.builder(PROBE_ID).where(CLASS_NAME, METHOD_NAME).build();
312312
LogProbe logProbe1 =
313313
LogProbe.builder().probeId("logprobe1", 0).where(CLASS_NAME, METHOD_NAME).build();
@@ -332,10 +332,10 @@ public void classGenerationFailed() {
332332
byte[] newClassBuffer =
333333
debuggerTransformer.transform(
334334
ClassLoader.getSystemClassLoader(),
335-
"com/datadog/debugger/agent/DebuggerAgent",
335+
"java/util/ArrayList",
336336
null,
337337
null,
338-
getClassFileBytes(DebuggerAgent.class));
338+
getClassFileBytes(ArrayList.class));
339339
assertNull(newClassBuffer);
340340
ArgumentCaptor<String> strCaptor = ArgumentCaptor.forClass(String.class);
341341
ArgumentCaptor<ProbeId> probeIdCaptor = ArgumentCaptor.forClass(ProbeId.class);

utils/config-utils/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ val excludedClassesInstructionCoverage by extra(
5656
dependencies {
5757
implementation(project(":components:environment"))
5858
implementation(project(":dd-trace-api"))
59-
implementation(project(":utils:filesystem-utils"))
59+
api(project(":utils:filesystem-utils"))
6060
implementation(libs.slf4j)
6161
implementation("org.snakeyaml", "snakeyaml-engine", "2.9")
6262

0 commit comments

Comments
 (0)