lambda_otel_utils/
lib.rs

1//! # lambda-otel-utils
2//!
3//! `lambda-otel-utils` is a Rust library that provides utilities for integrating
4//! OpenTelemetry tracing and metrics with AWS Lambda functions. It simplifies the process of
5//! setting up and configuring OpenTelemetry for use in serverless environments. This crate
6//! is part of the [serverless-otlp-forwarder](https://github.com/dev7a/serverless-otlp-forwarder/)
7//! project, which provides a comprehensive solution for OpenTelemetry telemetry collection
8//! in AWS Lambda environments.
9//!
10//! ## Main Components
11//!
12//! This crate consists of these main modules:
13//!
14//! - `http_tracer_provider`: Offers the `HttpTracerProviderBuilder` for configuring and
15//!   building a custom TracerProvider tailored for Lambda environments.
16//! - `http_meter_provider`: Provides the `HttpMeterProviderBuilder` for configuring and
17//!   building a custom MeterProvider tailored for Lambda environments.
18//! - `otel`: Provides utilities for configuring and building tracing subscribers
19//!   with support for OpenTelemetry and other layers.
20//! - `subscriber`: Provides utilities for configuring and building tracing subscribers
21//!   with support for OpenTelemetry and other layers.
22//!
23//! ## Example
24//!
25//! ```rust,no_run
26//! use lambda_otel_utils::{HttpTracerProviderBuilder, HttpMeterProviderBuilder};
27//! use lambda_runtime::{service_fn, Error as LambdaError, LambdaEvent, Runtime};
28//! use lambda_runtime::layers::{OpenTelemetryLayer, OpenTelemetryFaasTrigger};
29//! use aws_lambda_events::event::apigw::ApiGatewayProxyRequest;
30//! use serde_json::Value;
31//! use std::time::Duration;
32//!
33//! async fn function_handler(event: LambdaEvent<ApiGatewayProxyRequest>) -> Result<Value, LambdaError> {
34//!     Ok(serde_json::json!({"message": "Hello, World!"}))
35//! }
36//!
37//! #[tokio::main]
38//! async fn main() -> Result<(), LambdaError> {
39//!     let tracer_provider = HttpTracerProviderBuilder::default()
40//!         .with_stdout_client()
41//!         .enable_global(true)
42//!         .build()?;
43//!
44//!     let meter_provider = HttpMeterProviderBuilder::default()
45//!         .with_stdout_client()
46//!         .with_meter_name("my-lambda-function")
47//!         .with_export_interval(Duration::from_secs(60))
48//!         .build()?;
49//!
50//!     let service = service_fn(function_handler);
51//!
52//!     let runtime = Runtime::new(service_fn(function_handler))
53//!     .layer(
54//!         OpenTelemetryLayer::new(|| {
55//!             tracer_provider.force_flush();
56//!             meter_provider.force_flush();
57//!         }
58//!      )
59//!      .with_trigger(OpenTelemetryFaasTrigger::Http)
60//!     );
61//!
62//!     runtime.run().await
63//! }
64//! ```
65//!
66//! This example demonstrates how to set up a comprehensive tracing and metrics configuration using
67//! `lambda-otel-utils` in a Lambda function, including both the TracerProvider, MeterProvider, and
68//! the OpenTelemetry layer.
69
70pub mod http_meter_provider;
71pub mod http_tracer_provider;
72pub mod protocol;
73pub mod resource;
74pub mod subscriber;
75pub mod vended;
76
77pub use http_meter_provider::HttpMeterProviderBuilder;
78pub use http_tracer_provider::HttpTracerProviderBuilder;
79pub use lambda_runtime::tower::Layer;
80pub use opentelemetry::metrics::MeterProvider;
81pub use opentelemetry::trace::TracerProvider;
82pub use subscriber::{
83    create_otel_metrics_layer, create_otel_tracing_layer, init_otel_subscriber,
84    OpenTelemetrySubscriberBuilder,
85};
86pub use vended::lambda_runtime_otel::{OpenTelemetryFaasTrigger, OpenTelemetryLayer};
87
88#[cfg(doctest)]
89extern crate doc_comment;
90
91#[cfg(doctest)]
92use doc_comment::doctest;
93
94#[cfg(doctest)]
95doctest!("../README.md", readme);