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/logger.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/logger.rs')
-rw-r--r-- | src/logger.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/logger.rs b/src/logger.rs new file mode 100644 index 0000000..964477f --- /dev/null +++ b/src/logger.rs @@ -0,0 +1,52 @@ +//! This module provides functionality to initialize and configure a logger that exports logs +//! using OpenTelemetry. The logger can be configured with different levels and exporter endpoints. +//! +//! # Functions +//! +//! - `init`: Initializes a new logger exported with OpenTelemetry. It sets up the logger provider, +//! configures the log appender, and sets the global logger. +//! - `http_exporter`: Creates a new HTTP exporter builder for OpenTelemetry. +use std::sync::Arc; + +use opentelemetry_appender_log::OpenTelemetryLogBridge; +use opentelemetry_otlp::LogExporter; +use opentelemetry_otlp::Protocol; +use opentelemetry_otlp::WithExportConfig; +use opentelemetry_sdk::logs::Logger; +use opentelemetry_sdk::logs::LoggerProvider; + +use crate::Opentelemetry; + +/// Initialize a new logger exported with open telemetry. +pub fn init( + manager: &mut Opentelemetry, +) -> anyhow::Result<OpenTelemetryLogBridge<LoggerProvider, Logger>, ()> { + let exporter = LogExporter::builder() + .with_http() + .with_endpoint("http://localhost:4318/v1/logs") + .with_protocol(Protocol::HttpBinary) + .build() + .unwrap(); + let provider = LoggerProvider::builder() + .with_batch_exporter(exporter, opentelemetry_sdk::runtime::Tokio) + .build(); + + // let logger_provider = opentelemetry_otlp::new_pipeline() + // .logging() + // .with_resource(Resource::new(vec![KeyValue::new( + // opentelemetry_semantic_conventions::resource::SERVICE_NAME, + // tag, + // )])) + // .with_batch_config(batch_config) + // .with_exporter( + // http_exporter() + // .with_protocol(Protocol::HttpBinary) //can be changed to `Protocol::HttpJson` to export in JSON format + // .with_endpoint(format!("{exporter_endpoint}/v1/logs")), + // ) + // .install_batch(opentelemetry_sdk::runtime::Tokio)?; + manager.logger = Some(Arc::new(provider.clone())); + + // Setup Log Appender for the log crate. + let logger = OpenTelemetryLogBridge::new(&provider); + Ok(logger) +} |