aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
authorLuca Matei Pintilie <luca@lucamatei.com>2025-02-05 19:23:49 +0000
committerLuca Matei Pintilie <luca@lucamatei.com>2025-02-20 21:22:16 +0000
commit342e18b4841d37e8c98016725d6108b1d72f8563 (patch)
treeb777a5bbda3e2b8a9b2a59508a0608e74ce3b5c2 /src/lib.rs
parenta8f0e58428de51a055bf31db44965266ff7d5640 (diff)
downloadrunit-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
runit-otel: Add vloggerHEADmaster
/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.rs95
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);
+ }
+}