use tracing::Metadata;
use crate::components::level::Level;
#[cfg(feature = "tracing_consumer")]
use tracing_subscriber::{Layer};
#[cfg(feature = "tracing_consumer")]
use tracing_subscriber::filter::dynamic_filter_fn;
#[cfg(feature = "tracing_consumer")]
use tracing_subscriber::layer::Context;
#[cfg(feature = "tracing_consumer")]
#[derive(Debug,Clone)]
pub enum HtraceBridgeSpanFilterList {
Allow(Vec<String>),
Deny(Vec<String>),
}
#[cfg(feature = "tracing_consumer")]
impl Default for HtraceBridgeSpanFilterList {
fn default() -> Self {
HtraceBridgeSpanFilterList::Deny(vec![])
}
}
#[derive(Clone)]
pub struct HtraceBridge {
pub min_level_backtrace: Option<Level>,
#[cfg(feature = "log_consumer")]
pub log_min_level: Level,
#[cfg(feature = "tracing_consumer")]
pub tracing_min_level: Level,
#[cfg(feature = "tracing_consumer")]
pub tracing_filter_span: HtraceBridgeSpanFilterList,
}
impl HtraceBridge {
pub fn isBacktrace(&self, level: &Level) -> bool {
if let Some(backtracelevel) = self.min_level_backtrace
{
return level.tou8() >= backtracelevel.tou8();
}
return false;
}
#[cfg(feature = "log_consumer")]
pub fn isLog(&self, level: &Level) -> bool {
return level.tou8() >= self.log_min_level.tou8();
}
#[cfg(feature = "tracing_consumer")]
pub fn isTracing(&self, level: &Level) -> bool {
return level.tou8() >= self.tracing_min_level.tou8();
}
#[cfg(feature = "tracing_consumer")]
pub fn filtered<S>(self) -> impl Layer<S>
where
S: for<'a> tracing_subscriber::registry::LookupSpan<'a> + tracing::Subscriber,
{
let filter_list = self.tracing_filter_span.clone();
let only_requests_or_user = dynamic_filter_fn(move |_meta: &Metadata<'_>, ctx: &Context<'_, S>| {
if let Some(span) = ctx.lookup_current()
{
match &filter_list {
HtraceBridgeSpanFilterList::Allow(allowed) => {
if allowed.contains(&span.name().to_string()) {
return true;
}
}
HtraceBridgeSpanFilterList::Deny(denied) => {
if !denied.contains(&span.name().to_string()) {
return true;
}
}
}
return false;
};
return true;
});
self.with_filter(only_requests_or_user)
}
}
impl Default for HtraceBridge {
fn default() -> Self {
HtraceBridge {
min_level_backtrace: Some(Level::WARNING),
#[cfg(feature = "log_consumer")]
log_min_level: Level::DEBUG,
#[cfg(feature = "tracing_consumer")]
tracing_min_level: Level::DEBUG,
#[cfg(feature = "tracing_consumer")]
tracing_filter_span: Default::default(),
}
}
}