aboutsummaryrefslogtreecommitdiffstats
path: root/lib/warden-stack/src/tracing.rs
diff options
context:
space:
mode:
authorrtkay123 <dev@kanjala.com>2025-08-10 12:55:43 +0200
committerrtkay123 <dev@kanjala.com>2025-08-10 12:55:43 +0200
commitbd31dc85f8e9cb01c1e1a4e49fd4735d24a6da04 (patch)
tree50b63525480da0bee2ce713d69f02617c20bee8d /lib/warden-stack/src/tracing.rs
parent8deeab3e11f707677609047f5577a256cf28ed63 (diff)
downloadwarden-bd31dc85f8e9cb01c1e1a4e49fd4735d24a6da04.tar.bz2
warden-bd31dc85f8e9cb01c1e1a4e49fd4735d24a6da04.zip
chore: collapse stack-up
Diffstat (limited to 'lib/warden-stack/src/tracing.rs')
-rw-r--r--lib/warden-stack/src/tracing.rs66
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/warden-stack/src/tracing.rs b/lib/warden-stack/src/tracing.rs
new file mode 100644
index 0000000..1a40f4b
--- /dev/null
+++ b/lib/warden-stack/src/tracing.rs
@@ -0,0 +1,66 @@
+#[cfg(feature = "opentelemetry")]
+pub mod telemetry;
+
+#[cfg(feature = "opentelemetry")]
+pub use opentelemetry_sdk::trace::SdkTracerProvider;
+
+#[cfg(feature = "tracing-loki")]
+mod loki;
+
+use tracing_subscriber::{
+ EnvFilter, Layer, Registry, layer::SubscriberExt, util::SubscriberInitExt,
+};
+
+/// Telemetry handle
+#[derive(bon::Builder)]
+#[builder(finish_fn(vis = "", name = build_internal))]
+pub struct Tracing {
+ #[builder(field = vec![tracing_subscriber::fmt::layer().boxed()])]
+ layers: Vec<Box<dyn Layer<Registry> + Sync + Send>>,
+ #[cfg(feature = "tracing-loki")]
+ #[builder(setters(vis = "", name = loki_internal))]
+ pub loki_task: tracing_loki::BackgroundTask,
+ #[cfg(feature = "opentelemetry")]
+ #[builder(setters(vis = "", name = otel_internal))]
+ pub otel_provider: opentelemetry_sdk::trace::SdkTracerProvider,
+}
+
+// Define a custom finishing function as a method on the `UserBuilder`.
+// The builder's state must implement the `IsComplete` trait.
+// See details about it in the tip below this example.
+impl<S: tracing_builder::IsComplete> TracingBuilder<S> {
+ pub fn build(self, config: &crate::Monitoring) -> Tracing {
+ // Delegate to `build_internal()` to get the instance of user.
+ let mut tracing = self.build_internal();
+
+ let layers = std::mem::take(&mut tracing.layers);
+ tracing_subscriber::registry()
+ .with(layers)
+ .with(
+ EnvFilter::try_from_default_env()
+ .unwrap_or_else(|_| config.log_level.to_string().into()),
+ )
+ .try_init()
+ .ok();
+ tracing
+ }
+}
+
+// #[cfg(test)]
+// mod tests {
+// use super::*;
+//
+// #[test]
+// fn build() {
+// let builder = Tracing::builder().build();
+// let level = crate::Monitoring {
+// log_level: "info".to_string(),
+// #[cfg(feature = "opentelemetry")]
+// opentelemetry_endpoint: "http://localhost:4317".into(),
+// #[cfg(feature = "tracing-loki")]
+// loki_endpoint: "http://localhost:3100".into(),
+// };
+// builder.init(&level);
+// builder.loki_task
+// }
+// }