use tracing::level_filters::LevelFilter;
use tracing_subscriber::EnvFilter;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
use crate::{layers::TelemetryLayerBuilder, logs, metrics, trace};
use super::Level;
pub fn new() -> TelemetryPipeline {
TelemetryPipeline::default()
}
#[derive(Debug, Default)]
pub struct TelemetryPipeline {
level: Option<LevelFilter>,
logs_layer: Option<logs::LayerBuilder>,
metrics_layer: Option<metrics::LayerBuilder>,
trace_layer: Option<trace::LayerBuilder>,
}
impl TelemetryPipeline {
pub fn with_logs(mut self, config: logs::LayerBuilder) -> Self {
self.logs_layer = Some(config);
self
}
pub fn with_stdout_logs(self) -> Self {
self.with_logs(logs::LayerBuilder::Stdout(logs::LogOptions::default()))
}
pub fn with_metrics(mut self, config: metrics::LayerBuilder) -> Self {
self.metrics_layer = Some(config);
self
}
pub fn with_aws_metrics(self) -> Self {
self.with_metrics(metrics::LayerBuilder::CloudWatch(
metrics::CloudWatchMetricsOptions::default(),
))
}
pub fn with_traces(mut self, config: trace::LayerBuilder) -> Self {
self.trace_layer = Some(config);
self
}
pub fn with_aws_traces(self) -> Self {
self.with_traces(trace::LayerBuilder::Xray(trace::TraceOptions::default()))
}
pub fn with_level(mut self, level: Level) -> Self {
self.level = Some(level.into());
self
}
pub async fn init(self) {
let logs_layer = match self.logs_layer {
Some(log_config) => log_config
.layer()
.await
.inspect_err(|e| eprintln!("{e}"))
.ok(),
None => None,
};
let metrics_layer = match self.metrics_layer {
Some(metrics_config) => metrics_config
.layer()
.await
.inspect_err(|e| eprintln!("{e}"))
.ok(),
None => None,
};
let trace_layer = match self.trace_layer {
Some(trace_config) => trace_config
.layer()
.await
.inspect_err(|e| eprintln!("{e}"))
.ok(),
None => None,
};
let log_level = self.level.unwrap_or(LevelFilter::INFO).to_string();
let tracing_registry = tracing_subscriber::registry()
.with(logs_layer)
.with(metrics_layer)
.with(trace_layer)
.with(EnvFilter::new(log_level))
.try_init();
if let Err(e) = tracing_registry {
eprintln!("Failed initializing telemetry. {e:#?}");
}
}
}