Skip to content

Commit fd74eb8

Browse files
authored
Let AWS Lambda SQS handlers report partial batch failures (#14468)
1 parent c04b8fc commit fd74eb8

File tree

46 files changed

+1934
-58
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1934
-58
lines changed

.fossa.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,12 @@ targets:
346346
- type: gradle
347347
path: ./
348348
target: ':instrumentation:aws-lambda:aws-lambda-events-2.2:library'
349+
- type: gradle
350+
path: ./
351+
target: ':instrumentation:aws-lambda:aws-lambda-events-3.11:library'
352+
- type: gradle
353+
path: ./
354+
target: ':instrumentation:aws-lambda:aws-lambda-events-common-2.2:library'
349355
- type: gradle
350356
path: ./
351357
target: ':instrumentation:aws-sdk:aws-sdk-1.11:javaagent'

docs/supported-libraries.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ These are the supported libraries and frameworks:
4747
| [Armeria gRPC](https://armeria.dev) | 1.14+ | | [RPC Client Spans], [RPC Client Metrics], [RPC Server Spans], [RPC Server Metrics] |
4848
| [AsyncHttpClient](https://github.com/AsyncHttpClient/async-http-client) | 1.9+ | N/A | [HTTP Client Spans], [HTTP Client Metrics] |
4949
| [Avaje Jex](https://avaje.io/jex/) | 3.0+ | N/A | Provides `http.route` [2] |
50-
| [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/java-handler.html) | 1.0+ | [opentelemetry-aws-lambda-core-1.0](../instrumentation/aws-lambda/aws-lambda-core-1.0/library),<br>[opentelemetry-aws-lambda-events-2.2](../instrumentation/aws-lambda/aws-lambda-events-2.2/library) | [FaaS Server Spans] |
50+
| [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/java-handler.html) | 1.0+ | [opentelemetry-aws-lambda-core-1.0](../instrumentation/aws-lambda/aws-lambda-core-1.0/library),<br>[opentelemetry-aws-lambda-events-3.11](../instrumentation/aws-lambda/aws-lambda-events-3.11/library) | [FaaS Server Spans] |
5151
| [AWS SDK](https://aws.amazon.com/sdk-for-java/) | 1.11 - 1.12.583,<br>2.2+ | [opentelemetry-aws-sdk-1.11](../instrumentation/aws-sdk/aws-sdk-1.11/library),<br>[opentelemetry-aws-sdk-1.11-autoconfigure](../instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure),<br>[opentelemetry-aws-sdk-2.2](../instrumentation/aws-sdk/aws-sdk-2.2/library),<br>[opentelemetry-aws-sdk-2.2-autoconfigure](../instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure) | [Messaging Spans], [Database Client Spans], [Database Client Metrics]&nbsp;[6], [HTTP Client Spans], [GenAI Client Spans], [GenAI Client Metrics] |
5252
| [Azure Core](https://docs.microsoft.com/en-us/java/api/overview/azure/core-readme) | 1.14+ | N/A | Context propagation |
5353
| [Cassandra Driver](https://github.com/datastax/java-driver) | 3.0+ | [opentelemetry-cassandra-4.4](../instrumentation/cassandra/cassandra-4.4/library) | [Database Client Spans], [Database Client Metrics]&nbsp;[6] |

instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ dependencies {
1717

1818
implementation(project(":instrumentation:aws-lambda:aws-lambda-core-1.0:library"))
1919

20-
implementation(project(":instrumentation:aws-lambda:aws-lambda-events-2.2:library")) {
20+
implementation(project(":instrumentation:aws-lambda:aws-lambda-events-common-2.2:library")) {
2121
// Only needed by wrappers, not the javaagent. Muzzle will catch if we accidentally change this.
2222
exclude("com.fasterxml.jackson.core", "jackson-databind")
2323
}

instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaSingletons.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,21 @@
1010
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1111
import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.AwsLambdaFunctionInstrumenter;
1212
import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrapperConfiguration;
13-
import io.opentelemetry.instrumentation.awslambdaevents.v2_2.internal.AwsLambdaEventsInstrumenterFactory;
14-
import io.opentelemetry.instrumentation.awslambdaevents.v2_2.internal.AwsLambdaSqsInstrumenterFactory;
13+
import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.AwsLambdaEventsInstrumenterFactory;
14+
import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.AwsLambdaSqsInstrumenterFactory;
1515
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
1616
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
1717
import java.time.Duration;
1818

1919
public final class AwsLambdaSingletons {
20-
20+
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.aws-lambda-events-2.2";
2121
private static final AwsLambdaFunctionInstrumenter FUNCTION_INSTRUMENTER =
2222
AwsLambdaEventsInstrumenterFactory.createInstrumenter(
23-
GlobalOpenTelemetry.get(), AgentCommonConfig.get().getKnownHttpRequestMethods());
23+
GlobalOpenTelemetry.get(),
24+
INSTRUMENTATION_NAME,
25+
AgentCommonConfig.get().getKnownHttpRequestMethods());
2426
private static final Instrumenter<SQSEvent, Void> MESSAGE_TRACER =
25-
AwsLambdaSqsInstrumenterFactory.forEvent(GlobalOpenTelemetry.get());
27+
AwsLambdaSqsInstrumenterFactory.forEvent(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME);
2628
private static final Duration FLUSH_TIMEOUT =
2729
Duration.ofMillis(
2830
AgentInstrumentationConfig.get()

instrumentation/aws-lambda/aws-lambda-events-2.2/library/build.gradle.kts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ plugins {
44

55
dependencies {
66
api(project(":instrumentation:aws-lambda:aws-lambda-core-1.0:library"))
7+
implementation(project(":instrumentation:aws-lambda:aws-lambda-events-common-2.2:library"))
8+
compileOnly(project(":instrumentation:aws-lambda:aws-lambda-events-3.11:library"))
79

810
compileOnly("io.opentelemetry:opentelemetry-sdk")
911
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
1012

11-
compileOnly("com.google.auto.value:auto-value-annotations")
12-
annotationProcessor("com.google.auto.value:auto-value")
13-
1413
library("com.amazonaws:aws-lambda-java-core:1.0.0")
1514
// First version to includes support for SQSEvent, currently the most popular message queue used
1615
// with lambda.
@@ -25,13 +24,6 @@ dependencies {
2524
// So that is the reason that why we add it as compile only dependency.
2625
compileOnly("com.amazonaws:aws-lambda-java-serialization:1.1.5")
2726

28-
// We need Jackson for wrappers to reproduce the serialization does when Lambda invokes a RequestHandler with event
29-
// since Lambda will only be able to invoke the wrapper itself with a generic Object.
30-
// Note that Lambda itself uses Jackson, but does not expose it to the function so we need to include it here.
31-
// TODO: Switch to aws-lambda-java-serialization to more robustly follow Lambda's serialization logic.
32-
implementation("com.fasterxml.jackson.core:jackson-databind")
33-
implementation("io.opentelemetry.contrib:opentelemetry-aws-xray-propagator")
34-
3527
// allows to get the function ARN
3628
testLibrary("com.amazonaws:aws-lambda-java-core:1.2.1")
3729
// allows to get the default events

instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestApiGatewayWrapper.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,20 @@
99
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
1010
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
1111
import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrappedLambda;
12-
import io.opentelemetry.instrumentation.awslambdaevents.v2_2.internal.SerializationUtil;
12+
import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.SerializationUtil;
1313
import io.opentelemetry.sdk.OpenTelemetrySdk;
1414
import java.util.function.BiFunction;
1515

1616
/**
1717
* Wrapper for {@link io.opentelemetry.instrumentation.awslambdacore.v1_0.TracingRequestHandler}.
1818
* Allows for wrapping a lambda proxied through API Gateway, enabling single span tracing and HTTP
1919
* context propagation.
20+
*
21+
* @deprecated use {@link
22+
* io.opentelemetry.instrumentation.awslambdaevents.v3_11.TracingRequestApiGatewayWrapper}
23+
* instead.
2024
*/
25+
@Deprecated
2126
public class TracingRequestApiGatewayWrapper
2227
extends TracingRequestWrapperBase<APIGatewayProxyRequestEvent, Object> {
2328

instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestWrapper.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.ApiGatewayProxyRequest;
1313
import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.MapUtils;
1414
import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrappedLambda;
15-
import io.opentelemetry.instrumentation.awslambdaevents.v2_2.internal.SerializationUtil;
15+
import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.LambdaParameters;
16+
import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.SerializationUtil;
1617
import io.opentelemetry.sdk.OpenTelemetrySdk;
1718
import java.io.ByteArrayInputStream;
1819
import java.io.ByteArrayOutputStream;
@@ -26,7 +27,11 @@
2627

2728
/**
2829
* Wrapper for {@link com.amazonaws.services.lambda.runtime.RequestHandler} based Lambda handlers.
30+
*
31+
* @deprecated use {@link
32+
* io.opentelemetry.instrumentation.awslambdaevents.v3_11.TracingRequestWrapper} instead.
2933
*/
34+
@Deprecated
3035
public class TracingRequestWrapper extends TracingRequestStreamWrapper {
3136
public TracingRequestWrapper() {
3237
super();

instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestWrapperBase.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.MapUtils;
1313
import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrappedLambda;
1414
import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrapperConfiguration;
15-
import io.opentelemetry.instrumentation.awslambdaevents.v2_2.internal.AwsLambdaEventsInstrumenterFactory;
15+
import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.AwsLambdaEventsInstrumenterFactory;
16+
import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.LambdaParameters;
1617
import io.opentelemetry.sdk.OpenTelemetrySdk;
1718
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
1819
import java.lang.reflect.InvocationTargetException;
@@ -26,6 +27,7 @@
2627
* env property OTEL_INSTRUMENTATION_AWS_LAMBDA_HANDLER in package.ClassName::methodName format
2728
*/
2829
abstract class TracingRequestWrapperBase<I, O> extends TracingRequestHandler<I, O> {
30+
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.aws-lambda-events-2.2";
2931

3032
private final WrappedLambda wrappedLambda;
3133
private final Method targetMethod;
@@ -47,7 +49,7 @@ protected TracingRequestWrapperBase(BiFunction<I, Class<?>, Object> parameterMap
4749
openTelemetrySdk,
4850
WrapperConfiguration.flushTimeout(),
4951
AwsLambdaEventsInstrumenterFactory.createInstrumenter(
50-
openTelemetrySdk, HttpConstants.KNOWN_METHODS));
52+
openTelemetrySdk, INSTRUMENTATION_NAME, HttpConstants.KNOWN_METHODS));
5153
this.wrappedLambda = wrappedLambda;
5254
this.targetMethod = wrappedLambda.getRequestTargetMethod();
5355
this.parameterMapper = parameterMapper;

instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingSqsEventHandler.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,17 @@
1010
import io.opentelemetry.context.Scope;
1111
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1212
import io.opentelemetry.instrumentation.awslambdacore.v1_0.TracingRequestHandler;
13-
import io.opentelemetry.instrumentation.awslambdaevents.v2_2.internal.AwsLambdaSqsInstrumenterFactory;
13+
import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.AwsLambdaSqsInstrumenterFactory;
1414
import io.opentelemetry.sdk.OpenTelemetrySdk;
1515
import java.time.Duration;
1616

17+
/**
18+
* @deprecated use {@link
19+
* io.opentelemetry.instrumentation.awslambdaevents.v3_11.TracingSqsEventHandler} instead.
20+
*/
21+
@Deprecated
1722
public abstract class TracingSqsEventHandler extends TracingRequestHandler<SQSEvent, Void> {
23+
static final String INSTRUMENTATION_NAME = "io.opentelemetry.aws-lambda-events-2.2";
1824

1925
private final Instrumenter<SQSEvent, Void> instrumenter;
2026

@@ -33,7 +39,9 @@ protected TracingSqsEventHandler(OpenTelemetrySdk openTelemetrySdk) {
3339
*/
3440
protected TracingSqsEventHandler(OpenTelemetrySdk openTelemetrySdk, Duration flushTimeout) {
3541
this(
36-
openTelemetrySdk, flushTimeout, AwsLambdaSqsInstrumenterFactory.forEvent(openTelemetrySdk));
42+
openTelemetrySdk,
43+
flushTimeout,
44+
AwsLambdaSqsInstrumenterFactory.forEvent(openTelemetrySdk, INSTRUMENTATION_NAME));
3745
}
3846

3947
/**

instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingSqsEventWrapper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,17 @@
99
import com.amazonaws.services.lambda.runtime.events.SQSEvent;
1010
import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrappedLambda;
1111
import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.WrapperConfiguration;
12+
import io.opentelemetry.instrumentation.awslambdaevents.common.v2_2.internal.LambdaParameters;
1213
import io.opentelemetry.sdk.OpenTelemetrySdk;
1314
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
1415
import java.lang.reflect.InvocationTargetException;
1516
import java.lang.reflect.Method;
1617

18+
/**
19+
* @deprecated use {@link
20+
* io.opentelemetry.instrumentation.awslambdaevents.v3_11.TracingSqsEventWrapper} instead.
21+
*/
22+
@Deprecated
1723
public class TracingSqsEventWrapper extends TracingSqsEventHandler {
1824

1925
private final WrappedLambda wrappedLambda;

0 commit comments

Comments
 (0)