Skip to content

Commit 4eda0a1

Browse files
authored
Ensure compatibility with jboss modules 2.2 (#10111)
* Ensure compatibility with jboss modules 2.2 * Add condition of jigsaw options
1 parent 85ac4c8 commit 4eda0a1

File tree

4 files changed

+114
-2
lines changed

4 files changed

+114
-2
lines changed

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+
}

0 commit comments

Comments
 (0)