From 0c96c1ca4c29c6d678d6ecb17a4cfd773b8392a7 Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Tue, 18 Feb 2025 15:22:47 -0500 Subject: [PATCH 1/4] add throwable in Lambda handler instrumentation --- .../aws/v1/lambda/LambdaHandlerInstrumentation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java b/dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java index a76cafa2e87..ebe9e69d6da 100644 --- a/dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java @@ -112,6 +112,7 @@ static void exit( try { final AgentSpan span = scope.span(); + span.addThrowable(throwable); span.finish(); AgentTracer.get().notifyExtensionEnd(span, result, null != throwable); } finally { From 16db575faa7b85553011148e82e01a7cd1c1ddae Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Tue, 18 Feb 2025 15:23:29 -0500 Subject: [PATCH 2/4] add tests --- .../groovy/HandlerStreamingWithError.java | 11 ++++++ .../LambdaHandlerInstrumentationTest.groovy | 34 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 dd-java-agent/instrumentation/aws-lambda-handler/src/test/groovy/HandlerStreamingWithError.java diff --git a/dd-java-agent/instrumentation/aws-lambda-handler/src/test/groovy/HandlerStreamingWithError.java b/dd-java-agent/instrumentation/aws-lambda-handler/src/test/groovy/HandlerStreamingWithError.java new file mode 100644 index 00000000000..d9ff02f6865 --- /dev/null +++ b/dd-java-agent/instrumentation/aws-lambda-handler/src/test/groovy/HandlerStreamingWithError.java @@ -0,0 +1,11 @@ +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; +import java.io.InputStream; +import java.io.OutputStream; + +public class HandlerStreamingWithError implements RequestStreamHandler { + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) { + throw new Error("Some error"); + } +} diff --git a/dd-java-agent/instrumentation/aws-lambda-handler/src/test/groovy/LambdaHandlerInstrumentationTest.groovy b/dd-java-agent/instrumentation/aws-lambda-handler/src/test/groovy/LambdaHandlerInstrumentationTest.groovy index a63a76f1345..97d0bcb0df1 100644 --- a/dd-java-agent/instrumentation/aws-lambda-handler/src/test/groovy/LambdaHandlerInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/aws-lambda-handler/src/test/groovy/LambdaHandlerInstrumentationTest.groovy @@ -24,6 +24,40 @@ abstract class LambdaHandlerInstrumentationTest extends VersionedNamingTestBase } } } + + def "test streaming handler with error"() { + when: + def input = new ByteArrayInputStream(StandardCharsets.UTF_8.encode("Hello").array()) + def output = new ByteArrayOutputStream() + new HandlerStreamingWithError().handleRequest(input, output, null) + + then: + thrown(Error) + assertTraces(1) { + trace(1) { + span { + operationName operation() + errored true + tags { + "error.type" "java.lang.Error" + "error.message" "Some error" + "error.stack" String + "language" "jvm" + "process_id" Long + "runtime-id" String + "thread.id" Long + "thread.name" String + "_dd.profiling.ctx" "test" + "_dd.profiling.enabled" 0 + "_dd.agent_psr" 1.0 + "_dd.tracer_host" String + "_sample_rate" 1 + "_dd.trace_span_attribute_schema" 0 + } + } + } + } + } } From 3e7aa9dfd29335b464baed963e54b5db68b23a7f Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Tue, 18 Feb 2025 16:19:12 -0500 Subject: [PATCH 3/4] fix tests --- .../LambdaHandlerInstrumentationTest.groovy | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/dd-java-agent/instrumentation/aws-lambda-handler/src/test/groovy/LambdaHandlerInstrumentationTest.groovy b/dd-java-agent/instrumentation/aws-lambda-handler/src/test/groovy/LambdaHandlerInstrumentationTest.groovy index 97d0bcb0df1..5982e5d18ee 100644 --- a/dd-java-agent/instrumentation/aws-lambda-handler/src/test/groovy/LambdaHandlerInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/aws-lambda-handler/src/test/groovy/LambdaHandlerInstrumentationTest.groovy @@ -39,20 +39,20 @@ abstract class LambdaHandlerInstrumentationTest extends VersionedNamingTestBase operationName operation() errored true tags { - "error.type" "java.lang.Error" - "error.message" "Some error" - "error.stack" String - "language" "jvm" - "process_id" Long - "runtime-id" String - "thread.id" Long - "thread.name" String - "_dd.profiling.ctx" "test" - "_dd.profiling.enabled" 0 - "_dd.agent_psr" 1.0 - "_dd.tracer_host" String - "_sample_rate" 1 - "_dd.trace_span_attribute_schema" 0 + tag "error.type", "java.lang.Error" + tag "error.message", "Some error" + tag "error.stack", String + tag "language", "jvm" + tag "process_id", Long + tag "runtime-id", String + tag "thread.id", Long + tag "thread.name", String + tag "_dd.profiling.ctx", "test" + tag "_dd.profiling.enabled", 0 + tag "_dd.agent_psr", 1.0 + tag "_dd.tracer_host", String + tag "_sample_rate", 1 + tag "_dd.trace_span_attribute_schema", { it != null } } } } From a0219e819d02e9cba376408d024608b0c57e7c5b Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Wed, 19 Feb 2025 16:33:55 -0500 Subject: [PATCH 4/4] add throwable only if not null --- .../aws/v1/lambda/LambdaHandlerInstrumentation.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java b/dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java index ebe9e69d6da..98efeb6d9e3 100644 --- a/dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java @@ -112,7 +112,9 @@ static void exit( try { final AgentSpan span = scope.span(); - span.addThrowable(throwable); + if (throwable != null) { + span.addThrowable(throwable); + } span.finish(); AgentTracer.get().notifyExtensionEnd(span, result, null != throwable); } finally {