Skip to content

Commit 3e11771

Browse files
committed
Merge remote-tracking branch 'origin/master' into PROF-13025
2 parents d9bb39f + 0bf1a9c commit 3e11771

File tree

49 files changed

+7136
-127
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+7136
-127
lines changed

.github/CODEOWNERS

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@
116116
**/DataStreams* @DataDog/data-streams-monitoring
117117

118118
# @DataDog/feature-flagging-and-experimentation-sdk
119-
/products/feature-flagging/ @DataDog/feature-flagging-and-experimentation-sdk
119+
/dd-smoke-tests/openfeature/ @DataDog/feature-flagging-and-experimentation-sdk
120+
/products/feature-flagging/ @DataDog/feature-flagging-and-experimentation-sdk
120121

121122
# @DataDog/profiling-java
122123
/dd-java-agent/agent-profiling/ @DataDog/profiling-java

components/environment/src/main/java/datadog/environment/JavaVirtualMachine.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,12 @@ public static boolean isJ9() {
108108
return SystemProperties.getOrDefault("java.vm.name", "").contains("J9");
109109
}
110110

111+
public static boolean isIbm() {
112+
return runtime.vendor.contains("IBM");
113+
}
114+
111115
public static boolean isIbm8() {
112-
return isJavaVersion(8) && runtime.vendor.contains("IBM");
116+
return isIbm() && isJavaVersion(8);
113117
}
114118

115119
public static boolean isGraalVM() {

components/environment/src/test/java/datadog/environment/JavaVirtualMachineTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ void onlyOnGraalVm() {
113113
@EnabledOnJre(JAVA_8)
114114
void onlyOnIbm8() {
115115
assertFalse(JavaVirtualMachine.isGraalVM());
116+
assertTrue(JavaVirtualMachine.isIbm());
116117
assertTrue(JavaVirtualMachine.isIbm8());
117118
assertTrue(JavaVirtualMachine.isJ9());
118119
assertFalse(JavaVirtualMachine.isOracleJDK8());

dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleVersionScanPlugin.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import de.thetaphi.forbiddenapis.SuppressForbidden;
99
import java.io.IOException;
1010
import java.io.PrintWriter;
11+
import java.lang.reflect.Method;
1112
import java.util.ArrayList;
1213
import java.util.Arrays;
1314
import java.util.HashSet;
@@ -16,6 +17,7 @@
1617
import java.util.Map;
1718
import java.util.ServiceLoader;
1819
import java.util.Set;
20+
import java.util.function.BiConsumer;
1921
import net.bytebuddy.dynamic.ClassFileLocator;
2022

2123
/**
@@ -75,9 +77,9 @@ public static void assertInstrumentationMuzzled(
7577
// verify helper consistency
7678
final String[] helperClassNames = module.helperClassNames();
7779
if (helperClassNames.length > 0) {
78-
HelperClassLoader helperClassLoader = new HelperClassLoader(testApplicationLoader);
80+
BiConsumer<String, byte[]> injectClassHelper = injectClassHelper(testApplicationLoader);
7981
for (Map.Entry<String, byte[]> helper : createHelperMap(module).entrySet()) {
80-
helperClassLoader.injectClass(helper.getKey(), helper.getValue());
82+
injectClassHelper.accept(helper.getKey(), helper.getValue());
8183
}
8284
}
8385
} catch (final Throwable e) {
@@ -90,6 +92,29 @@ public static void assertInstrumentationMuzzled(
9092
}
9193
}
9294

95+
/** Simulates instrumentation-based access to defineClass feature. */
96+
private static BiConsumer<String, byte[]> injectClassHelper(ClassLoader cl) {
97+
try {
98+
Method findLoadedClass = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class);
99+
Method defineClass =
100+
ClassLoader.class.getDeclaredMethod(
101+
"defineClass", String.class, byte[].class, int.class, int.class);
102+
findLoadedClass.setAccessible(true);
103+
defineClass.setAccessible(true);
104+
return (name, bytes) -> {
105+
try {
106+
if (findLoadedClass.invoke(cl, name) == null) {
107+
defineClass.invoke(cl, name, bytes, 0, bytes.length);
108+
}
109+
} catch (ReflectiveOperationException e) {
110+
throw new RuntimeException(e);
111+
}
112+
};
113+
} catch (ReflectiveOperationException e) {
114+
return new HelperClassLoader(cl)::injectClass;
115+
}
116+
}
117+
93118
// build modules to test while single-threaded to match installer assumptions
94119
private static synchronized List<InstrumenterModule> toBeTested(
95120
ClassLoader instrumentationLoader, String muzzleDirective) {
@@ -114,7 +139,9 @@ static final class HelperClassLoader extends ClassLoader {
114139
}
115140

116141
public void injectClass(String name, byte[] bytecode) {
117-
defineClass(name, bytecode, 0, bytecode.length);
142+
if (findLoadedClass(name) == null) {
143+
defineClass(name, bytecode, 0, bytecode.length);
144+
}
118145
}
119146
}
120147

dd-java-agent/instrumentation/jboss/jboss-modules-1.3/build.gradle

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ muzzle {
88

99
apply from: "$rootDir/gradle/java.gradle"
1010

11+
addTestSuite("latestDepTest")
12+
1113
dependencies {
1214
compileOnly group: 'org.jboss.modules', name: 'jboss-modules', version: '1.3.0.Final'
15+
testImplementation group: 'org.jboss.modules', name: 'jboss-modules', version: '1.3.0.Final'
16+
latestDepTestImplementation group: 'org.jboss.modules', name: 'jboss-modules', version: '+'
17+
}
18+
19+
tasks.withType(Test).configureEach {
20+
if (it.javaVersion.isJava9Compatible()) {
21+
jvmArgs +='--add-exports=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED'
22+
}
1323
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import datadog.trace.agent.test.InstrumentationSpecification
2+
import datadog.trace.instrumentation.jbossmodules.ModuleNameHelper
3+
import org.jboss.modules.DependencySpec
4+
import org.jboss.modules.Module
5+
import org.jboss.modules.ModuleSpec
6+
7+
class ModuleNameExtractionTest extends InstrumentationSpecification {
8+
def "should be able to extract a module name"() {
9+
given:
10+
11+
ModuleSpec spec = ModuleSpec.build("dummy")
12+
.addDependency(DependencySpec.createLocalDependencySpec())
13+
.create()
14+
15+
Module module = new Module(spec, Module.getBootModuleLoader())
16+
17+
expect:
18+
module != null
19+
module.getName() == ModuleNameHelper.extractModuleName(module)
20+
}
21+
}

dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleNameHelper.java

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,77 @@
11
package datadog.trace.instrumentation.jbossmodules;
22

3+
import datadog.trace.util.MethodHandles;
4+
import java.lang.invoke.MethodHandle;
35
import java.util.regex.Matcher;
46
import java.util.regex.Pattern;
57
import javax.annotation.Nonnull;
8+
import org.jboss.modules.Module;
69
import org.jboss.modules.ModuleClassLoader;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
712

813
public class ModuleNameHelper {
914
private ModuleNameHelper() {}
1015

16+
private static final Logger LOGGER = LoggerFactory.getLogger(ModuleNameHelper.class);
17+
private static final MethodHandle MODULE_NAME_GETTER = resolveModuleNameGetter();
18+
19+
private static MethodHandle resolveModuleNameGetter() {
20+
final ClassLoader classLoader = ModuleClassLoader.class.getClassLoader();
21+
final MethodHandles methodHandles = new MethodHandles(classLoader);
22+
MethodHandle ret = null;
23+
MethodHandle getModuleIdentifierHandle = null;
24+
try {
25+
// before 2.2
26+
getModuleIdentifierHandle = methodHandles.method(Module.class, "getIdentifier");
27+
if (getModuleIdentifierHandle != null) {
28+
// chains the two method handle calls
29+
ret =
30+
java.lang.invoke.MethodHandles.filterReturnValue(
31+
getModuleIdentifierHandle,
32+
methodHandles.method(
33+
Class.forName("org.jboss.modules.ModuleIdentifier", false, classLoader),
34+
"getName"));
35+
}
36+
} catch (Throwable ignored) {
37+
// here for caution. It's already caught and logged on MethodHandles
38+
}
39+
if (ret == null) {
40+
// 2.2 onward
41+
try {
42+
ret = methodHandles.method(Module.class, "getName");
43+
} catch (Throwable ignored) {
44+
}
45+
}
46+
if (ret == null) {
47+
LOGGER.debug(
48+
"Unable to resolve a method to establish jboss module name. If enabled, jee-split-by-deployment will not work properly");
49+
}
50+
return ret;
51+
}
52+
1153
private static final Pattern SUBDEPLOYMENT_MATCH =
1254
Pattern.compile("deployment(?>.+\\.ear)?\\.(.+)\\.[j|w]ar");
1355

56+
static String extractModuleName(Module module) {
57+
if (MODULE_NAME_GETTER == null) {
58+
return null;
59+
}
60+
String moduleName = null;
61+
try {
62+
moduleName = (String) MODULE_NAME_GETTER.invoke(module);
63+
} catch (Throwable ignored) {
64+
}
65+
return moduleName;
66+
}
67+
1468
public static String extractDeploymentName(@Nonnull final ModuleClassLoader classLoader) {
15-
final Matcher matcher =
16-
SUBDEPLOYMENT_MATCH.matcher(classLoader.getModule().getIdentifier().getName());
69+
70+
final String moduleName = extractModuleName(classLoader.getModule());
71+
if (moduleName == null) {
72+
return null;
73+
}
74+
final Matcher matcher = SUBDEPLOYMENT_MATCH.matcher(moduleName);
1775
if (matcher.matches()) {
1876
return matcher.group(1);
1977
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import datadog.trace.agent.test.InstrumentationSpecification
2+
import datadog.trace.instrumentation.jbossmodules.ModuleNameHelper
3+
import org.jboss.modules.DependencySpec
4+
import org.jboss.modules.Module
5+
import org.jboss.modules.ModuleIdentifier
6+
import org.jboss.modules.ModuleSpec
7+
8+
class ModuleNameExtractionTest extends InstrumentationSpecification {
9+
def "should be able to extract a module name"() {
10+
given:
11+
ModuleIdentifier id = ModuleIdentifier.fromString("dummy")
12+
13+
ModuleSpec spec = ModuleSpec.build(id)
14+
.addDependency(DependencySpec.createLocalDependencySpec())
15+
.create()
16+
17+
Module module = new Module(spec, Module.getBootModuleLoader())
18+
19+
expect:
20+
module != null
21+
module.getIdentifier().getName() == ModuleNameHelper.extractModuleName(module)
22+
}
23+
}

dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/src/main/java/datadog/trace/instrumentation/jetty_client12/FutureResponseListenerInstrumentation.java

Lines changed: 0 additions & 45 deletions
This file was deleted.

dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/src/main/java17/datadog/trace/instrumentation/jetty_client12/LinkListenerAdvice.java

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)