Skip to content

Commit 043b9ef

Browse files
authored
Upgrade Java Lambda Layer to 2.x (#1076)
*Issue #, if available:* This PR changes mainline and upgrades the Java Lambda Layer to **2.10.0** and migrates the Lambda Layer build code in the 1.33.x release branch to main branch. *Description of changes:* 1. Changed the build-layer.sh to also apply patching from current ADOT SDK in `.github` 2. Added the lambda build step to the main and pr build workflows. 3. Added `StreamHandlerInstrumentation.patch` patching file to pulled from release/v1.33.x 4. Removed Active span linking tracing from patches as this has already been applied to upstream: open-telemetry/opentelemetry-java-instrumentation@d7e9098#diff-219664837e8bb1881334baba6fae9fa9c4980557d7307552bbfa93e29ace75fc 5. Removed SQS span linking as this is already handled by AWS vended segments 6. Removed dependency on AwsXrayPropagator in `AwsLambdaFunctionInstrumenterFactory` and `ParentContextExtractor`. The global propagators we use in the instrumentation already has the xray propagator in the configuration see: https://github.com/aws-observability/aws-otel-java-instrumentation/blob/main/lambda-layer/otel-instrument#L5 7. Patched `AwsLambdaFunctionInstrumenterFactory` to look for Xray Trace context from Lambda in 3 separate locations: - Environment variables - Http Header - Lambda Context (trace id pulled from `X_AMZN_TRACE_ID` environment variable **overrides** trace id pulled from Lambda Context **overrides** trace id pulled from Http Header) Integration Test pass: https://github.com/aws-observability/aws-application-signals-test-framework/actions/runs/14582217777 Manual end-to-end testing was done by deploying the [APIGW-Lambda sample app](https://github.com/aws-observability/aws-otel-java-instrumentation/tree/main/sample-apps/apigateway-lambda) and calling the endpoint and verified a full complete trace: ``` { "Id": "1-68067bca-0df176812ae1fd3537266942", "Duration": 10.363, "Segments": [ { "Id": "30dcafd162b1ff67", "Document": { "id": "30dcafd162b1ff67", "name": "aws-opentelemetry-distro-java/default", "start_time": 1745255370.5460002, "trace_id": "1-68067bca-0df176812ae1fd3537266942", "end_time": 1745255380.909, "http": { "request": { "url": "https://v4mrdyqjl1.execute-api.us-east-1.amazonaws.com/default/lambda", "method": "GET", "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36", "client_ip": "15.248.7.8", "x_forwarded_for": true }, "response": { "status": 200, "content_length": 0 } }, "aws": { "span.kind": "LOCAL_ROOT", "xray.origin": "AWS::ApiGateway::Stage", "api_gateway.stage": "default", "api_gateway.rest_api_id": "v4mrdyqjl1", "api_gateway": { "account_id": "571600841604", "rest_api_id": "v4mrdyqjl1", "stage": "default", "request_id": "594d97d9-9be4-4d3f-a6ba-631e4f6435f2" }, "api_gateway.name": "aws-opentelemetry-distro-java/default", "request_id": "594d97d9-9be4-4d3f-a6ba-631e4f6435f2" }, "annotations": { "aws:span.name": "GET /lambda", "aws:api_id": "v4mrdyqjl1", "aws:aws.local.environment": "api-gateway:default", "aws:aws.local.service": "aws-opentelemetry-distro-java", "aws:api_stage": "default", "aws:span.kind": "SERVER", "aws:aws.local.operation": "GET /lambda" }, "metadata": { "user_agent.original": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36", "telemetry.extended": "true", "service.name": "aws-opentelemetry-distro-java", "extended_request_id": "JYhHtF3boAMERgg=", "http.url": "https://v4mrdyqjl1.execute-api.us-east-1.amazonaws.com/default/lambda", "http.response.header.content-length": 0, "http.client_ip": "15.248.7.8", "client.address": "15.248.7.8", "http.status_code": 200, "cloud.provider": "aws", "http.request.method": "GET", "http.response_content_length": 0, "cloud.account.id": "571600841604", "http.user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36", "cloud.resource_id": "arn:aws:apigateway:us-east-1::/restapis/v4mrdyqjl1/stages/default", "PlatformType": "Generic", "http.method": "GET", "url.full": "https://v4mrdyqjl1.execute-api.us-east-1.amazonaws.com/default/lambda", "http.response.status_code": 200, "request_id": "594d97d9-9be4-4d3f-a6ba-631e4f6435f2", "cloud.platform": "aws_api_gateway" }, "origin": "AWS::ApiGateway::Stage", "subsegments": [ { "id": "5799a265c952cf75", "name": "Lambda", "start_time": 1745255370.549, "end_time": 1745255380.908, "http": { "request": { "url": "https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-east-1:571600841604:function:aws-opentelemetry-distro-java/invocations", "method": "ANY" }, "response": { "status": 200, "content_length": 181 } }, "aws": { "span.kind": "CLIENT", "api_gateway.stage": "default", "function_name": "aws-opentelemetry-distro-java", "api_gateway.rest_api_id": "v4mrdyqjl1", "api_gateway": { "account_id": "571600841604", "rest_api_id": "v4mrdyqjl1", "stage": "default" }, "region": "us-east-1", "operation": "Invoke", "resource_names": [ "aws-opentelemetry-distro-java" ] }, "annotations": { "aws.local.service": "aws-opentelemetry-distro-java", "span.name": "awslambda.Invoke", "aws.local.operation": "GET /lambda", "span.kind": "CLIENT", "aws.remote.service": "aws-opentelemetry-distro-java", "aws.remote.operation": "Invoke", "aws.local.environment": "api-gateway:default" }, "metadata": { "telemetry.extended": "true", "service.name": "aws-opentelemetry-distro-java", "rpc.service": "awslambda", "http.url": "https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-east-1:571600841604:function:aws-opentelemetry-distro-java/invocations", "http.response.header.content-length": 181, "rpc.system": "aws-api", "http.status_code": 200, "cloud.provider": "aws", "http.request.method": "ANY", "http.response_content_length": 181, "cloud.account.id": "571600841604", "rpc.method": "Invoke", "cloud.resource_id": "arn:aws:apigateway:us-east-1::/restapis/v4mrdyqjl1/stages/default", "PlatformType": "Generic", "http.method": "ANY", "url.full": "https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-east-1:571600841604:function:aws-opentelemetry-distro-java/invocations", "http.response.status_code": 200, "cloud.platform": "aws_api_gateway" }, "namespace": "aws" } ] } }, { "Id": "4bafe60730a6e432", "Document": { "id": "4bafe60730a6e432", "name": "aws-opentelemetry-distro-java", "start_time": 1745255370.581, "trace_id": "1-68067bca-0df176812ae1fd3537266942", "end_time": 1745255380.829, "parent_id": "5799a265c952cf75", "http": { "response": { "status": 200 } }, "aws": { "lambda.name": "aws-opentelemetry-distro-java", "span.kind": "SERVER", "xray.origin": "AWS::Lambda", "request_id": "2a7a8eed-8152-4f06-9cd9-e34e9a91893c" }, "annotations": { "aws:span.name": "aws-opentelemetry-distro-java/LambdaService", "aws:aws.local.environment": "lambda:default", "aws:aws.local.service": "aws-opentelemetry-distro-java", "aws:span.kind": "SERVER", "aws:aws.local.operation": "aws-opentelemetry-distro-java/LambdaService" }, "metadata": { "http.status_code": 200, "cloud.provider": "aws", "faas.invocation_id": "2a7a8eed-8152-4f06-9cd9-e34e9a91893c", "telemetry.extended": "true", "service.name": "aws-opentelemetry-distro-java", "faas.name": "aws-opentelemetry-distro-java", "cloud.resource_id": "arn:aws:lambda:us-east-1:571600841604:function:aws-opentelemetry-distro-java", "PlatformType": "AWS::Lambda", "http.response.status_code": 200, "faas.trigger": "http", "cloud.platform": "aws_lambda" }, "origin": "AWS::Lambda" } }, { "Id": "d4e554351f5045a5", "Document": { "id": "d4e554351f5045a5", "name": "aws-opentelemetry-distro-java", "start_time": 1745255375.805954, "trace_id": "1-68067bca-0df176812ae1fd3537266942", "end_time": 1745255380.829593, "parent_id": "4bafe60730a6e432", "aws": { "lambda.name": "aws-opentelemetry-distro-java", "xray.origin": "AWS::Lambda::Function", "cloudwatch_logs": [ { "log_group": "/aws/lambda/aws-opentelemetry-distro-java" } ] }, "annotations": { "aws:responseLatency": 5022.715, "aws:span.name": "aws-opentelemetry-distro-java/LambdaExecutionEnvironment", "aws:runtimeOverhead": 0.198, "aws:span.kind": "SERVER", "aws:responseDuration": 0.086 }, "metadata": { "cloud.provider": "aws", "service.name": "aws-opentelemetry-distro-java", "faas.name": "aws-opentelemetry-distro-java", "cloud.platform": "aws_lambda" }, "origin": "AWS::Lambda::Function", "subsegments": [ { "id": "ce0f98b1478c0bda", "name": "Overhead", "start_time": 1745255380.828, "end_time": 1745255380.828198, "aws": { "lambda.name": "Overhead", "xray.origin": "AWS::Lambda::Function" }, "annotations": { "span.name": "Overhead/LambdaExecutionEnvironment", "span.kind": "INTERNAL" }, "metadata": { "cloud.provider": "aws", "service.name": "Overhead", "faas.name": "Overhead", "cloud.platform": "aws_lambda" } }, { "id": "4ecdb762e94f4068", "name": "Init", "start_time": 1745255371.61021, "end_time": 1745255375.80189, "aws": { "lambda.name": "Init", "xray.origin": "AWS::Lambda::Function" }, "annotations": { "span.name": "Init/LambdaExecutionEnvironment", "span.kind": "INTERNAL" }, "metadata": { "cloud.provider": "aws", "service.name": "Init", "faas.name": "Init", "cloud.platform": "aws_lambda" } } ] } }, { "Id": "8a74a05108dfd6f5", "Document": { "id": "8a74a05108dfd6f5", "name": "aws-opentelemetry-distro-java", "start_time": 1745255375.9077334, "trace_id": "1-68067bca-0df176812ae1fd3537266942", "end_time": 1745255380.626341, "parent_id": "d4e554351f5045a5", "aws": { "span.kind": "LOCAL_ROOT", "cloudwatch_logs": [ { "log_group": "/aws/lambda/aws-opentelemetry-distro-java" } ] }, "annotations": { "aws.local.service": "aws-opentelemetry-distro-java", "span.name": "aws-opentelemetry-distro-java", "aws.local.operation": "aws-opentelemetry-distro-java/FunctionHandler", "span.kind": "SERVER", "aws.local.environment": "lambda:default" }, "metadata": { "telemetry.distro.version": "2.10.0-adot-lambda1-aws", "process.command_args": [ "/var/lang/bin/java", "-XX:MaxHeapSize=445645k", "-javaagent:/var/runtime/lib/Log4jHotPatch.jar=log4jFixerVerbose=false", "-XX:+UseSerialGC", "-Xshare:on", "-XX:SharedArchiveFile=/var/lang/lib/server/runtime.jsa", "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "--add-opens=java.base/java.io=ALL-UNNAMED", "-Dorg.crac.Core.Compat=com.amazonaws.services.lambda.crac", "-XX:+ErrorFileToStderr", "-Dcom.amazonaws.services.lambda.runtime.api.client.runtimeapi.NativeClient.JNI=/var/runtime/lib/jni/libaws-lambda-jni.linux-x86_64.so", "-classpath", "/var/runtime/lib/aws-lambda-java-core-1.2.3.jar:/var/runtime/lib/aws-lambda-java-runtime-interface-client-2.6.0-linux-x86_64.jar:/var/runtime/lib/aws-lambda-java-serialization-1.1.5.jar", "com.amazonaws.services.lambda.runtime.api.client.AWSLambda", "com.amazon.sampleapp.LambdaHandler::handleRequest" ], "process.runtime.version": "17.0.14+7-LTS", "os.type": "linux", "thread.name": "main", "process.pid": 2, "telemetry.sdk.name": "opentelemetry", "telemetry.sdk.language": "java", "process.runtime.name": "OpenJDK Runtime Environment", "service.instance.id": "0efc9fb1-017c-4305-825f-0e5c59d2dece", "os.description": "Linux 5.10.234-246.921.amzn2.x86_64", "host.arch": "amd64", "cloud.resource_id": "arn:aws:lambda:us-east-1:571600841604:function:aws-opentelemetry-distro-java", "host.name": "169.254.26.217", "telemetry.sdk.version": "1.44.1", "cloud.platform": "aws_lambda", "thread.id": 1, "cloud.region": "us-east-1", "service.name": "aws-opentelemetry-distro-java", "faas.name": "aws-opentelemetry-distro-java", "telemetry.distro.name": "opentelemetry-java-instrumentation", "cloud.provider": "aws", "faas.invocation_id": "2a7a8eed-8152-4f06-9cd9-e34e9a91893c", "cloud.account.id": "571600841604", "process.executable.path": "/var/lang/bin/java", "faas.instance": "2025/04/21/[$LATEST]4dbc1340125248209e4be7478b359603", "faas.version": "$LATEST", "PlatformType": "AWS::Lambda", "process.runtime.description": "Amazon.com Inc. OpenJDK 64-Bit Server VM 17.0.14+7-LTS" }, "subsegments": [ { "id": "7da9101595299089", "name": "S3", "start_time": 1745255379.5510905, "end_time": 1745255380.6079786, "http": { "request": { "url": "https://s3.us-east-1.amazonaws.com/", "method": "GET" }, "response": { "status": 200 } }, "aws": { "agent": "java-aws-sdk", "span.kind": "CLIENT", "cloudwatch_logs": [ { "log_group": "/aws/lambda/aws-opentelemetry-distro-java" } ], "request_id": "BH7B7E1P6X1SX5PF" }, "annotations": { "aws.local.service": "aws-opentelemetry-distro-java", "span.name": "S3.ListBuckets", "aws.local.operation": "aws-opentelemetry-distro-java/FunctionHandler", "span.kind": "CLIENT", "aws.remote.service": "AWS::S3", "aws.remote.operation": "ListBuckets", "aws.local.environment": "lambda:default" }, "metadata": { "telemetry.distro.version": "2.10.0-adot-lambda1-aws", "rpc.service": "S3", "process.command_args": [ "/var/lang/bin/java", "-XX:MaxHeapSize=445645k", "-javaagent:/var/runtime/lib/Log4jHotPatch.jar=log4jFixerVerbose=false", "-XX:+UseSerialGC", "-Xshare:on", "-XX:SharedArchiveFile=/var/lang/lib/server/runtime.jsa", "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "--add-opens=java.base/java.io=ALL-UNNAMED", "-Dorg.crac.Core.Compat=com.amazonaws.services.lambda.crac", "-XX:+ErrorFileToStderr", "-Dcom.amazonaws.services.lambda.runtime.api.client.runtimeapi.NativeClient.JNI=/var/runtime/lib/jni/libaws-lambda-jni.linux-x86_64.so", "-classpath", "/var/runtime/lib/aws-lambda-java-core-1.2.3.jar:/var/runtime/lib/aws-lambda-java-runtime-interface-client-2.6.0-linux-x86_64.jar:/var/runtime/lib/aws-lambda-java-serialization-1.1.5.jar", "com.amazonaws.services.lambda.runtime.api.client.AWSLambda", "com.amazon.sampleapp.LambdaHandler::handleRequest" ], "process.runtime.version": "17.0.14+7-LTS", "os.type": "linux", "thread.name": "main", "process.pid": 2, "telemetry.sdk.name": "opentelemetry", "server.address": "s3.us-east-1.amazonaws.com", "telemetry.sdk.language": "java", "process.runtime.name": "OpenJDK Runtime Environment", "http.request.method": "GET", "service.instance.id": "0efc9fb1-017c-4305-825f-0e5c59d2dece", "os.description": "Linux 5.10.234-246.921.amzn2.x86_64", "rpc.method": "ListBuckets", "server.port": 443, "host.arch": "amd64", "host.name": "169.254.26.217", "telemetry.sdk.version": "1.44.1", "http.response.status_code": 200, "url.full": "https://s3.us-east-1.amazonaws.com/", "cloud.platform": "aws_lambda", "thread.id": 1, "cloud.region": "us-east-1", "service.name": "aws-opentelemetry-distro-java", "faas.name": "aws-opentelemetry-distro-java", "telemetry.distro.name": "opentelemetry-java-instrumentation", "rpc.system": "aws-api", "cloud.provider": "aws", "process.executable.path": "/var/lang/bin/java", "faas.instance": "2025/04/21/[$LATEST]4dbc1340125248209e4be7478b359603", "faas.version": "$LATEST", "PlatformType": "AWS::Lambda", "process.runtime.description": "Amazon.com Inc. OpenJDK 64-Bit Server VM 17.0.14+7-LTS" }, "namespace": "aws" }, { "id": "84714146f4414c5b", "name": "aws.amazon.com", "start_time": 1745255376.7475927, "end_time": 1745255379.0668135, "http": { "request": { "url": "https://aws.amazon.com/", "method": "GET" }, "response": { "status": 200 } }, "aws": { "span.kind": "CLIENT", "cloudwatch_logs": [ { "log_group": "/aws/lambda/aws-opentelemetry-distro-java" } ] }, "annotations": { "aws.local.service": "aws-opentelemetry-distro-java", "span.name": "GET", "aws.local.operation": "aws-opentelemetry-distro-java/FunctionHandler", "span.kind": "CLIENT", "aws.remote.service": "aws.amazon.com", "aws.remote.operation": "GET /", "aws.local.environment": "lambda:default" }, "metadata": { "telemetry.distro.version": "2.10.0-adot-lambda1-aws", "process.command_args": [ "/var/lang/bin/java", "-XX:MaxHeapSize=445645k", "-javaagent:/var/runtime/lib/Log4jHotPatch.jar=log4jFixerVerbose=false", "-XX:+UseSerialGC", "-Xshare:on", "-XX:SharedArchiveFile=/var/lang/lib/server/runtime.jsa", "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "--add-opens=java.base/java.io=ALL-UNNAMED", "-Dorg.crac.Core.Compat=com.amazonaws.services.lambda.crac", "-XX:+ErrorFileToStderr", "-Dcom.amazonaws.services.lambda.runtime.api.client.runtimeapi.NativeClient.JNI=/var/runtime/lib/jni/libaws-lambda-jni.linux-x86_64.so", "-classpath", "/var/runtime/lib/aws-lambda-java-core-1.2.3.jar:/var/runtime/lib/aws-lambda-java-runtime-interface-client-2.6.0-linux-x86_64.jar:/var/runtime/lib/aws-lambda-java-serialization-1.1.5.jar", "com.amazonaws.services.lambda.runtime.api.client.AWSLambda", "com.amazon.sampleapp.LambdaHandler::handleRequest" ], "process.runtime.version": "17.0.14+7-LTS", "os.type": "linux", "thread.name": "main", "process.pid": 2, "telemetry.sdk.name": "opentelemetry", "server.address": "aws.amazon.com", "telemetry.sdk.language": "java", "process.runtime.name": "OpenJDK Runtime Environment", "http.request.method": "GET", "service.instance.id": "0efc9fb1-017c-4305-825f-0e5c59d2dece", "os.description": "Linux 5.10.234-246.921.amzn2.x86_64", "host.arch": "amd64", "host.name": "169.254.26.217", "telemetry.sdk.version": "1.44.1", "http.response.status_code": 200, "url.full": "https://aws.amazon.com/", "cloud.platform": "aws_lambda", "thread.id": 1, "cloud.region": "us-east-1", "service.name": "aws-opentelemetry-distro-java", "network.protocol.version": "2", "faas.name": "aws-opentelemetry-distro-java", "telemetry.distro.name": "opentelemetry-java-instrumentation", "cloud.provider": "aws", "process.executable.path": "/var/lang/bin/java", "faas.instance": "2025/04/21/[$LATEST]4dbc1340125248209e4be7478b359603", "faas.version": "$LATEST", "PlatformType": "AWS::Lambda", "process.runtime.description": "Amazon.com Inc. OpenJDK 64-Bit Server VM 17.0.14+7-LTS" }, "namespace": "remote" } ] } }, { "Id": "0808b39d231c46ae", "Document": { "id": "0808b39d231c46ae", "name": "aws.amazon.com", "start_time": 1745255376.7475927, "trace_id": "1-68067bca-0df176812ae1fd3537266942", "end_time": 1745255379.0668135, "parent_id": "84714146f4414c5b", "inferred": true, "http": { "request": { "url": "https://aws.amazon.com/", "method": "GET" }, "response": { "status": 200 } }, "annotations": { "aws.local.service": "aws.amazon.com", "aws.local.operation": "GET /" } } }, { "Id": "27206ef03a6b5459", "Document": { "id": "27206ef03a6b5459", "name": "S3", "start_time": 1745255379.5510905, "trace_id": "1-68067bca-0df176812ae1fd3537266942", "end_time": 1745255380.6079786, "parent_id": "7da9101595299089", "inferred": true, "http": { "request": { "url": "https://s3.us-east-1.amazonaws.com/", "method": "GET" }, "response": { "status": 200 } }, "aws": { "agent": "java-aws-sdk", "span.kind": "CLIENT", "cloudwatch_logs": [ { "log_group": "/aws/lambda/aws-opentelemetry-distro-java" } ], "request_id": "BH7B7E1P6X1SX5PF" }, "annotations": { "aws.local.service": "AWS::S3", "aws.local.operation": "ListBuckets" }, "origin": "AWS::S3" } } ] } ``` <img width="1529" alt="image" src="https://github.com/user-attachments/assets/640a7d65-fb8c-40f5-a8a0-4f8588254c3d" /> By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 528df6c commit 043b9ef

9 files changed

+674
-388
lines changed

.github/workflows/application-signals-e2e-test.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,3 +238,10 @@ jobs:
238238
adot-image-name: ${{ inputs.adot-image-name }}
239239
caller-workflow-name: 'main-build'
240240
java-version: '11'
241+
242+
java-lambda-test:
243+
uses: aws-observability/aws-application-signals-test-framework/.github/workflows/java-lambda-test.yml@main
244+
secrets: inherit
245+
with:
246+
aws-region: us-east-1
247+
caller-workflow-name: 'main-build'

.github/workflows/main-build.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,35 @@ jobs:
226226
with:
227227
arguments: contractTests -PlocalDocker=true
228228

229+
application-signals-lambda-layer-build:
230+
runs-on: ubuntu-latest
231+
steps:
232+
- uses: actions/checkout@v4
233+
with:
234+
fetch-depth: 0
235+
- uses: actions/setup-java@v4
236+
with:
237+
java-version: 17
238+
distribution: 'temurin'
239+
- name: Build Application Signals Lambda Layer
240+
working-directory: lambda-layer
241+
run: |
242+
./build-layer.sh
243+
- name: Upload layer zip to GitHub Actions
244+
uses: actions/upload-artifact@v4
245+
with:
246+
name: aws-opentelemetry-java-layer.zip
247+
path: lambda-layer/build/distributions/aws-opentelemetry-java-layer.zip
248+
- name: Configure AWS Credentials
249+
uses: aws-actions/configure-aws-credentials@v4
250+
with:
251+
role-to-assume: arn:aws:iam::${{ secrets.APPLICATION_SIGNALS_E2E_TEST_ACCOUNT_ID }}:role/${{ secrets.APPLICATION_SIGNALS_E2E_TEST_ROLE_NAME }}
252+
aws-region: us-east-1
253+
- name: Upload layer zip to S3
254+
working-directory: lambda-layer
255+
run: |
256+
aws s3 cp ./build/distributions/aws-opentelemetry-java-layer.zip s3://adot-main-build-staging-jar/adot-java-lambda-layer-${{ github.run_id }}.zip
257+
229258
application-signals-e2e-test:
230259
needs: [build]
231260
uses: ./.github/workflows/application-signals-e2e-test.yml

.github/workflows/pr-build.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,19 @@ jobs:
160160
arguments: build --stacktrace -PenableCoverage=true
161161
- uses: codecov/codecov-action@v3
162162

163+
build-lambda:
164+
runs-on: ubuntu-latest
165+
steps:
166+
- name: Checkout Repo @ SHA - ${{ github.sha }}
167+
uses: actions/checkout@v4
168+
169+
- name: Setup Java
170+
uses: actions/setup-java@v4
171+
with:
172+
java-version: 17
173+
distribution: temurin
174+
175+
- name: Build layer
176+
working-directory: lambda-layer
177+
run: ./build-layer.sh
178+

lambda-layer/build-layer.sh

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
#!/bin/bash
2+
set -e
23

34
SOURCEDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
45

56

67
## Get OTel version
8+
echo "Info: Getting OTEL Version"
79
file="$SOURCEDIR/../.github/patches/versions"
810
version=$(awk -F'=v' '/OTEL_JAVA_INSTRUMENTATION_VERSION/ {print $2}' "$file")
911
echo "Found OTEL Version: ${version}"
@@ -15,34 +17,47 @@ fi
1517

1618

1719
## Clone and Patch the OpenTelemetry Java Instrumentation Repository
20+
echo "Info: Cloning and Patching OpenTelemetry Java Instrumentation Repository"
1821
git clone https://github.com/open-telemetry/opentelemetry-java-instrumentation.git
1922
pushd opentelemetry-java-instrumentation
2023
git checkout v${version} -b tag-v${version}
2124

25+
# There is another patch in the .github/patches directory for other changes. We should apply them too for consistency.
26+
patch -p1 < "$SOURCEDIR"/../.github/patches/opentelemetry-java-instrumentation.patch
27+
2228
# This patch is for Lambda related context propagation
2329
patch -p1 < "$SOURCEDIR"/patches/opentelemetry-java-instrumentation.patch
2430

25-
# There is another patch in the .github/patches directory for other changes. We should apply them too for consistency.
26-
patch -p1 < "$SOURCEDIR"/../.github/patches/opentelemetry-java-instrumentation.patch
31+
patch -p1 < "$SOURCEDIR"/patches/StreamHandlerInstrumentation.patch
2732

28-
git add -A
29-
git commit -m "Create patch version"
3033
./gradlew publishToMavenLocal
3134
popd
3235
rm -rf opentelemetry-java-instrumentation
3336

3437

3538
## Build the ADOT Java from current source
39+
echo "Info: Building ADOT Java from current source"
3640
pushd "$SOURCEDIR"/..
3741
patch -p1 < "${SOURCEDIR}"/patches/aws-otel-java-instrumentation.patch
3842
CI=false ./gradlew publishToMavenLocal -Prelease.version=${version}-adot-lambda1
3943
popd
4044

4145

4246
## Build ADOT Lambda Java SDK Layer Code
43-
./gradlew build
47+
echo "Info: Building ADOT Lambda Java SDK Layer Code"
48+
./gradlew build -PotelVersion=${version}
4449

4550

4651
## Copy ADOT Java Agent downloaded using Gradle task and bundle it with the Lambda handler script
47-
cp "$SOURCEDIR"/build/javaagent/aws-opentelemetry-agent*.jar ./opentelemetry-javaagent.jar
48-
zip -qr opentelemetry-javaagent-layer.zip opentelemetry-javaagent.jar otel-instrument
52+
echo "Info: Creating the layer artifact"
53+
mkdir -p "$SOURCEDIR"/build/distributions/
54+
cp "$SOURCEDIR"/build/javaagent/aws-opentelemetry-agent*.jar "$SOURCEDIR"/build/distributions/aws-opentelemetry-javaagent.jar
55+
cp otel-instrument "$SOURCEDIR"/build/distributions/otel-instrument
56+
pushd "$SOURCEDIR"/build/distributions
57+
zip -r aws-opentelemetry-java-layer.zip aws-opentelemetry-javaagent.jar otel-instrument
58+
popd
59+
60+
## Cleanup
61+
# revert the patch applied since it is only needed while building the layer.
62+
echo "Info: Cleanup"
63+
git restore ../dependencyManagement/build.gradle.kts

lambda-layer/build.gradle.kts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,15 @@ val javaagentDependency by configurations.creating {
2727
extendsFrom()
2828
}
2929

30+
val otelVersion: String by project
31+
3032
dependencies {
31-
compileOnly(platform("io.opentelemetry:opentelemetry-bom:1.32.1"))
32-
compileOnly(platform("io.opentelemetry:opentelemetry-bom-alpha:1.32.1-alpha"))
33+
compileOnly(platform("io.opentelemetry:opentelemetry-bom:$otelVersion"))
34+
compileOnly(platform("io.opentelemetry:opentelemetry-bom-alpha:$otelVersion-alpha"))
3335
// Already included in wrapper so compileOnly
3436
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
3537
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-aws")
36-
javaagentDependency("software.amazon.opentelemetry:aws-opentelemetry-agent:1.32.1-adot-lambda1")
38+
javaagentDependency("software.amazon.opentelemetry:aws-opentelemetry-agent:$otelVersion-adot-lambda1")
3739
}
3840

3941
tasks.register<Copy>("download") {

lambda-layer/otel-instrument

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export OTEL_PROPAGATORS="${OTEL_PROPAGATORS:-baggage,xray,tracecontext,b3,b3mult
66

77
export OTEL_SERVICE_NAME=${OTEL_SERVICE_NAME:-${AWS_LAMBDA_FUNCTION_NAME}}
88

9-
export JAVA_TOOL_OPTIONS="-javaagent:/opt/opentelemetry-javaagent.jar ${JAVA_TOOL_OPTIONS}"
9+
export JAVA_TOOL_OPTIONS="-javaagent:/opt/aws-opentelemetry-javaagent.jar ${JAVA_TOOL_OPTIONS}"
1010

1111
if [[ $OTEL_RESOURCE_ATTRIBUTES != *"service.name="* ]]; then
1212
export OTEL_RESOURCE_ATTRIBUTES="service.name=${AWS_LAMBDA_FUNCTION_NAME},${OTEL_RESOURCE_ATTRIBUTES}"
@@ -35,4 +35,34 @@ else
3535
export OTEL_RESOURCE_ATTRIBUTES="$LAMBDA_RESOURCE_ATTRIBUTES,$OTEL_RESOURCE_ATTRIBUTES";
3636
fi
3737

38-
exec "$@"
38+
# Enable default instrumentations
39+
export OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED=${OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED:-"false"}
40+
export OTEL_INSTRUMENTATION_OPENTELEMETRY_API_ENABLED=${OTEL_INSTRUMENTATION_OPENTELEMETRY_API_ENABLED:-"true"}
41+
export OTEL_INSTRUMENTATION_AWS_LAMBDA_ENABLED=${OTEL_INSTRUMENTATION_AWS_LAMBDA_ENABLED:-"true"}
42+
export OTEL_INSTRUMENTATION_AWS_SDK_ENABLED=${OTEL_INSTRUMENTATION_AWS_SDK_ENABLED:-"true"}
43+
export OTEL_INSTRUMENTATION_APACHE_HTTPCLIENT_ENABLED=${OTEL_INSTRUMENTATION_APACHE_HTTPCLIENT_ENABLED:-"true"}
44+
export OTEL_INSTRUMENTATION_JAVA_HTTP_CLIENT_ENABLED=${OTEL_INSTRUMENTATION_JAVA_HTTP_CLIENT_ENABLED:-"true"}
45+
export OTEL_INSTRUMENTATION_NETTY_ENABLED=${OTEL_INSTRUMENTATION_NETTY_ENABLED:-"true"}
46+
47+
ARGS=("$@")
48+
EXTRA_ARGS=()
49+
50+
if [ "${OTEL_JAVA_AGENT_FAST_STARTUP_ENABLED}" == "true" ]; then
51+
echo "[OTEL] Enabling fast startup mode ..."
52+
# Disable bytecode verification
53+
EXTRA_ARGS+=("-Xverify:none")
54+
# Be sure that tiered compilation is enabled
55+
EXTRA_ARGS+=("-XX:+TieredCompilation")
56+
# Stop tiered compilation at level 1
57+
EXTRA_ARGS+=("-XX:TieredStopAtLevel=1")
58+
for i in "${!ARGS[@]}"; do
59+
# If tiered compilation is disabled, ignore it as we enable it at level 1 for fast startup
60+
if [[ ${ARGS[i]} = "-XX:-TieredCompilation" ]]; then
61+
unset 'ARGS[i]'
62+
fi
63+
done
64+
fi
65+
66+
ARGS=("${ARGS[0]}" "${EXTRA_ARGS[@]}" "${ARGS[@]:1}")
67+
68+
exec "${ARGS[@]}"

0 commit comments

Comments
 (0)