Skip to content

Commit 817c5ed

Browse files
committed
Applying suggestions and use ClassValue
1 parent 4af59aa commit 817c5ed

File tree

4 files changed

+52
-32
lines changed

4 files changed

+52
-32
lines changed

dd-java-agent/instrumentation/mule-4/build.gradle

+5-1
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,12 @@ dependencies {
139139
compileOnly group: 'org.mule.runtime', name: 'mule-core', version: muleVersion
140140
compileOnly group: 'org.mule.runtime', name: 'mule-tracer-customization-impl', version: muleVersion
141141
compileOnly sourceSets.main_java11.output
142-
testImplementation sourceSets.main_java11.output
143142

143+
main_java11CompileOnly project(':internal-api')
144+
main_java11CompileOnly project(':dd-java-agent:agent-tooling')
145+
main_java11CompileOnly project(':dd-java-agent:agent-bootstrap')
146+
147+
testImplementation sourceSets.main_java11.output
144148
testImplementation project(':dd-java-agent:instrumentation:aws-common')
145149
testImplementation project(':dd-java-agent:instrumentation:reactor-core-3.1')
146150
testImplementation project(':dd-java-agent:instrumentation:reactive-streams')

dd-java-agent/instrumentation/mule-4/src/main/java/datadog/trace/instrumentation/mule4/JpmsMuleInstrumentation.java

+17-16
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@
55
import com.google.auto.service.AutoService;
66
import datadog.trace.agent.tooling.Instrumenter;
77
import datadog.trace.agent.tooling.InstrumenterModule;
8+
import datadog.trace.agent.tooling.muzzle.Reference;
89
import datadog.trace.api.Platform;
9-
import net.bytebuddy.asm.Advice;
10-
import net.bytebuddy.implementation.bytecode.assign.Assigner;
11-
import org.mule.runtime.tracer.api.EventTracer;
1210

1311
@AutoService(InstrumenterModule.class)
1412
public class JpmsMuleInstrumentation extends InstrumenterModule.Tracing
@@ -39,20 +37,23 @@ public String[] helperClassNames() {
3937
}
4038

4139
@Override
42-
public void methodAdvice(MethodTransformer transformer) {
43-
// it does not work with typeInitializer()
44-
transformer.applyAdvice(isConstructor(), getClass().getName() + "$JpmsClearanceAdvice");
40+
public Reference[] additionalMuzzleReferences() {
41+
return new Reference[] {
42+
// added in 4.5.0
43+
new Reference.Builder("org.mule.runtime.tracer.api.EventTracer")
44+
.withMethod(
45+
new String[0],
46+
Reference.EXPECTS_NON_STATIC | Reference.EXPECTS_PUBLIC,
47+
"endCurrentSpan",
48+
"V",
49+
"Lorg/mule/runtime/api/event/Event;")
50+
.build(),
51+
};
4552
}
4653

47-
public static class JpmsClearanceAdvice {
48-
@Advice.OnMethodExit(suppress = Throwable.class)
49-
public static void openOnReturn(@Advice.This(typing = Assigner.Typing.DYNAMIC) Object self) {
50-
JpmsAdvisingHelper.allowAccessOnModuleClass(self.getClass());
51-
}
52-
53-
private static void muzzleCheck(final EventTracer<?> tracer) {
54-
// introduced in 4.5.0
55-
tracer.endCurrentSpan(null);
56-
}
54+
@Override
55+
public void methodAdvice(MethodTransformer transformer) {
56+
// it does not work with typeInitializer()
57+
transformer.applyAdvice(isConstructor(), packageName + ".JpmsClearanceAdvice");
5758
}
5859
}
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,11 @@
11
package datadog.trace.instrumentation.mule4;
22

3-
import java.util.WeakHashMap;
3+
import datadog.trace.api.GenericClassValue;
4+
import java.util.concurrent.atomic.AtomicBoolean;
45

56
public class JpmsAdvisingHelper {
6-
private static final WeakHashMap<Class<?>, Boolean> ALREADY_PROCESSED_CACHE = new WeakHashMap<>();
7-
8-
public static void allowAccessOnModuleClass(final Class<?> cls) {
9-
if (Boolean.TRUE.equals(ALREADY_PROCESSED_CACHE.putIfAbsent(cls, Boolean.TRUE))) {
10-
return;
11-
}
12-
final Module module = cls.getModule();
13-
if (module != null) {
14-
try {
15-
module.addExports(cls.getPackageName(), module.getClassLoader().getUnnamedModule());
16-
} catch (Throwable ignored) {
17-
}
18-
}
19-
}
7+
public static final ClassValue<AtomicBoolean> ALREADY_PROCESSED_CACHE =
8+
GenericClassValue.constructing(AtomicBoolean.class);
209

2110
private JpmsAdvisingHelper() {}
2211
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package datadog.trace.instrumentation.mule4;
2+
3+
import static datadog.trace.instrumentation.mule4.JpmsAdvisingHelper.ALREADY_PROCESSED_CACHE;
4+
5+
import net.bytebuddy.asm.Advice;
6+
import net.bytebuddy.implementation.bytecode.assign.Assigner;
7+
8+
public class JpmsClearanceAdvice {
9+
@Advice.OnMethodExit(suppress = Throwable.class)
10+
public static void openOnReturn(@Advice.This(typing = Assigner.Typing.DYNAMIC) Object self) {
11+
final Class<?> cls = self.getClass();
12+
if (ALREADY_PROCESSED_CACHE.get(cls).compareAndSet(false, true)) {
13+
final Module module = cls.getModule();
14+
if (module != null) {
15+
try {
16+
// This call needs imperatively to be done from the same module we're adding exports
17+
// because the jdk is checking that the caller belongs to the same module.
18+
// The code of this advice is getting inlined into the constructor of the class belonging
19+
// to that package so it will work. Moving the same to a helper won't.
20+
module.addExports(cls.getPackageName(), module.getClassLoader().getUnnamedModule());
21+
} catch (Throwable ignored) {
22+
}
23+
}
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)