opentelemetry-lambda
opentelemetry-lambda copied to clipboard
Java lambda layer relies on joda, but we are not including it as dependency in the wrapper or agent
Describe the bug
The request handler for the java layer-wrapper uses joda: https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestWrapperBase.java#L33
However joda is not being added as runtime dependency of our lambda layer.
We did not notice it because in our sample applications, we are adding a dependency on aws-lambda-java-events. which provides joda as a transitive dependency.
https://github.com/open-telemetry/opentelemetry-lambda/blob/main/java/sample-apps/aws-sdk/build.gradle.kts#L9
https://search.maven.org/artifact/com.amazonaws/aws-lambda-java-events/3.11.0/jar
Steps to reproduce Create any lambda application without a dependency on aws-lambda-java-events
What did you expect to see? I would expect the lambda layer to work with the minimal number of dependencies for any lambda to work or I would expect the documentation to be explicit about what dependencies are required for an application using the adot lambda layer to work.
What did you see instead? Error when trying to use the lambda layer:
Error loading class io.opentelemetry.instrumentation.awslambdaevents.v2_2.TracingRequestApiGatewayWrapper: org/joda/time/DateTime: java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundError: org/joda/time/DateTime
at io.opentelemetry.instrumentation.awslambdaevents.v2_2.CustomJodaModule.<init>(CustomJodaModule.java:38)
at io.opentelemetry.instrumentation.awslambdaevents.v2_2.TracingRequestWrapperBase.<clinit>(TracingRequestWrapperBase.java:31)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Unknown Source)
What version of collector/language SDK version did you use? Java instrumentation 1.17, 1.18 and 1.19
What language layer did you use? Java
Workaround: Include aws-lambda-java-events as runtime dependency of your application.
We should consider solving this in the java-instrumentation https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/aws-lambda/aws-lambda-events-2.2/library/build.gradle.kts#L19
It's worth noting that the issue is not isolated to just Joda library. If I added Joda manually to my app, then I'd pass that error and see another one:
com/amazonaws/services/lambda/runtime/events/APIGatewayProxyRequestEvent: java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundError: com/amazonaws/services/lambda/runtime/events/APIGatewayProxyRequestEvent
at io.opentelemetry.instrumentation.awslambdaevents.v2_2.TracingRequestWrapperBase.extractHttpHeaders(TracingRequestWrapperBase.java:79)
at io.opentelemetry.instrumentation.awslambdacore.v1_0.TracingRequestHandler.handleRequest(TracingRequestHandler.java:68)
Caused by: java.lang.ClassNotFoundException: com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent.
... which indicates that the aws-lambda-java-events is also required but is not available: https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/f236b2d4c9a0813b2dddf3d35928c79b21beb6d5/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/TracingRequestWrapperBase.java#L79
This issue was marked stale. It will be closed in 30 days without additional activity.