Skip to content

Commit 67c6bbe

Browse files
Merge branch 'master' into alexeyk/fixed-infinite-loop
2 parents 591885d + 08d4d6a commit 67c6bbe

8 files changed

Lines changed: 106 additions & 50 deletions

File tree

.gitlab/ci_visibility_generate_job.sh

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,19 @@ if [ -z "$pr_number" ]; then
4242
exit 0
4343
fi
4444

45-
echo "PR #${pr_number} found, checking labels..."
45+
echo "PR #${pr_number} found, checking target branch..."
46+
set +e
47+
base_branch=$(gh pr view "$pr_number" --repo DataDog/dd-trace-java --json baseRefName --jq '.baseRefName' 2>&1)
48+
base_branch_status=$?
49+
set -e
50+
51+
if [ $base_branch_status -eq 0 ] && [[ "$base_branch" == release/* ]]; then
52+
echo "PR #$pr_number targets release branch '$base_branch' - skipping trigger"
53+
add_dummy_job
54+
exit 0
55+
fi
56+
57+
echo "Checking labels..."
4658
set +e
4759
labels=$(gh pr view "$pr_number" --repo DataDog/dd-trace-java --json labels --jq '.labels[].name' 2>&1)
4860
labels_status=$?

buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/TypeResolverPoolTest.java

Lines changed: 9 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,86 +11,57 @@
1111

1212
class TypeResolverPoolTest {
1313

14+
TypeResolverPool resolver = new TypeResolverPool();
15+
1416
@Test
1517
void testResolvePrimitive() {
16-
TypeResolverPool resolver = new TypeResolverPool();
17-
18-
Class<?> result = resolver.resolveType(Type.INT_TYPE);
19-
20-
assertEquals(int.class, result);
18+
assertEquals(int.class, resolver.resolveType(Type.INT_TYPE));
2119
}
2220

2321
@Test
2422
void testResolvePrimitiveArray() {
25-
TypeResolverPool resolver = new TypeResolverPool();
2623
Type type = Type.getType("[I");
27-
28-
Class<?> result = resolver.resolveType(type);
29-
30-
assertEquals(int[].class, result);
24+
assertEquals(int[].class, resolver.resolveType(type));
3125
}
3226

3327
@Test
3428
void testResolvePrimitiveMultidimensionalArray() {
35-
TypeResolverPool resolver = new TypeResolverPool();
3629
Type type = Type.getType("[[[I");
37-
38-
Class<?> result = resolver.resolveType(type);
39-
40-
assertEquals(int[][][].class, result);
30+
assertEquals(int[][][].class, resolver.resolveType(type));
4131
}
4232

4333
@Test
4434
void testResolveClass() {
45-
TypeResolverPool resolver = new TypeResolverPool();
4635
Type type = Type.getType(String.class);
47-
48-
Class<?> result = resolver.resolveType(type);
49-
50-
assertEquals(String.class, result);
36+
assertEquals(String.class, resolver.resolveType(type));
5137
}
5238

5339
@Test
5440
void testResolveClassArray() {
55-
TypeResolverPool resolver = new TypeResolverPool();
5641
Type type = Type.getType(String[].class);
57-
58-
Class<?> result = resolver.resolveType(type);
59-
60-
assertEquals(String[].class, result);
42+
assertEquals(String[].class, resolver.resolveType(type));
6143
}
6244

6345
@Test
6446
void testResolveClassMultidimensionalArray() {
65-
TypeResolverPool resolver = new TypeResolverPool();
6647
Type type = Type.getType(String[][][].class);
67-
68-
Class<?> result = resolver.resolveType(type);
69-
70-
assertEquals(String[][][].class, result);
48+
assertEquals(String[][][].class, resolver.resolveType(type));
7149
}
7250

7351
@Test
7452
void testTypeResolverFromMethod() {
75-
TypeResolverPool resolver = new TypeResolverPool();
7653
Type type =
7754
Type.getMethodType(
7855
Type.getType(String[].class), Type.getType(String.class), Type.getType(String.class));
79-
80-
Class<?> result = resolver.resolveType(type.getReturnType());
81-
82-
assertEquals(String[].class, result);
56+
assertEquals(String[].class, resolver.resolveType(type.getReturnType()));
8357
}
8458

8559
@Test
8660
void testInheritedMethods() throws Exception {
87-
TypeResolverPool resolver = new TypeResolverPool();
8861
Type owner = Type.getType(HttpServletRequest.class);
8962
String name = "getParameter";
9063
Type descriptor = Type.getMethodType(Type.getType(String.class), Type.getType(String.class));
91-
9264
Method result = (Method) resolver.resolveMethod(new MethodType(owner, name, descriptor));
93-
9465
assertEquals(ServletRequest.class.getDeclaredMethod("getParameter", String.class), result);
9566
}
9667
}

buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/ext/IastExtensionTest.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import datadog.trace.plugin.csi.impl.assertion.CallSiteAssert;
2323
import datadog.trace.plugin.csi.impl.ext.tests.IastExtensionCallSite;
2424
import java.io.File;
25+
import java.io.IOException;
2526
import java.lang.reflect.Method;
2627
import java.nio.file.Files;
2728
import java.nio.file.Path;
@@ -46,12 +47,15 @@ class IastExtensionTest extends BaseCsiPluginTest {
4647

4748
@BeforeEach
4849
void setup() throws Exception {
49-
targetFolder = buildDir.toPath().resolve("target");
50-
Files.createDirectories(targetFolder);
51-
projectFolder = buildDir.toPath().resolve("project");
52-
Files.createDirectories(projectFolder);
53-
srcFolder = projectFolder.resolve("src/main/java");
54-
Files.createDirectories(srcFolder);
50+
targetFolder = createFolder("target");
51+
projectFolder = createFolder("project");
52+
srcFolder = createFolder("src/main/java");
53+
}
54+
55+
private Path createFolder(String folderName) throws IOException {
56+
Path folder = buildDir.toPath().resolve(folderName);
57+
Files.createDirectories(folder);
58+
return folder;
5559
}
5660

5761
@ParameterizedTest

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/SpringHelper.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,50 @@
11
package com.datadog.debugger.util;
22

33
import java.lang.instrument.Instrumentation;
4+
import java.lang.reflect.Method;
5+
import java.util.regex.Matcher;
6+
import java.util.regex.Pattern;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
49

510
public class SpringHelper {
11+
private static final Logger LOGGER = LoggerFactory.getLogger(SpringHelper.class);
612

713
public static boolean isSpringUsingOnlyMethodParameters(Instrumentation inst) {
14+
try {
15+
return isSpringUsingOnlyMethodParametersSpringVersion(inst);
16+
} catch (Exception e) {
17+
LOGGER.debug("isSpringUsingOnlyMethodParameters failed for SpringVersion", e);
18+
// fallback to lookup for specific class
19+
return isSpringUsingOnlyMethodParametersSpecificClass(inst);
20+
}
21+
}
22+
23+
private static boolean isSpringUsingOnlyMethodParametersSpringVersion(Instrumentation inst) {
24+
try {
25+
// scan for getting an already loaded class and get the classloader
26+
ClassLoader springClassLoader = null;
27+
for (Class<?> clazz : inst.getAllLoadedClasses()) {
28+
if (clazz.getName().startsWith("org.springframework.core")) {
29+
springClassLoader = clazz.getClassLoader();
30+
}
31+
}
32+
if (springClassLoader == null) {
33+
throw new IllegalStateException("Cannot find Spring classloader");
34+
}
35+
Class<?> springVersionClass =
36+
Class.forName("org.springframework.core.SpringVersion", true, springClassLoader);
37+
Method m = springVersionClass.getDeclaredMethod("getVersion");
38+
String version = (String) m.invoke(null);
39+
ParsedSpringVersion springVersion = new ParsedSpringVersion(version);
40+
// if Spring version is 6.1+ only using MethodParameters
41+
return springVersion.major > 6 || (springVersion.major == 6 && springVersion.minor >= 1);
42+
} catch (Exception e) {
43+
throw new RuntimeException(e);
44+
}
45+
}
46+
47+
private static boolean isSpringUsingOnlyMethodParametersSpecificClass(Instrumentation inst) {
848
for (Class<?> clazz : inst.getAllLoadedClasses()) {
949
if ("org.springframework.web.client.RestClient".equals(clazz.getName())) {
1050
// If this class (coming from Spring web since version 6.1) is found loaded it means Spring
@@ -15,4 +55,23 @@ public static boolean isSpringUsingOnlyMethodParameters(Instrumentation inst) {
1555
// class not found, probably no Spring
1656
return false;
1757
}
58+
59+
private static class ParsedSpringVersion {
60+
private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)");
61+
62+
final int major;
63+
final int minor;
64+
final int patch;
65+
66+
public ParsedSpringVersion(String strVersion) {
67+
Matcher matcher = VERSION_PATTERN.matcher(strVersion);
68+
if (matcher.find()) {
69+
major = Integer.parseInt(matcher.group(1));
70+
minor = Integer.parseInt(matcher.group(2));
71+
patch = Integer.parseInt(matcher.group(3));
72+
} else {
73+
throw new IllegalArgumentException("Cannot parse SpringVersion: " + strVersion);
74+
}
75+
}
76+
}
1877
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,7 @@ public void methodParametersAttribute() throws Exception {
639639
Class<?> testClass = loadClass(CLASS_NAME, buffers);
640640
if (JavaVirtualMachine.isJavaVersion(17)) {
641641
// on JDK 17 introduced Spring6 class
642-
Class<?> springClass = Class.forName("org.springframework.web.client.RestClient");
642+
Class<?> springClass = Class.forName("org.springframework.core.SpringVersion");
643643
when(inst.getAllLoadedClasses()).thenReturn(new Class[] {testClass, springClass});
644644
} else {
645645
when(inst.getAllLoadedClasses()).thenReturn(new Class[] {testClass});

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/SpringHelperTest.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,24 @@ class SpringHelperTest {
1313

1414
@Test
1515
@EnabledForJreRange(min = JRE.JAVA_17)
16-
void isSpringUsingOnlyMethodParametersTrue() throws Exception {
16+
void isSpringUsingOnlyMethodParametersTrueSpringVersion() throws Exception {
17+
Class<?> clazz = Class.forName("org.springframework.core.SpringVersion");
18+
Instrumentation inst = mock(Instrumentation.class);
19+
when(inst.getAllLoadedClasses()).thenReturn(new Class[] {clazz});
20+
assertTrue(SpringHelper.isSpringUsingOnlyMethodParameters(inst));
21+
}
22+
23+
@Test
24+
@EnabledForJreRange(min = JRE.JAVA_17)
25+
void isSpringUsingOnlyMethodParametersTrueFallback() throws Exception {
1726
Class<?> clazz = Class.forName("org.springframework.web.client.RestClient");
1827
Instrumentation inst = mock(Instrumentation.class);
1928
when(inst.getAllLoadedClasses()).thenReturn(new Class[] {clazz});
2029
assertTrue(SpringHelper.isSpringUsingOnlyMethodParameters(inst));
2130
}
2231

2332
@Test
24-
void isSpringUsingOnlyMethodParametersFalse() throws Exception {
33+
void isSpringUsingOnlyMethodParametersFalseFallback() throws Exception {
2534
Instrumentation inst = mock(Instrumentation.class);
2635
when(inst.getAllLoadedClasses()).thenReturn(new Class[0]);
2736
assertFalse(SpringHelper.isSpringUsingOnlyMethodParameters(inst));

dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/AbstractDatadogSparkListener.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,11 +329,12 @@ public synchronized void finishApplication(
329329
}
330330
applicationEnded = true;
331331

332-
if (applicationSpan == null && jobCount > 0) {
332+
if ((applicationSpan == null && jobCount > 0) || isRunningOnDatabricks) {
333333
// If the application span is not initialized, but spark jobs have been executed, all those
334334
// spark jobs were databricks or streaming. In this case we don't send the application span
335335
return;
336336
}
337+
337338
initApplicationSpanIfNotInitialized();
338339

339340
if (throwable != null) {

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ forbiddenapis = "3.10"
77
spotbugs_annotations = "4.9.8"
88

99
# DataDog libs and forks
10-
ddprof = "1.37.0"
10+
ddprof = "1.38.0"
1111
dogstatsd = "4.4.3"
1212
okhttp = "3.12.15" # Datadog fork to support Java 7
1313

0 commit comments

Comments
 (0)