Skip to main content

When to Use the ADOT Lambda Layer

The ADOT Lambda Layer is the recommended Lambda ingestion path when your function runtime supports the OpenTelemetry SDK. It is a good fit when you want to:
  • Send logs, metrics, and traces from AWS Lambda directly to Bronto via OTLP, without going through CloudWatch
  • Avoid CloudWatch ingestion fees on Lambda log volume
  • Use the same service.name / service.namespace routing across Lambda, ECS, and EKS workloads
The layer captures logs emitted through the OpenTelemetry logging API in your function code (for example, via the OTel SDK or a bridged framework logger). Lambda’s automatic stdout / stderr capture still goes to CloudWatch β€” to also ship those, use the CloudWatch Log Forwarder alongside the layer, or route your application logger through OTel.

Supported AWS Services

The ADOT Lambda Layer is Lambda-specific: Supported runtimes are listed in the ADOT Lambda documentation β€” currently Node.js, Python, Java, .NET, and Go. For runtimes without OTel SDK support (Ruby, custom runtimes), use the CloudWatch Log Forwarder. For non-Lambda compute, see ADOT β€” ECS / EKS or the overview.

What is the ADOT Lambda Layer?

The ADOT Lambda Layer is an AWS Lambda Layer that wraps your function with an embedded OpenTelemetry Collector. It can export logs, metrics, and traces to an OTLP-compatible backend β€” including Bronto. The exact automatically generated signals depend on the runtime instrumentation included in the layer version.

Bronto OTLP Endpoints

The /v1/logs, /v1/metrics, and /v1/traces endpoints accept OTLP protobuf only. Metrics ingestion is in public beta.
All requests require the header:
See API Keys for how to generate a key.

Setup

Step 1 β€” Add the ADOT Lambda Layer

Add the ADOT managed Lambda Layer to your function. Layer ARNs are region- and architecture-specific. Find the latest ARN for your runtime in the official ADOT Lambda Layer documentation. Via AWS CLI:
Via Terraform:

Step 2 β€” Configure the collector to export to Bronto

Set the OPENTELEMETRY_COLLECTOR_CONFIG_URI environment variable to point to a collector config stored in S3 or SSM Parameter Store, or use inline configuration. Minimal collector config:

Step 3 β€” Set environment variables on your Lambda function

Step 4 β€” Instrument your application code

Add the OTel SDK for your runtime and configure it to export to the local collector. localhost:4317 is the standard OTLP/gRPC default used by this example; use the actual receiver port and protocol if you customize the extension. For per-language setup instructions, see the OpenTelemetry SDK guides.

Data Organization

The Lambda Layer uses OpenTelemetry resource attributes for routing. Bronto maps service.name to a Dataset and service.namespace to a Collection β€” see Data Organization for how datasets, collections, and tags work. Set these via Lambda environment variables β€” the OTel SDK reads them automatically: You can also override routing in the collector config using HTTP headers on the exporter:

Cost Notes

  • The ADOT Lambda Layer itself is free.
  • Logs, metrics, and traces sent through the layer bypass CloudWatch entirely β€” no CloudWatch ingestion fees for those exported signals.
  • Lambda’s automatic stdout / stderr capture still writes to CloudWatch by default. To stop paying for that, route your application logger through the OTel SDK; to keep both paths, add the CloudWatch Log Forwarder alongside the layer.

For assistance, contact support@bronto.io.