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);