From 8621e841c311435e848f5eb704c199b8e3ea75d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Serkan=20=C3=96ZAL?= Date: Sat, 2 Mar 2024 18:01:31 +0300 Subject: [PATCH] AWS Lambda Runtime internal handlers need to be ignored from being instrumented and so traced. Otherwise, there might be double root spans. --- ...wsLambdaRequestHandlerInstrumentation.java | 5 +++- .../AwsLambdaInternalRequestHandler.java | 23 +++++++++++++++++++ .../awslambdacore/v1_0/AwsLambdaTest.java | 22 ++++++++++++++++++ .../v1_0/AbstractAwsLambdaTest.java | 4 ++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/test/java/com/amazonaws/services/lambda/runtime/api/client/AwsLambdaInternalRequestHandler.java diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaRequestHandlerInstrumentation.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaRequestHandlerInstrumentation.java index 2332f24a8fd8..0743cdea75d6 100644 --- a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaRequestHandlerInstrumentation.java +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaRequestHandlerInstrumentation.java @@ -10,7 +10,9 @@ import static io.opentelemetry.javaagent.instrumentation.awslambdacore.v1_0.AwsLambdaInstrumentationHelper.functionInstrumenter; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; +import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.amazonaws.services.lambda.runtime.Context; @@ -35,7 +37,8 @@ public ElementMatcher classLoaderOptimization() { @Override public ElementMatcher typeMatcher() { - return implementsInterface(named("com.amazonaws.services.lambda.runtime.RequestHandler")); + return implementsInterface(named("com.amazonaws.services.lambda.runtime.RequestHandler")) + .and(not(nameStartsWith("com.amazonaws.services.lambda.runtime.api.client"))); } @Override diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/test/java/com/amazonaws/services/lambda/runtime/api/client/AwsLambdaInternalRequestHandler.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/test/java/com/amazonaws/services/lambda/runtime/api/client/AwsLambdaInternalRequestHandler.java new file mode 100644 index 000000000000..de18a333df15 --- /dev/null +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/test/java/com/amazonaws/services/lambda/runtime/api/client/AwsLambdaInternalRequestHandler.java @@ -0,0 +1,23 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.amazonaws.services.lambda.runtime.api.client; + +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +public class AwsLambdaInternalRequestHandler implements RequestHandler { + + private final RequestHandler requestHandler; + + public AwsLambdaInternalRequestHandler(RequestHandler requestHandler) { + this.requestHandler = requestHandler; + } + + @Override + public String handleRequest(String input, Context context) { + return requestHandler.handleRequest(input, context); + } +} diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaTest.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaTest.java index af939fcb6d8f..29700c2bf753 100644 --- a/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaTest.java +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awslambdacore/v1_0/AwsLambdaTest.java @@ -5,14 +5,19 @@ package io.opentelemetry.javaagent.instrumentation.awslambdacore.v1_0; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static org.assertj.core.api.Assertions.assertThat; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; +import com.amazonaws.services.lambda.runtime.api.client.AwsLambdaInternalRequestHandler; +import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.awslambdacore.v1_0.AbstractAwsLambdaTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.semconv.SemanticAttributes; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; public class AwsLambdaTest extends AbstractAwsLambdaTest { @@ -35,6 +40,23 @@ void tearDown() { assertThat(testing.forceFlushCalled()).isTrue(); } + @Test + void awsLambdaInternalHandlerIgnoredAndUserHandlerTraced() { + RequestHandler handler = new AwsLambdaInternalRequestHandler(handler()); + String result = handler.handleRequest("hello", context()); + assertThat(result).isEqualTo("world"); + + testing() + .waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("my_function") + .hasKind(SpanKind.SERVER) + .hasAttributesSatisfyingExactly( + equalTo(SemanticAttributes.FAAS_INVOCATION_ID, "1-22-333")))); + } + private static final class TestRequestHandler implements RequestHandler { @Override diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/AbstractAwsLambdaTest.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/AbstractAwsLambdaTest.java index 94a85244e276..25a32896aad5 100644 --- a/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/AbstractAwsLambdaTest.java +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/AbstractAwsLambdaTest.java @@ -53,6 +53,10 @@ void tearDown() { assertThat(testing().forceFlushCalled()).isTrue(); } + protected Context context() { + return context; + } + @Test void handlerTraced() { String result = handler().handleRequest("hello", context);