diff options
author | Luca Matei Pintilie <luca@lucamatei.com> | 2025-02-05 19:23:49 +0000 |
---|---|---|
committer | Luca Matei Pintilie <luca@lucamatei.com> | 2025-02-20 21:22:16 +0000 |
commit | 342e18b4841d37e8c98016725d6108b1d72f8563 (patch) | |
tree | b777a5bbda3e2b8a9b2a59508a0608e74ce3b5c2 /src/lib.rs | |
parent | a8f0e58428de51a055bf31db44965266ff7d5640 (diff) | |
download | runit-otel-master.tar runit-otel-master.tar.gz runit-otel-master.tar.bz2 runit-otel-master.tar.lz runit-otel-master.tar.xz runit-otel-master.tar.zst runit-otel-master.zip |
/etc/vlogger can be hijacked to send stdout/stderr logs on a void-linux
systems to otel. This first implementation does just that.
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); + } +} |