diff --git a/dd-java-agent/agent-builder/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java b/dd-java-agent/agent-builder/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java index 06b358f79eb..476f01d755e 100644 --- a/dd-java-agent/agent-builder/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java +++ b/dd-java-agent/agent-builder/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java @@ -13,6 +13,7 @@ import datadog.trace.bootstrap.FieldBackedContextAccessor; import datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter; import datadog.trace.util.AgentTaskScheduler; +import de.thetaphi.forbiddenapis.SuppressForbidden; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; import java.util.Collections; @@ -43,6 +44,17 @@ public class AgentInstaller { addByteBuddyRawSetting(); // register weak map supplier as early as possible WeakMaps.registerAsSupplier(); + circularityErrorWorkaround(); + } + + @SuppressForbidden + private static void circularityErrorWorkaround() { + // these classes have been involved in intermittent ClassCircularityErrors during startup + // they don't need context storage, so it's safe to load them before installing the agent + try { + Class.forName("java.util.concurrent.ThreadLocalRandom"); + } catch (Throwable ignore) { + } } public static void installBytebuddyAgent(final Instrumentation inst) {