| Crates.io | opentelemetry-lambda-tower |
| lib.rs | opentelemetry-lambda-tower |
| version | 0.1.5 |
| created_at | 2025-12-07 12:17:27.87503+00 |
| updated_at | 2026-01-06 13:46:56.847834+00 |
| description | OpenTelemetry Tower middleware for AWS Lambda |
| homepage | |
| repository | https://github.com/djvcom/lambda-observability |
| max_upload_size | |
| id | 1971502 |
| size | 191,815 |
Tower middleware for automatic OpenTelemetry instrumentation of AWS Lambda handlers.
This crate provides a Tower layer that automatically instruments Lambda handler invocations with OpenTelemetry tracing, following semantic conventions for FaaS and messaging systems.
use lambda_runtime::{service_fn, LambdaEvent};
use opentelemetry_lambda_tower::{OtelTracingLayer, ApiGatewayV2Extractor};
use tower::ServiceBuilder;
async fn handler(event: LambdaEvent<serde_json::Value>) -> Result<String, lambda_runtime::Error> {
Ok("Hello!".to_string())
}
#[tokio::main]
async fn main() -> Result<(), lambda_runtime::Error> {
let service = ServiceBuilder::new()
.layer(OtelTracingLayer::new(ApiGatewayV2Extractor::new()))
.service(service_fn(handler));
lambda_runtime::run(service).await
}
The crate provides extractors for common Lambda event types:
| Extractor | Event Type | Feature Flag |
|---|---|---|
ApiGatewayV2Extractor |
API Gateway HTTP API (v2) | http (default) |
ApiGatewayV1Extractor |
API Gateway REST API (v1) | http (default) |
SqsEventExtractor |
SQS Messages | sqs (default) |
SnsEventExtractor |
SNS Notifications | sns |
use opentelemetry_lambda_tower::{OtelTracingLayer, ApiGatewayV2Extractor};
let layer = OtelTracingLayer::new(ApiGatewayV2Extractor::new());
Extracts trace context from:
traceparent HTTP header (W3C TraceContext)_X_AMZN_TRACE_ID environment variable (X-Ray format, converted to W3C)use opentelemetry_lambda_tower::{OtelTracingLayer, SqsEventExtractor};
let layer = OtelTracingLayer::new(SqsEventExtractor::new());
For SQS batch processing, span links are created for each message's trace context rather than parent-child relationships, following OpenTelemetry messaging semantic conventions.
use opentelemetry_lambda_tower::{OtelTracingLayer, SnsEventExtractor};
let layer = OtelTracingLayer::new(SnsEventExtractor::new());
use opentelemetry_lambda_tower::{OtelTracingLayerBuilder, ApiGatewayV2Extractor};
use opentelemetry_sdk::trace::SdkTracerProvider;
use std::sync::Arc;
use std::time::Duration;
let provider = Arc::new(SdkTracerProvider::builder().build());
let layer = OtelTracingLayerBuilder::new(ApiGatewayV2Extractor::new())
.tracer_provider(provider)
.flush_on_end(true)
.flush_timeout(Duration::from_secs(5))
.build();
| Method | Default | Description |
|---|---|---|
tracer_provider() |
None | Set the tracer provider for flushing |
flush_on_end() |
true |
Flush spans after each invocation |
flush_timeout() |
5s | Timeout for flush operations |
Implement the TraceContextExtractor trait for custom event types:
use opentelemetry_lambda_tower::TraceContextExtractor;
use opentelemetry::Context;
use opentelemetry::trace::Link;
use lambda_runtime::Context as LambdaContext;
use tracing::Span;
struct MyEventExtractor;
impl TraceContextExtractor<MyEvent> for MyEventExtractor {
fn extract_context(&self, event: &MyEvent) -> Context {
// Extract parent trace context
Context::current()
}
fn extract_links(&self, event: &MyEvent) -> Vec<Link> {
// Return span links for batch processing
vec![]
}
fn trigger_type(&self) -> &'static str {
"other"
}
fn span_name(&self, event: &MyEvent, ctx: &LambdaContext) -> String {
format!("{} invoke", ctx.env_config.function_name)
}
fn record_attributes(&self, event: &MyEvent, span: &Span) {
// Record event-specific span attributes
}
}
The middleware records attributes following OpenTelemetry semantic conventions:
faas.trigger - Trigger type (http, pubsub, other)faas.invocation_id - Lambda request IDfaas.coldstart - Whether this is a cold startfaas.name - Function namefaas.version - Function versionhttp.request.method - HTTP methodurl.path - Request pathhttp.route - Route patternclient.address - Client IPmessaging.system - aws_sqs or aws_snsmessaging.operation.type - processmessaging.destination.name - Queue/topic namemessaging.batch.message_count - Batch size| Feature | Default | Description |
|---|---|---|
http |
Yes | API Gateway event extractors |
sqs |
Yes | SQS event extractor |
sns |
No | SNS event extractor |
full |
No | All extractors |
MIT