AWS Lambda OpenTelemetry Instrumentation
Brief guide to instrument AWS Lambda functions with OpenTelemetry using Lambda layers for automatic tracing with direct export to Scout Collector.
Overview​
This guide covers auto-instrumentation of AWS Lambda functions using OpenTelemetry Lambda layers. The language-specific layer automatically instruments your code and exports traces to the Scout collector.
Key benefits:
- Zero-code instrumentation
- Automatic trace generation
- Minimal performance overhead
Prerequisites​
- AWS Lambda function (Python 3.8+, Node.js 18+, Java 17+, or Ruby 3.2+)
- Lambda execution role with CloudWatch Logs permissions
- Scout Collector OTLP endpoint URL
Layer ARNs by Region​
OpenTelemetry Lambda layers are available in all AWS regions. Use the following ARN format:
arn:aws:lambda:<region>:184161586896:layer:opentelemetry-<runtime>-<version>:1
Example for ap-south-1 (Mumbai):
- Python:
arn:aws:lambda:ap-south-1:184161586896:layer:opentelemetry-python-0_17_0:1 - Node.js:
arn:aws:lambda:ap-south-1:184161586896:layer:opentelemetry-nodejs-0_17_0:1 - Java Agent:
arn:aws:lambda:ap-south-1:184161586896:layer:opentelemetry-javaagent-0_16_0:1 - Ruby:
arn:aws:lambda:ap-south-1:184161586896:layer:opentelemetry-ruby-0_10_0:1
Replace <region> with your AWS region and check
OpenTelemetry Lambda releases
for the latest versions.
Step 1: Add Lambda Layers​
Add both the language-specific layer and collector layer to your function:
- Python
- Node.js
- Java
- Ruby
aws lambda update-function-configuration \
--function-name <function-name> \
--region ap-south-1 \
--layers \
"arn:aws:lambda:ap-south-1:184161586896:layer:opentelemetry-python-0_17_0:1" \
"arn:aws:lambda:ap-south-1:184161586896:layer:opentelemetry-collector-amd64-0_18_0:1"
aws lambda update-function-configuration \
--function-name <function-name> \
--region ap-south-1 \
--layers \
"arn:aws:lambda:ap-south-1:184161586896:layer:opentelemetry-nodejs-0_17_0:1" \
"arn:aws:lambda:ap-south-1:184161586896:layer:opentelemetry-collector-amd64-0_18_0:1"
aws lambda update-function-configuration \
--function-name <function-name> \
--region ap-south-1 \
--layers \
"arn:aws:lambda:ap-south-1:184161586896:layer:opentelemetry-javaagent-0_16_0:1" \
"arn:aws:lambda:ap-south-1:184161586896:layer:opentelemetry-collector-amd64-0_18_0:1"
aws lambda update-function-configuration \
--function-name <function-name> \
--region ap-south-1 \
--layers \
"arn:aws:lambda:ap-south-1:184161586896:layer:opentelemetry-ruby-0_10_0:1" \
"arn:aws:lambda:ap-south-1:184161586896:layer:opentelemetry-collector-amd64-0_18_0:1"
Note: For ARM64 architecture, replace amd64 with arm64 in the collector
layer ARN.
Step 2: Understanding the Collector Layer and TelemetryAPI​
The OpenTelemetry Collector layer serves as a sidecar process that collects and exports telemetry data from your Lambda function. It subscribes to the AWS Lambda Telemetry API to automatically capture platform-level telemetry.
What the Collector Layer Collects​
The collector layer collects three types of telemetry:
1. Traces (from instrumentation layer) - Application spans, HTTP/HTTPS requests, database queries, external service calls, and custom spans
2. Logs (via TelemetryAPI) - Function logs (stdout/stderr), platform logs (START, END, REPORT), runtime errors, and structured logs
Resource Requirements​
- Memory overhead: 64-128 MB for collector process
- Timeout: Add 5-10 seconds to allow telemetry export
- Cold start impact: +50-100ms
Step 3: Configure Environment Variables​
Set required environment variables to enable auto-instrumentation:
- Python
- Node.js
- Java
- Ruby
aws lambda update-function-configuration \
--function-name <function-name> \
--region ap-south-1 \
--environment "Variables={
AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument,
OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_LOG_LEVEL=error
OTEL_SERVICE_NAME=<function-name>,
OTEL_TRACES_EXPORTER=otlp,
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318,
OPENTELEMETRY_COLLECTOR_CONFIG_URI=/var/task/collector.yaml
}"
aws lambda update-function-configuration \
--function-name <function-name> \
--region ap-south-1 \
--environment "Variables={
AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-handler,
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_LOG_LEVEL=error
OTEL_SERVICE_NAME=<function-name>,
OTEL_NODE_ENABLED_INSTRUMENTATIONS=aws-lambda,http
OTEL_TRACES_EXPORTER=otlp,
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318,
OPENTELEMETRY_COLLECTOR_CONFIG_URI=/var/task/collector.yaml
}"
aws lambda update-function-configuration \
--function-name <function-name> \
--region ap-south-1 \
--environment "Variables={
AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-handler,
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_LOG_LEVEL=error
OTEL_SERVICE_NAME=<function-name>,
OTEL_TRACES_EXPORTER=otlp,
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318,
OPENTELEMETRY_COLLECTOR_CONFIG_URI=/var/task/collector.yaml
}"
aws lambda update-function-configuration \
--function-name <function-name> \
--region ap-south-1 \
--environment "Variables={
AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-handler,
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_LOG_LEVEL=error
OTEL_SERVICE_NAME=<function-name>,
OTEL_TRACES_EXPORTER=otlp,
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318,
OPENTELEMETRY_COLLECTOR_CONFIG_URI=/var/task/collector.yaml
}"
Note: The OTEL_EXPORTER_OTLP_ENDPOINT is set to http://localhost:4318,
which points to the OTel Collector layer running alongside your Lambda function.
Step 4: Create Collector Configuration​
Create a collector.yaml file in your Lambda function package to configure how
the collector exports telemetry to Scout:
receivers:
otlp:
protocols:
http:
endpoint: localhost:4318
telemetryapi:
exporters:
otlphttp:
endpoint: <scout-backend-endpoint>
service:
pipelines:
traces:
receivers: [otlp, telemetryapi]
exporters: [otlphttp]
metrics:
receivers: [otlp]
exporters: [otlphttp]
logs:
receivers: [otlp, telemetryapi]
exporters: [otlphttp]
Replace <scout-backend-endpoint> with your Scout collector OTLP endpoint
Deploy the collector config with your function:
# Add collector.yaml to your deployment package
zip function.zip lambda_function.* collector.yaml
# Update function code
aws lambda update-function-code \
--function-name <function-name> \
--zip-file fileb://function.zip \
--region ap-south-1
Step 5: Test Your Instrumentation​
Invoke your Lambda function to generate traces. You can use the AWS CLI, AWS Console, or any trigger configured for your function.
View traces in Scout Grafana dashboard
Resource Attributes​
Add custom resource attributes to all spans:
OTEL_RESOURCE_ATTRIBUTES=environment=production,team=backend
Related Guides​
- OTel Collector Configuration - Detailed collector setup
- AWS ECS OTel Setup - Container-based deployments
- Python Custom Instrumentation - Manual Python tracing
- Node.js Custom Instrumentation - Manual Node.js tracing
- Java Custom Instrumentation - Manual Java tracing