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..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,6 +112,9 @@ static void exit( try { final AgentSpan span = scope.span(); + if (throwable != null) { + span.addThrowable(throwable); + } span.finish(); AgentTracer.get().notifyExtensionEnd(span, result, null != throwable); } finally { 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..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 @@ -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 { + 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 } + } + } + } + } + } }