Skip to content

Commit 5a6b4e5

Browse files
Merge branch 'master' into alexeyk/test-base-windows
2 parents 292c979 + 0d1c44d commit 5a6b4e5

13 files changed

Lines changed: 298 additions & 3 deletions

File tree

.github/workflows/run-system-tests.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ jobs:
7575
desired_execution_time: 900 # 15 minutes
7676
scenarios_groups: tracer-release
7777
excluded_scenarios: APM_TRACING_E2E_OTEL,APM_TRACING_E2E_SINGLE_SPAN,PROFILING # exclude flaky scenarios
78-
skip_empty_scenarios: true
78+
skip_empty_scenarios: ${{ github.event_name != 'push' && github.event_name != 'schedule' }}
7979
push_to_test_optimization: true
8080
secrets:
8181
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}

communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import datadog.trace.api.telemetry.LogCollector;
2323
import datadog.trace.util.Strings;
2424
import java.nio.ByteBuffer;
25-
import java.security.NoSuchAlgorithmException;
2625
import java.util.HashSet;
2726
import java.util.List;
2827
import java.util.Map;
@@ -311,7 +310,7 @@ private boolean processInfoResponse(State newState, String response) {
311310
}
312311
try {
313312
newState.state = Strings.sha256(response);
314-
} catch (NoSuchAlgorithmException ex) {
313+
} catch (Throwable ex) {
315314
log.debug(
316315
"Failed to hash trace agent /info response. Will probe {}", newState.traceEndpoint, ex);
317316
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ private void populateDefinitionFileNamesMap(Collection<ProbeDefinition> definiti
5959
if (fileName == null) {
6060
continue;
6161
}
62+
fileName = normalizeWindowsToUnixPath(fileName);
6263
Map<String, List<ProbeDefinition>> targetMap =
6364
fileName.indexOf('/') != -1
6465
? definitionsByQualifiedFileNames
@@ -67,6 +68,10 @@ private void populateDefinitionFileNamesMap(Collection<ProbeDefinition> definiti
6768
}
6869
}
6970

71+
private static String normalizeWindowsToUnixPath(String fileName) {
72+
return fileName.replace('\\', '/');
73+
}
74+
7075
private Trie buildDefinitionFileNamesTrie(
7176
Map<String, List<ProbeDefinition>> definitionsByFileNames) {
7277
Trie resultTrie = new Trie();

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,26 @@ public void sourceFileAbsoluteFileName() {
7474
assertEquals(PROBE_ID1, probeDefinitions.get(0).getProbeId());
7575
}
7676

77+
@Test
78+
public void sourceFileWindowsStyleFileName() {
79+
LogProbe probe = createProbe(PROBE_ID1, "src\\main\\java\\java\\lang\\String.java", 23);
80+
TransformerDefinitionMatcher matcher = createMatcher(probe);
81+
List<ProbeDefinition> probeDefinitions = match(matcher, String.class);
82+
assertEquals(1, probeDefinitions.size());
83+
assertEquals(PROBE_ID1, probeDefinitions.get(0).getProbeId());
84+
}
85+
86+
@Test
87+
public void sourceFileWindowsStyleAbsoluteFileName() {
88+
LogProbe probe =
89+
createProbe(
90+
PROBE_ID1, "C:\\Users\\user\\project\\src\\main\\java\\java\\lang\\String.java", 23);
91+
TransformerDefinitionMatcher matcher = createMatcher(probe);
92+
List<ProbeDefinition> probeDefinitions = match(matcher, String.class);
93+
assertEquals(1, probeDefinitions.size());
94+
assertEquals(PROBE_ID1, probeDefinitions.get(0).getProbeId());
95+
}
96+
7797
@Test
7898
public void sourceFileSimpleFileName() {
7999
LogProbe probe = createProbe(PROBE_ID1, "String.java", 23);

dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/ClassLoaderMatchers.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ public static boolean canSkipClassLoaderByName(final ClassLoader loader) {
5454
case "com.alibaba.fastjson.util.ASMClassLoader":
5555
case "datadog.trace.bootstrap.DatadogClassLoader":
5656
case "datadog.trace.bootstrap.InstrumentationClassLoader":
57+
// drools
58+
case "org.drools.core.rule.PackageClassLoader":
59+
case "org.drools.wiring.dynamic.PackageClassLoader":
60+
case "org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader":
5761
return true;
5862
}
5963
if (CHECK_EXCLUDES) {

dd-java-agent/agent-tooling/src/test/groovy/datadog/trace/agent/test/ClassLoaderMatchersTest.groovy

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import datadog.trace.bootstrap.instrumentation.log.LogContextScopeListener
55
import datadog.trace.bootstrap.DatadogClassLoader
66
import datadog.trace.test.util.DDSpecification
77
import groovy.transform.CompileStatic
8+
import net.bytebuddy.ByteBuddy
9+
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy
10+
import spock.lang.Unroll
811

912
class ClassLoaderMatchersTest extends DDSpecification {
1013

@@ -44,6 +47,29 @@ class ClassLoaderMatchersTest extends DDSpecification {
4447
LogContextScopeListener.name == "datadog.trace.bootstrap.instrumentation.log.LogContextScopeListener"
4548
}
4649

50+
@Unroll
51+
def "skips drools classloader: #loaderName"() {
52+
given:
53+
ClassLoader loader = new ByteBuddy()
54+
.subclass(ClassLoader)
55+
.name(loaderName)
56+
.make()
57+
.load(ClassLoader.getSystemClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
58+
.getLoaded()
59+
.getDeclaredConstructor(ClassLoader)
60+
.newInstance(ClassLoader.getSystemClassLoader())
61+
62+
expect:
63+
ClassLoaderMatchers.canSkipClassLoaderByName(loader)
64+
65+
where:
66+
loaderName << [
67+
"org.drools.core.rule.PackageClassLoader",
68+
"org.drools.wiring.dynamic.PackageClassLoader",
69+
"org.drools.core.rule.JavaDialectRuntimeData\$PackageClassLoader"
70+
]
71+
}
72+
4773
/*
4874
* A URLClassloader which only delegates java.* classes
4975
*/
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
apply from: "$rootDir/gradle/java.gradle"
2+
3+
addTestSuiteForDir("latest7Test", "test")
4+
addTestSuiteForDir("latest8Test", "test")
5+
addTestSuiteForDir("latestDepTest", "test")
6+
7+
testJvmConstraints {
8+
}
9+
repositories {
10+
maven {
11+
url = uri("https://repository.jboss.org/nexus/content/repositories/releases/")
12+
}
13+
}
14+
dependencies {
15+
testImplementation project(':dd-java-agent:testing')
16+
testImplementation group: 'org.drools', name: 'drools-compiler', version: '6.0.0.Final'
17+
testImplementation group: 'org.drools', name: 'drools-core', version: '6.0.0.Final'
18+
testImplementation group: 'org.kie', name: 'kie-api', version: '6.0.0.Final'
19+
20+
latest7TestImplementation group: 'org.drools', name: 'drools-compiler', version: '7.+'
21+
latest7TestImplementation group: 'org.drools', name: 'drools-core', version: '7.+'
22+
latest7TestImplementation group: 'org.drools', name: 'drools-mvel', version: '7.+'
23+
latest7TestImplementation group: 'org.kie', name: 'kie-api', version: '7.+'
24+
25+
latest8TestImplementation group: 'org.drools', name: 'drools-compiler', version: '8.+'
26+
latest8TestImplementation group: 'org.drools', name: 'drools-core', version: '8.+'
27+
latest8TestImplementation group: 'org.drools', name: 'drools-mvel', version: '8.+'
28+
latest8TestImplementation group: 'org.kie', name: 'kie-api', version: '8.+'
29+
30+
// for now this is locked to 10.x not to add maintenance burden
31+
latestDepTestImplementation group: 'org.drools', name: 'drools-compiler', version: '10.+'
32+
latestDepTestImplementation group: 'org.drools', name: 'drools-core', version: '10.+'
33+
latestDepTestImplementation group: 'org.drools', name: 'drools-mvel', version: '10.+'
34+
latestDepTestImplementation group: 'org.kie', name: 'kie-api', version: '10.+'
35+
}
36+
37+
configurations.matching { it.name.startsWith('latestDepTest') }.configureEach {
38+
it.resolutionStrategy {
39+
force group: 'org.slf4j', name: 'slf4j-api', version: libs.versions.slf4j.get()
40+
}
41+
}
42+
43+
tasks.named("test") {
44+
testJvmConstraints {
45+
maxJavaVersion = JavaVersion.VERSION_1_8
46+
}
47+
}
48+
49+
tasks.named("latest7Test") {
50+
testJvmConstraints {
51+
maxJavaVersion = JavaVersion.VERSION_11
52+
}
53+
}
54+
55+
tasks.named("latest8Test") {
56+
testJvmConstraints {
57+
minJavaVersion = JavaVersion.VERSION_11
58+
maxJavaVersion = JavaVersion.VERSION_17
59+
}
60+
}
61+
62+
tasks.named("latestDepTest") {
63+
testJvmConstraints {
64+
minJavaVersion = JavaVersion.VERSION_17
65+
}
66+
}
67+
68+
project.afterEvaluate {
69+
tasks.withType(Test).configureEach {
70+
conditionalJvmArgs(
71+
it,
72+
JavaVersion.VERSION_16,
73+
[
74+
"--add-opens=java.base/java.lang.reflect=ALL-UNNAMED",
75+
"--add-opens=java.base/java.text=ALL-UNNAMED",
76+
"--add-opens=java.desktop/java.awt.font=ALL-UNNAMED",
77+
]
78+
)
79+
}
80+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package datadog.trace.instrumentation.drools
2+
3+
import datadog.trace.agent.test.InstrumentationSpecification
4+
import datadog.trace.config.inversion.ConfigHelper
5+
import example.Person
6+
import org.kie.api.KieServices
7+
import org.kie.api.builder.KieFileSystem
8+
import org.kie.api.runtime.KieContainer
9+
import org.kie.api.runtime.KieSession
10+
11+
class DroolsClassLoaderExclusionTest extends InstrumentationSpecification {
12+
static ConfigHelper.StrictnessPolicy strictness
13+
14+
@Override
15+
protected void configurePreAgent() {
16+
// this is required otherwise checks will fail...
17+
strictness = ConfigHelper.get().configInversionStrictFlag()
18+
ConfigHelper.get().setConfigInversionStrict(ConfigHelper.StrictnessPolicy.TEST)
19+
super.configurePreAgent()
20+
}
21+
22+
def cleanup() {
23+
ConfigHelper.get().setConfigInversionStrict(strictness)
24+
}
25+
26+
def "should not instrument drools generated classes"() {
27+
setup:
28+
KieServices ks = KieServices.Factory.get()
29+
30+
KieFileSystem kfs = ks.newKieFileSystem()
31+
32+
kfs.write(
33+
"src/main/resources/example/rules.drl",
34+
ks.getResources().newClassPathResource("example/rules.drl")
35+
)
36+
37+
ks.newKieBuilder(kfs).buildAll()
38+
KieContainer kc = ks.newKieContainer(ks.getRepository().getDefaultReleaseId())
39+
KieSession ksession = kc.newKieSession()
40+
41+
when:
42+
Person john = new Person("John", 20)
43+
Person bob = new Person("Bob", 15)
44+
45+
ksession.insert(john)
46+
ksession.insert(bob)
47+
int fired = ksession.fireAllRules()
48+
49+
then:
50+
fired == 1
51+
!bob.isAdult()
52+
john.isAdult()
53+
54+
and:
55+
// assert we do not transform the generated rule class (RuleInstrumentation would but the classloader should be ignored)
56+
TRANSFORMED_CLASSES_TYPES.findAll { it.getName().startsWith("example.") }.isEmpty()
57+
58+
cleanup:
59+
ksession?.dispose()
60+
}
61+
}
62+
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package example;
2+
3+
public class Person {
4+
private String name;
5+
private int age;
6+
private boolean adult;
7+
8+
public Person() {}
9+
10+
public Person(String name, int age) {
11+
this.name = name;
12+
this.age = age;
13+
this.adult = false;
14+
}
15+
16+
public String getName() {
17+
return name;
18+
}
19+
20+
public void setName(String name) {
21+
this.name = name;
22+
}
23+
24+
public int getAge() {
25+
return age;
26+
}
27+
28+
public void setAge(int age) {
29+
this.age = age;
30+
}
31+
32+
public boolean isAdult() {
33+
return adult;
34+
}
35+
36+
public void setAdult(boolean adult) {
37+
this.adult = adult;
38+
}
39+
40+
@Override
41+
public String toString() {
42+
return "Person{name='" + name + "', age=" + age + ", adult=" + adult + "}";
43+
}
44+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package test;
2+
3+
import net.bytebuddy.asm.Advice;
4+
5+
public class ConstructorAdvice {
6+
@Advice.OnMethodExit(suppress = Throwable.class)
7+
public static void onExit() {}
8+
}

0 commit comments

Comments
 (0)