Skip to content

Commit 8621e84

Browse files
committed
AWS Lambda Runtime internal handlers need to be ignored from being instrumented and so traced. Otherwise, there might be double root spans.
1 parent 16c3bb1 commit 8621e84

File tree

4 files changed

+53
-1
lines changed

4 files changed

+53
-1
lines changed

instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaRequestHandlerInstrumentation.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
import static io.opentelemetry.javaagent.instrumentation.awslambdacore.v1_0.AwsLambdaInstrumentationHelper.functionInstrumenter;
1111
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
1212
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
13+
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
1314
import static net.bytebuddy.matcher.ElementMatchers.named;
15+
import static net.bytebuddy.matcher.ElementMatchers.not;
1416
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
1517

1618
import com.amazonaws.services.lambda.runtime.Context;
@@ -35,7 +37,8 @@ public ElementMatcher<ClassLoader> classLoaderOptimization() {
3537

3638
@Override
3739
public ElementMatcher<TypeDescription> typeMatcher() {
38-
return implementsInterface(named("com.amazonaws.services.lambda.runtime.RequestHandler"));
40+
return implementsInterface(named("com.amazonaws.services.lambda.runtime.RequestHandler"))
41+
.and(not(nameStartsWith("com.amazonaws.services.lambda.runtime.api.client")));
3942
}
4043

4144
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.amazonaws.services.lambda.runtime.api.client;
7+
8+
import com.amazonaws.services.lambda.runtime.Context;
9+
import com.amazonaws.services.lambda.runtime.RequestHandler;
10+
11+
public class AwsLambdaInternalRequestHandler implements RequestHandler<String, String> {
12+
13+
private final RequestHandler<String, String> requestHandler;
14+
15+
public AwsLambdaInternalRequestHandler(RequestHandler<String, String> requestHandler) {
16+
this.requestHandler = requestHandler;
17+
}
18+
19+
@Override
20+
public String handleRequest(String input, Context context) {
21+
return requestHandler.handleRequest(input, context);
22+
}
23+
}

instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaTest.java

+22
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@
55

66
package io.opentelemetry.javaagent.instrumentation.awslambdacore.v1_0;
77

8+
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
89
import static org.assertj.core.api.Assertions.assertThat;
910

1011
import com.amazonaws.services.lambda.runtime.Context;
1112
import com.amazonaws.services.lambda.runtime.RequestHandler;
13+
import com.amazonaws.services.lambda.runtime.api.client.AwsLambdaInternalRequestHandler;
14+
import io.opentelemetry.api.trace.SpanKind;
1215
import io.opentelemetry.instrumentation.awslambdacore.v1_0.AbstractAwsLambdaTest;
1316
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
1417
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
18+
import io.opentelemetry.semconv.SemanticAttributes;
1519
import org.junit.jupiter.api.AfterEach;
20+
import org.junit.jupiter.api.Test;
1621
import org.junit.jupiter.api.extension.RegisterExtension;
1722

1823
public class AwsLambdaTest extends AbstractAwsLambdaTest {
@@ -35,6 +40,23 @@ void tearDown() {
3540
assertThat(testing.forceFlushCalled()).isTrue();
3641
}
3742

43+
@Test
44+
void awsLambdaInternalHandlerIgnoredAndUserHandlerTraced() {
45+
RequestHandler<String, String> handler = new AwsLambdaInternalRequestHandler(handler());
46+
String result = handler.handleRequest("hello", context());
47+
assertThat(result).isEqualTo("world");
48+
49+
testing()
50+
.waitAndAssertTraces(
51+
trace ->
52+
trace.hasSpansSatisfyingExactly(
53+
span ->
54+
span.hasName("my_function")
55+
.hasKind(SpanKind.SERVER)
56+
.hasAttributesSatisfyingExactly(
57+
equalTo(SemanticAttributes.FAAS_INVOCATION_ID, "1-22-333"))));
58+
}
59+
3860
private static final class TestRequestHandler implements RequestHandler<String, String> {
3961

4062
@Override

instrumentation/aws-lambda/aws-lambda-core-1.0/testing/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/AbstractAwsLambdaTest.java

+4
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ void tearDown() {
5353
assertThat(testing().forceFlushCalled()).isTrue();
5454
}
5555

56+
protected Context context() {
57+
return context;
58+
}
59+
5660
@Test
5761
void handlerTraced() {
5862
String result = handler().handleRequest("hello", context);

0 commit comments

Comments
 (0)