Skip to content

Commit 378f9b9

Browse files
committed
Properly capture lambda payloads for all handler types.
1 parent d5592c6 commit 378f9b9

File tree

4 files changed

+44
-10
lines changed

4 files changed

+44
-10
lines changed

dd-java-agent/instrumentation/aws-lambda-handler/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,14 @@ protected boolean defaultEnabled() {
6666

6767
@Override
6868
public void methodAdvice(MethodTransformer transformer) {
69-
// two args
70-
transformer.applyAdvice(
71-
isMethod()
72-
.and(named("handleRequest"))
73-
.and(takesArgument(1, named("com.amazonaws.services.lambda.runtime.Context"))),
74-
getClass().getName() + "$ExtensionCommunicationAdvice");
75-
// three args (streaming)
69+
// lambda under the hood converts all handlers to streaming handlers via
70+
// lambdainternal.EventHandlerLoader$PojoHandlerAsStreamHandler.handleRequest
71+
// full spec here : https://docs.aws.amazon.com/lambda/latest/dg/java-handler.html
7672
transformer.applyAdvice(
7773
isMethod()
7874
.and(named("handleRequest"))
7975
.and(takesArgument(2, named("com.amazonaws.services.lambda.runtime.Context"))),
8076
getClass().getName() + "$ExtensionCommunicationAdvice");
81-
// full spec here : https://docs.aws.amazon.com/lambda/latest/dg/java-handler.html
82-
8377
}
8478

8579
public static class ExtensionCommunicationAdvice {
@@ -108,7 +102,7 @@ static AgentScope enter(
108102
static void exit(
109103
@Origin String method,
110104
@Enter final AgentScope scope,
111-
@Advice.Return(typing = DYNAMIC) final Object result,
105+
@Advice.Argument(1) final Object result,
112106
@Advice.Thrown final Throwable throwable) {
113107

114108
if (scope == null) {

dd-trace-core/src/main/java/datadog/trace/lambda/LambdaHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext;
1111
import datadog.trace.core.CoreTracer;
1212
import java.io.ByteArrayInputStream;
13+
import java.io.ByteArrayOutputStream;
1314
import java.nio.charset.StandardCharsets;
1415
import java.util.Base64;
1516
import okhttp3.ConnectionPool;
@@ -63,6 +64,7 @@ public class LambdaHandler {
6364
private static final JsonAdapter<Object> adapter =
6465
new Moshi.Builder()
6566
.add(ByteArrayInputStream.class, new ReadFromInputStreamJsonAdapter())
67+
.add(ByteArrayOutputStream.class, new ReadFromOutputStreamJsonAdapter())
6668
.add(SkipUnsupportedTypeJsonAdapter.newFactory())
6769
.build()
6870
.adapter(Object.class);
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package datadog.trace.lambda;
2+
3+
import com.squareup.moshi.JsonAdapter;
4+
import com.squareup.moshi.JsonReader;
5+
import com.squareup.moshi.JsonWriter;
6+
import java.io.ByteArrayOutputStream;
7+
import java.io.IOException;
8+
import okio.BufferedSink;
9+
10+
public final class ReadFromOutputStreamJsonAdapter extends JsonAdapter<ByteArrayOutputStream> {
11+
12+
@Override
13+
public ByteArrayOutputStream fromJson(JsonReader reader) throws IOException {
14+
throw new UnsupportedOperationException();
15+
}
16+
17+
@Override
18+
public void toJson(JsonWriter writer, ByteArrayOutputStream outputStream) throws IOException {
19+
if (outputStream != null) {
20+
BufferedSink sink = writer.valueSink();
21+
byte[] bytes = outputStream.toByteArray();
22+
sink.write(bytes);
23+
sink.flush();
24+
}
25+
}
26+
}

dd-trace-core/src/test/groovy/datadog/trace/lambda/LambdaHandlerTest.groovy

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,4 +308,16 @@ class LambdaHandlerTest extends DDCoreSpecification {
308308
then:
309309
result == body
310310
}
311+
312+
def "test moshi toJson OutputStream"() {
313+
given:
314+
def body = "{\"body\":\"bababango\",\"statusCode\":\"200\"}"
315+
def myEvent = new ByteArrayOutputStream(body.getBytes())
316+
317+
when:
318+
def result = LambdaHandler.writeValueAsString(myEvent)
319+
320+
then:
321+
result == body
322+
}
311323
}

0 commit comments

Comments
 (0)