diff --git a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java index d56b2ab6ac8..8347a923e11 100644 --- a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java +++ b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java @@ -164,6 +164,7 @@ public static ClassFileTransformer installBytebuddyAgent( .with(AgentStrategies.transformerDecorator()) .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION) .with(AgentStrategies.rediscoveryStrategy()) + .with(new RedefinitionLoggingListener()) .with(AgentStrategies.locationStrategy()) .with(AgentStrategies.poolStrategy()) .with(AgentBuilder.DescriptionStrategy.Default.POOL_ONLY) @@ -176,12 +177,7 @@ public static ClassFileTransformer installBytebuddyAgent( .ignore(globalIgnoresMatcher(skipAdditionalLibraryMatcher)); if (DEBUG) { - agentBuilder = - agentBuilder - .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION) - .with(AgentStrategies.rediscoveryStrategy()) - .with(new RedefinitionLoggingListener()) - .with(new TransformLoggingListener()); + agentBuilder = agentBuilder.with(new TransformLoggingListener()); } for (final AgentBuilder.Listener listener : listeners) { @@ -403,6 +399,12 @@ public Iterable>> onError( final List> types) { if (DEBUG) { log.debug("Exception while retransforming {} classes: {}", batch.size(), batch, throwable); + } else { + // a failed batch leaves every class in it uninstrumented, so don't keep this silent + log.warn( + "Exception while retransforming {} classes, instrumentation may be incomplete: {}", + batch.size(), + throwable.toString()); } return Collections.emptyList(); } diff --git a/dd-java-agent/agent-installer/src/test/java/datadog/trace/agent/tooling/RedefinitionLoggingListenerForkedTest.java b/dd-java-agent/agent-installer/src/test/java/datadog/trace/agent/tooling/RedefinitionLoggingListenerForkedTest.java new file mode 100644 index 00000000000..8c7fdda7161 --- /dev/null +++ b/dd-java-agent/agent-installer/src/test/java/datadog/trace/agent/tooling/RedefinitionLoggingListenerForkedTest.java @@ -0,0 +1,46 @@ +package datadog.trace.agent.tooling; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.slf4j.LoggerFactory; + +class RedefinitionLoggingListenerForkedTest { + + @Test + void warnsWhenRetransformationBatchFailsWithoutDebugLogging() { + // AgentInstaller.DEBUG is fixed when the class initializes, so keep it off in this fork + ((Logger) LoggerFactory.getLogger(AgentInstaller.class)).setLevel(Level.INFO); + Logger logger = + (Logger) LoggerFactory.getLogger(AgentInstaller.RedefinitionLoggingListener.class); + logger.setLevel(Level.INFO); + ListAppender appender = new ListAppender<>(); + appender.start(); + logger.addAppender(appender); + try { + List> batch = Arrays.asList(String.class, Integer.class); + + Iterable>> retry = + new AgentInstaller.RedefinitionLoggingListener() + .onError( + 0, batch, new UnsupportedOperationException("class redefinition failed"), batch); + + assertFalse(retry.iterator().hasNext()); + assertEquals(1, appender.list.size()); + ILoggingEvent event = appender.list.get(0); + assertEquals(Level.WARN, event.getLevel()); + assertTrue(event.getFormattedMessage().contains("retransforming 2 classes")); + assertTrue(event.getFormattedMessage().contains("class redefinition failed")); + } finally { + logger.detachAppender(appender); + } + } +}