From d58e8d7fd7dc383dc8fdb7ca686af7a01691b4e5 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Wed, 18 Feb 2026 13:35:20 -0800 Subject: [PATCH 1/5] adding logging --- .../JMSMessageConsumerInstrumentation.java | 5 ++++ .../scopemanager/ContinuableScopeManager.java | 28 +++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java index d203a65dfcb..28c1bfd3ef4 100644 --- a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java @@ -39,10 +39,14 @@ import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public final class JMSMessageConsumerInstrumentation implements Instrumenter.ForTypeHierarchy, Instrumenter.HasMethodAdvice { private final String namespace; + private static final Logger log = + LoggerFactory.getLogger(JMSMessageConsumerInstrumentation.class); public JMSMessageConsumerInstrumentation(String namespace) { this.namespace = namespace; @@ -164,6 +168,7 @@ public static void afterReceive( CONSUMER_DECORATE.onError(span, throwable); activateNext(span); // scope is left open until next message or it times out + log.debug("Expecting the following `ITERATION` span to be finished {}", span); SessionState sessionState = consumerState.getSessionState(); if (sessionState.isClientAcknowledge()) { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java index 6e26ebfcf07..dcfc41eb70a 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java @@ -1,6 +1,7 @@ package datadog.trace.core.scopemanager; import static datadog.trace.api.ConfigDefaults.DEFAULT_ASYNC_PROPAGATING; +import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; import static datadog.trace.core.scopemanager.ContinuableScope.CONTEXT; @@ -238,15 +239,24 @@ public void closePrevious(final boolean finishSpan) { // close any immediately previous iteration scope final ContinuableScope top = scopeStack.top; - if (top != null && top.source() == ITERATION) { - if (iterationKeepAlive > 0) { // skip depth check because cancelling is cheap - cancelRootIterationScopeCleanup(scopeStack, top); - } - top.close(); - scopeStack.cleanup(); - AgentSpan span = top.span(); - if (finishSpan && span != null) { - span.finishWithEndToEnd(); + if (top != null) { + if (top.source() == ITERATION) { + if (iterationKeepAlive > 0) { // skip depth check because cancelling is cheap + cancelRootIterationScopeCleanup(scopeStack, top); + } + top.close(); + scopeStack.cleanup(); + AgentSpan span = top.span(); + if (finishSpan && span != null) { + span.finishWithEndToEnd(); + } + } else { + log.debug( + SEND_TELEMETRY, + "Scope found at top of stack has source {} when we expect {}. Current span at the top of the stack {}.", + top, + ITERATION, + top.span()); } } } From 1b7234d1841df23e4c1c01f19481f981928cfcf8 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Wed, 18 Feb 2026 14:37:13 -0800 Subject: [PATCH 2/5] adding wrapper to avoid bytebuddy issues --- .../JMSMessageConsumerInstrumentation.java | 12 +++++-- .../scopemanager/ContinuableScopeManager.java | 36 +++++++++---------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java index 28c1bfd3ef4..1c0adeda410 100644 --- a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java @@ -45,8 +45,6 @@ public final class JMSMessageConsumerInstrumentation implements Instrumenter.ForTypeHierarchy, Instrumenter.HasMethodAdvice { private final String namespace; - private static final Logger log = - LoggerFactory.getLogger(JMSMessageConsumerInstrumentation.class); public JMSMessageConsumerInstrumentation(String namespace) { this.namespace = namespace; @@ -168,7 +166,7 @@ public static void afterReceive( CONSUMER_DECORATE.onError(span, throwable); activateNext(span); // scope is left open until next message or it times out - log.debug("Expecting the following `ITERATION` span to be finished {}", span); + JMSLogger.logIterationSpan(span); SessionState sessionState = consumerState.getSessionState(); if (sessionState.isClientAcknowledge()) { @@ -218,4 +216,12 @@ public static void setMessageListener( } } } + + public static class JMSLogger { + private static final Logger log = LoggerFactory.getLogger(JMSLogger.class); + + public static void logIterationSpan(AgentSpan span) { + log.debug("Expecting the following `ITERATION` span to be finished {}", span); + } + } } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java index dcfc41eb70a..ada5ad92e8c 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java @@ -1,7 +1,6 @@ package datadog.trace.core.scopemanager; import static datadog.trace.api.ConfigDefaults.DEFAULT_ASYNC_PROPAGATING; -import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; import static datadog.trace.core.scopemanager.ContinuableScope.CONTEXT; @@ -239,25 +238,24 @@ public void closePrevious(final boolean finishSpan) { // close any immediately previous iteration scope final ContinuableScope top = scopeStack.top; - if (top != null) { - if (top.source() == ITERATION) { - if (iterationKeepAlive > 0) { // skip depth check because cancelling is cheap - cancelRootIterationScopeCleanup(scopeStack, top); - } - top.close(); - scopeStack.cleanup(); - AgentSpan span = top.span(); - if (finishSpan && span != null) { - span.finishWithEndToEnd(); - } - } else { - log.debug( - SEND_TELEMETRY, - "Scope found at top of stack has source {} when we expect {}. Current span at the top of the stack {}.", - top, - ITERATION, - top.span()); + if (top != null && top.source() == ITERATION) { + if (iterationKeepAlive > 0) { // skip depth check because cancelling is cheap + cancelRootIterationScopeCleanup(scopeStack, top); + } + top.close(); + scopeStack.cleanup(); + AgentSpan span = top.span(); + if (finishSpan && span != null) { + span.finishWithEndToEnd(); } + } else if (top != null) { + // log.debug( + // SEND_TELEMETRY, + // "Scope found at top of stack has source {} when we expect {}. Current span at the top + // of the stack {}.", + // top, + // ITERATION, + // top.span()); } } From 4b360cc7391f0368cff2821197d64fc1fa408f11 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Wed, 18 Feb 2026 14:45:45 -0800 Subject: [PATCH 3/5] PR comments --- .../core/scopemanager/ContinuableScopeManager.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java index ada5ad92e8c..bcbb736a931 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java @@ -1,6 +1,7 @@ package datadog.trace.core.scopemanager; import static datadog.trace.api.ConfigDefaults.DEFAULT_ASYNC_PROPAGATING; +import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; import static datadog.trace.core.scopemanager.ContinuableScope.CONTEXT; @@ -249,13 +250,12 @@ public void closePrevious(final boolean finishSpan) { span.finishWithEndToEnd(); } } else if (top != null) { - // log.debug( - // SEND_TELEMETRY, - // "Scope found at top of stack has source {} when we expect {}. Current span at the top - // of the stack {}.", - // top, - // ITERATION, - // top.span()); + log.debug( + SEND_TELEMETRY, + "Scope found at top of stack has source {} when we expect {}. Current span at the top of the stack {}.", + top.source(), + ITERATION, + top.span()); } } From c19cb84afc38fbc64442da1a3aa63efbfad75b12 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Thu, 19 Feb 2026 08:11:00 -0800 Subject: [PATCH 4/5] adding log helper to helper class names --- .../java/datadog/trace/instrumentation/jms/JavaxJmsModule.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JavaxJmsModule.java b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JavaxJmsModule.java index cc126c31cfc..1830b78ce7a 100644 --- a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JavaxJmsModule.java +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JavaxJmsModule.java @@ -36,7 +36,8 @@ public String[] helperClassNames() { packageName + ".MessageExtractAdapter", packageName + ".MessageExtractAdapter$1", packageName + ".MessageInjectAdapter", - packageName + ".DatadogMessageListener" + packageName + ".DatadogMessageListener", + packageName + ".JMSMessageConsumerInstrumentation$JMSLogger" }; } From 2b2852ba31dffd888c67b96c02e315b567c9f2d0 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Thu, 19 Feb 2026 09:38:23 -0800 Subject: [PATCH 5/5] moving logger out of nested class --- .../trace/instrumentation/jms/JMSLogger.java | 13 +++++++++++++ .../jms/JMSMessageConsumerInstrumentation.java | 10 ---------- .../trace/instrumentation/jms/JavaxJmsModule.java | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) create mode 100644 dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSLogger.java diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSLogger.java b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSLogger.java new file mode 100644 index 00000000000..6618045254d --- /dev/null +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSLogger.java @@ -0,0 +1,13 @@ +package datadog.trace.instrumentation.jms; + +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class JMSLogger { + private static final Logger log = LoggerFactory.getLogger(JMSLogger.class); + + public static void logIterationSpan(AgentSpan span) { + log.debug("Expecting the following `ITERATION` span to be finished {}", span); + } +} diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java index 1c0adeda410..8d6e3d62436 100644 --- a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java @@ -39,8 +39,6 @@ import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public final class JMSMessageConsumerInstrumentation implements Instrumenter.ForTypeHierarchy, Instrumenter.HasMethodAdvice { @@ -216,12 +214,4 @@ public static void setMessageListener( } } } - - public static class JMSLogger { - private static final Logger log = LoggerFactory.getLogger(JMSLogger.class); - - public static void logIterationSpan(AgentSpan span) { - log.debug("Expecting the following `ITERATION` span to be finished {}", span); - } - } } diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JavaxJmsModule.java b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JavaxJmsModule.java index 1830b78ce7a..9c0ef70a12b 100644 --- a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JavaxJmsModule.java +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JavaxJmsModule.java @@ -37,7 +37,7 @@ public String[] helperClassNames() { packageName + ".MessageExtractAdapter$1", packageName + ".MessageInjectAdapter", packageName + ".DatadogMessageListener", - packageName + ".JMSMessageConsumerInstrumentation$JMSLogger" + packageName + ".JMSLogger" }; }