lambda_otel_utils/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//! # lambda-otel-utils
//!
//! `lambda-otel-utils` is a Rust library that provides utilities for integrating
//! OpenTelemetry tracing and metrics with AWS Lambda functions. It simplifies the process of
//! setting up and configuring OpenTelemetry for use in serverless environments.
//!
//! ## Main Components
//!
//! This crate consists of three main modules:
//!
//! - `http_otel_layer`: Provides the `HttpOtelLayer` for propagating
//!   context across HTTP boundaries.
//! - `http_tracer_provider`: Offers the `HttpTracerProviderBuilder` for configuring and
//!   building a custom TracerProvider tailored for Lambda environments.
//! - `http_meter_provider`: Provides the `HttpMeterProviderBuilder` for configuring and
//!   building a custom MeterProvider tailored for Lambda environments.
//!
//! ## Example
//!
//! ```rust,no_run
//! use lambda_runtime::{service_fn, Error, LambdaEvent};
//! use aws_lambda_events::event::apigw::ApiGatewayProxyRequest;
//! use lambda_otel_utils::{HttpOtelLayer, HttpTracerProviderBuilder, HttpMeterProviderBuilder};
//! use serde_json::Value;
//! use lambda_runtime::tower::Layer;
//! use std::time::Duration;
//!
//! async fn function_handler(event: LambdaEvent<ApiGatewayProxyRequest>) -> Result<Value, Error> {
//!     Ok(serde_json::json!({"message": "Hello from Lambda!"}))
//! }
//!
//! #[tokio::main]
//! async fn main() -> Result<(), Error> {
//!     // Initialize tracer provider
//!     let tracer_provider = HttpTracerProviderBuilder::default()
//!         .with_stdout_client()
//!         .with_tracer_name("my-lambda-function")
//!         .build()?;
//!     
//!     // Initialize meter provider
//!     let meter_provider = HttpMeterProviderBuilder::default()
//!         .with_stdout_client()
//!         .with_meter_name("my-lambda-function")
//!         .with_export_interval(Duration::from_secs(60))
//!         .build()?;
//!     
//!     // Clone providers for the flush function
//!     let tracer_provider_clone = tracer_provider.clone();
//!     let meter_provider_clone = meter_provider.clone();
//!     
//!     // Create service with tracing layer
//!     let service = HttpOtelLayer::new(move || {
//!         tracer_provider_clone.force_flush();
//!         meter_provider_clone.force_flush();
//!     })
//!     .layer(service_fn(function_handler));
//!
//!     // Run the Lambda runtime
//!     lambda_runtime::run(service).await?;
//!     Ok(())
//! }
//! ```
//!
//! This example demonstrates how to set up a comprehensive tracing and metrics configuration using
//! `lambda-otel-utils` in a Lambda function, including both the TracerProvider, MeterProvider, and
//! the context propagation layer.

pub mod http_meter_provider;
pub mod http_otel_layer;
pub mod http_tracer_provider;

pub use http_meter_provider::HttpMeterProviderBuilder;
pub use http_otel_layer::HttpOtelLayer;
pub use http_tracer_provider::HttpTracerProviderBuilder;
pub use lambda_runtime::tower::Layer;