diff options
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..8f8e15a --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,95 @@ +//! # OpenTelemetry Log Integration +//! +//! This crate provides integration with OpenTelemetry for logging purposes. It allows you to +//! initialize and manage loggers that are compatible with the OpenTelemetry SDK. +//! +//! ## Features +//! +//! - Initialize loggers with specific tags, levels, and exporter endpoints. +//! - Automatically manage the lifecycle of loggers, ensuring proper shutdown. +//! +//! ## Usage +//! +//! Add this crate to your `Cargo.toml`: +//! +//! ```toml +//! [dependencies] +//! opentelemetry-log = "0.1" +//! ``` +//! +//! Import and use the `Opentelemetry` struct to manage your loggers: +//! +//! ```rust +//! use opentelemetry_log::Opentelemetry; +//! +//! #[tokio::main] +//! async fn main() { +//! let mut otel = Opentelemetry::new(); +//! otel.init_log("my_app", "info", "http://localhost:4317").unwrap(); // Please do not unwrap in production code +//! // Your application logic here +//! } +//! ``` +//! +//! ## Modules +//! +//! - `log`: Contains the log initialization logic. +//! +//! ## Structs +//! +//! - `Opentelemetry`: Main struct for managing OpenTelemetry loggers. +//! +//! ## Traits +//! +//! - `Default`: Provides a default implementation for `Opentelemetry`. +//! - `Drop`: Ensures proper shutdown of loggers when `Opentelemetry` instances are dropped. +//! +//! ## Errors +//! +//! This crate uses the `anyhow` crate for error handling. Ensure you handle errors appropriately +//! when initializing and using loggers. +// Copied from https://github.com/vincenzopalazzo/opentelemetry-log/commit/e013d914b63068db53e5a90a537052b32448f5a6 +pub mod logger; +pub use anyhow; +use opentelemetry_appender_log::OpenTelemetryLogBridge; + +use std::sync::Arc; + +use opentelemetry_sdk::logs::{self as sdklogs, Logger, LoggerProvider}; + +/// Main struct for managing OpenTelemetry loggers, when you init the logger +/// remember to keep this alive for all the lifetime of the application. +/// +/// An example can be found in the `examples` directory. +#[derive(Debug, Clone)] +pub struct Opentelemetry { + pub(crate) logger: Option<Arc<sdklogs::LoggerProvider>>, +} + +impl Default for Opentelemetry { + fn default() -> Self { + Self::new() + } +} + +impl Opentelemetry { + pub fn new() -> Self { + Opentelemetry { logger: None } + } + + /// Initialize a new logger with the provided tag, level, and exporter endpoint. + /// this is assuming tat your application is using `log` crate + pub fn init_log( + &mut self, + ) -> Result<OpenTelemetryLogBridge<LoggerProvider, Logger>, ()> { + logger::init(self) + } +} + +impl Drop for Opentelemetry { + fn drop(&mut self) { + let Some(Err(err)) = self.logger.as_ref().map(|log| log.shutdown()) else { + return; + }; + eprintln!("Failed to shutdown logger: {:?}", err); + } +} |