From adbd0ad07393372413d37471baca4b21ea8804a1 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Thu, 3 Jul 2025 14:26:23 -0400 Subject: [PATCH 1/2] Fixed `Error` handling for trace interceptors. --- .../smoketest/opentracing/ApiVerification.java | 9 +++++++-- .../opentracing/OTWithAgentApplication.java | 5 +++-- .../opentracing/OTWithoutAgentApplication.java | 2 +- .../datadog/smoketest/OpenTracingSmokeTest.groovy | 14 ++++++++++++-- .../main/java/datadog/trace/core/CoreTracer.java | 2 +- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/ApiVerification.java b/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/ApiVerification.java index 4acae26913e..94e290b8c2b 100644 --- a/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/ApiVerification.java +++ b/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/ApiVerification.java @@ -8,12 +8,17 @@ public final class ApiVerification { private ApiVerification() {} - public static void verifyInterceptors(Tracer otTracer) { + public static void verifyInterceptors(Tracer otTracer, boolean throwError) { TraceInterceptor interceptor = new TraceInterceptor() { @Override public Collection onTraceComplete( Collection trace) { + // Emulates situation when user code will throw an Error. + if (throwError) { + throw new AssertionError(); + } + return trace; } @@ -23,6 +28,6 @@ public int priority() { } }; - ((datadog.trace.api.Tracer) otTracer).addTraceInterceptor(interceptor); + otTracer.addTraceInterceptor(interceptor); } } diff --git a/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/OTWithAgentApplication.java b/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/OTWithAgentApplication.java index 73ffb6870a2..261a9b39dd4 100644 --- a/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/OTWithAgentApplication.java +++ b/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/OTWithAgentApplication.java @@ -12,10 +12,11 @@ public class OTWithAgentApplication { public static void main(final String[] args) throws InterruptedException { final Tracer tracer = GlobalTracer.get(); - ApiVerification.verifyInterceptors(datadog.trace.api.GlobalTracer.get()); + boolean throwError = args != null && args.length > 0 && Boolean.parseBoolean(args[0]); + ApiVerification.verifyInterceptors(datadog.trace.api.GlobalTracer.get(), throwError); final Span span = tracer.buildSpan("someOperation").start(); - try (final Scope scope = tracer.activateSpan(span)) { + try (final Scope ignored = tracer.activateSpan(span)) { span.setTag(DDTags.SERVICE_NAME, "someService"); // Verify that the returned object is wrapped correctly. Span root = (Span) ((MutableSpan) tracer.activeSpan()).getLocalRootSpan(); diff --git a/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/OTWithoutAgentApplication.java b/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/OTWithoutAgentApplication.java index ddb50f3dac5..26162a2e55a 100644 --- a/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/OTWithoutAgentApplication.java +++ b/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/OTWithoutAgentApplication.java @@ -13,7 +13,7 @@ public static void main(final String[] args) throws InterruptedException { // register the same tracer with the Datadog API datadog.trace.api.GlobalTracer.registerIfAbsent(tracer); - ApiVerification.verifyInterceptors(tracer); + ApiVerification.verifyInterceptors(tracer, false); final Span span = tracer.buildSpan("someOperation").start(); try (final Scope scope = tracer.activateSpan(span)) { diff --git a/dd-smoke-tests/opentracing/src/test/groovy/datadog/smoketest/OpenTracingSmokeTest.groovy b/dd-smoke-tests/opentracing/src/test/groovy/datadog/smoketest/OpenTracingSmokeTest.groovy index 3a5208a9cb9..6cc100ff707 100644 --- a/dd-smoke-tests/opentracing/src/test/groovy/datadog/smoketest/OpenTracingSmokeTest.groovy +++ b/dd-smoke-tests/opentracing/src/test/groovy/datadog/smoketest/OpenTracingSmokeTest.groovy @@ -9,8 +9,6 @@ import static java.util.concurrent.TimeUnit.SECONDS abstract class OpenTracingSmokeTest extends AbstractSmokeTest { // Estimate for the amount of time instrumentation, plus request, plus some extra public static final int TIMEOUT_SECS = 30 - // Timeout for individual requests - public static final int REQUEST_TIMEOUT = 5 List baseCommand() { List command = new ArrayList<>() @@ -53,3 +51,15 @@ class OTWithAgentTest extends OpenTracingSmokeTest { processBuilder.directory(new File(buildDirectory)) } } + +class OTWithAgentAssertionErrorTest extends OpenTracingSmokeTest { + @Override + ProcessBuilder createProcessBuilder() { + List command = baseCommand() + command.add(OTWithAgentApplication.name) + command.add("true") + + ProcessBuilder processBuilder = new ProcessBuilder(command) + processBuilder.directory(new File(buildDirectory)) + } +} diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index 33e570fbd88..77840af550d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -1040,7 +1040,7 @@ private List interceptCompleteTrace(List trace) { try { // If one TraceInterceptor throws an exception, then continue with the next one interceptedTrace = interceptor.onTraceComplete(interceptedTrace); - } catch (Exception e) { + } catch (Throwable e) { String interceptorName = interceptor.getClass().getName(); rlLog.warn("Exception in TraceInterceptor {}", interceptorName, e); } From 174d63069381a566b58420c72bcd8e4765ae2699 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Mon, 7 Jul 2025 09:05:47 -0400 Subject: [PATCH 2/2] Update dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java Co-authored-by: Brice Dutheil --- dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index 77840af550d..28ba0832e30 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -1042,7 +1042,7 @@ private List interceptCompleteTrace(List trace) { interceptedTrace = interceptor.onTraceComplete(interceptedTrace); } catch (Throwable e) { String interceptorName = interceptor.getClass().getName(); - rlLog.warn("Exception in TraceInterceptor {}", interceptorName, e); + rlLog.warn("Throwable raised in TraceInterceptor {}", interceptorName, e); } } trace = new ArrayList<>(interceptedTrace.size());