aboutsummaryrefslogtreecommitdiff
path: root/src/logger.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/logger.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/logger.rs')
-rw-r--r--src/logger.rs52
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)
+}