diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index 8b6005b2958..4d9e7b10338 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -329,8 +329,6 @@ public void run() { if (appUsingCustomJMXBuilder) { log.debug("Custom JMX builder detected. Delaying JMXFetch initialization."); registerMBeanServerBuilderCallback(new StartJmxCallback(jmxStartDelay)); - // one minute fail-safe in case nothing touches JMX and callback isn't triggered - scheduleJmxStart(60 + jmxStartDelay); } else if (appUsingCustomLogManager) { log.debug("Custom logger detected. Delaying JMXFetch initialization."); registerLogManagerCallback(new StartJmxCallback(jmxStartDelay)); @@ -437,6 +435,8 @@ public static void startDatadogTracer(InitializationTelemetry initTelemetry) thr } private static void registerLogManagerCallback(final ClassLoadCallBack callback) { + // one minute fail-safe in case the class was unintentionally loaded during premain + AgentTaskScheduler.INSTANCE.schedule(callback, 1, TimeUnit.MINUTES); try { final Class agentInstallerClass = AGENT_CLASSLOADER.loadClass(AGENT_INSTALLER_CLASS_NAME); final Method registerCallbackMethod = @@ -448,6 +448,8 @@ private static void registerLogManagerCallback(final ClassLoadCallBack callback) } private static void registerMBeanServerBuilderCallback(final ClassLoadCallBack callback) { + // one minute fail-safe in case the class was unintentionally loaded during premain + AgentTaskScheduler.INSTANCE.schedule(callback, 1, TimeUnit.MINUTES); try { final Class agentInstallerClass = AGENT_CLASSLOADER.loadClass(AGENT_INSTALLER_CLASS_NAME); final Method registerCallbackMethod = @@ -459,8 +461,14 @@ private static void registerMBeanServerBuilderCallback(final ClassLoadCallBack c } protected abstract static class ClassLoadCallBack implements Runnable { + private final AtomicBoolean starting = new AtomicBoolean(); + @Override public void run() { + if (starting.getAndSet(true)) { + return; // someone has already called us + } + /* * This callback is called from within bytecode transformer. This can be a problem if callback tries * to load classes being transformed. To avoid this we start a thread here that calls the callback. @@ -558,6 +566,7 @@ public void execute() { } private void resumeRemoteComponents() { + log.debug("Resuming remote components."); try { // remote components were paused for custom log-manager/jmx-builder // add small delay before resuming remote I/O to help stabilization