diff --git a/dd-java-agent/instrumentation/mule-4/build.gradle b/dd-java-agent/instrumentation/mule-4/build.gradle index 5f347448893a..f40024c4fc1b 100644 --- a/dd-java-agent/instrumentation/mule-4/build.gradle +++ b/dd-java-agent/instrumentation/mule-4/build.gradle @@ -139,8 +139,13 @@ dependencies { compileOnly group: 'org.mule.runtime', name: 'mule-core', version: muleVersion compileOnly group: 'org.mule.runtime', name: 'mule-tracer-customization-impl', version: muleVersion compileOnly sourceSets.main_java11.output - testImplementation sourceSets.main_java11.output + main_java11CompileOnly project(':internal-api') + main_java11CompileOnly project(':dd-java-agent:agent-tooling') + main_java11CompileOnly project(':dd-java-agent:agent-bootstrap') + main_java11CompileOnly group: 'org.mule.runtime', name: 'mule-core', version: muleVersion + + testImplementation sourceSets.main_java11.output testImplementation project(':dd-java-agent:instrumentation:aws-common') testImplementation project(':dd-java-agent:instrumentation:reactor-core-3.1') testImplementation project(':dd-java-agent:instrumentation:reactive-streams') diff --git a/dd-java-agent/instrumentation/mule-4/src/main/java/datadog/trace/instrumentation/mule4/JpmsMuleInstrumentation.java b/dd-java-agent/instrumentation/mule-4/src/main/java/datadog/trace/instrumentation/mule4/JpmsMuleInstrumentation.java index b079cc2f722a..4e2391dc5108 100644 --- a/dd-java-agent/instrumentation/mule-4/src/main/java/datadog/trace/instrumentation/mule4/JpmsMuleInstrumentation.java +++ b/dd-java-agent/instrumentation/mule-4/src/main/java/datadog/trace/instrumentation/mule4/JpmsMuleInstrumentation.java @@ -6,9 +6,6 @@ import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.Platform; -import net.bytebuddy.asm.Advice; -import net.bytebuddy.implementation.bytecode.assign.Assigner; -import org.mule.runtime.tracer.api.EventTracer; @AutoService(InstrumenterModule.class) public class JpmsMuleInstrumentation extends InstrumenterModule.Tracing @@ -41,18 +38,6 @@ public String[] helperClassNames() { @Override public void methodAdvice(MethodTransformer transformer) { // it does not work with typeInitializer() - transformer.applyAdvice(isConstructor(), getClass().getName() + "$JpmsClearanceAdvice"); - } - - public static class JpmsClearanceAdvice { - @Advice.OnMethodExit(suppress = Throwable.class) - public static void openOnReturn(@Advice.This(typing = Assigner.Typing.DYNAMIC) Object self) { - JpmsAdvisingHelper.allowAccessOnModuleClass(self.getClass()); - } - - private static void muzzleCheck(final EventTracer tracer) { - // introduced in 4.5.0 - tracer.endCurrentSpan(null); - } + transformer.applyAdvice(isConstructor(), packageName + ".JpmsClearanceAdvice"); } } diff --git a/dd-java-agent/instrumentation/mule-4/src/main/java11/datadog/trace/instrumentation/mule4/JpmsAdvisingHelper.java b/dd-java-agent/instrumentation/mule-4/src/main/java11/datadog/trace/instrumentation/mule4/JpmsAdvisingHelper.java index a275ae54bb92..22313a648894 100644 --- a/dd-java-agent/instrumentation/mule-4/src/main/java11/datadog/trace/instrumentation/mule4/JpmsAdvisingHelper.java +++ b/dd-java-agent/instrumentation/mule-4/src/main/java11/datadog/trace/instrumentation/mule4/JpmsAdvisingHelper.java @@ -1,22 +1,11 @@ package datadog.trace.instrumentation.mule4; -import java.util.WeakHashMap; +import datadog.trace.api.GenericClassValue; +import java.util.concurrent.atomic.AtomicBoolean; public class JpmsAdvisingHelper { - private static final WeakHashMap, Boolean> ALREADY_PROCESSED_CACHE = new WeakHashMap<>(); - - public static void allowAccessOnModuleClass(final Class cls) { - if (Boolean.TRUE.equals(ALREADY_PROCESSED_CACHE.putIfAbsent(cls, Boolean.TRUE))) { - return; - } - final Module module = cls.getModule(); - if (module != null) { - try { - module.addExports(cls.getPackageName(), module.getClassLoader().getUnnamedModule()); - } catch (Throwable ignored) { - } - } - } + public static final ClassValue ALREADY_PROCESSED_CACHE = + GenericClassValue.constructing(AtomicBoolean.class); private JpmsAdvisingHelper() {} } diff --git a/dd-java-agent/instrumentation/mule-4/src/main/java11/datadog/trace/instrumentation/mule4/JpmsClearanceAdvice.java b/dd-java-agent/instrumentation/mule-4/src/main/java11/datadog/trace/instrumentation/mule4/JpmsClearanceAdvice.java new file mode 100644 index 000000000000..f73c423b5f24 --- /dev/null +++ b/dd-java-agent/instrumentation/mule-4/src/main/java11/datadog/trace/instrumentation/mule4/JpmsClearanceAdvice.java @@ -0,0 +1,32 @@ +package datadog.trace.instrumentation.mule4; + +import static datadog.trace.instrumentation.mule4.JpmsAdvisingHelper.ALREADY_PROCESSED_CACHE; + +import net.bytebuddy.asm.Advice; +import net.bytebuddy.implementation.bytecode.assign.Assigner; +import org.mule.runtime.tracer.api.EventTracer; + +public class JpmsClearanceAdvice { + @Advice.OnMethodExit(suppress = Throwable.class) + public static void openOnReturn(@Advice.This(typing = Assigner.Typing.DYNAMIC) Object self) { + final Class cls = self.getClass(); + if (ALREADY_PROCESSED_CACHE.get(cls).compareAndSet(false, true)) { + final Module module = cls.getModule(); + if (module != null) { + try { + // This call needs imperatively to be done from the same module we're adding exports + // because the jdk is checking that the caller belongs to the same module. + // The code of this advice is getting inlined into the constructor of the class belonging + // to that package so it will work. Moving the same to a helper won't. + module.addExports(cls.getPackageName(), module.getClassLoader().getUnnamedModule()); + } catch (Throwable ignored) { + } + } + } + } + + private static void muzzleCheck(final EventTracer tracer) { + // introduced in 4.5.0 + tracer.endCurrentSpan(null); + } +}