make tracing reload handles into a named map
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
db3c718ddc
commit
0023b09f5b
3 changed files with 40 additions and 25 deletions
|
@ -47,6 +47,8 @@ pub enum Error {
|
||||||
Regex(#[from] regex::Error),
|
Regex(#[from] regex::Error),
|
||||||
#[error("Tracing filter error: {0}")]
|
#[error("Tracing filter error: {0}")]
|
||||||
TracingFilter(#[from] tracing_subscriber::filter::ParseError),
|
TracingFilter(#[from] tracing_subscriber::filter::ParseError),
|
||||||
|
#[error("Tracing reload error: {0}")]
|
||||||
|
TracingReload(#[from] tracing_subscriber::reload::Error),
|
||||||
#[error("Image error: {0}")]
|
#[error("Image error: {0}")]
|
||||||
Image(#[from] image::error::ImageError),
|
Image(#[from] image::error::ImageError),
|
||||||
#[error("Request error: {0}")]
|
#[error("Request error: {0}")]
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
use std::sync::Arc;
|
use std::{
|
||||||
|
collections::HashMap,
|
||||||
|
sync::{Arc, Mutex},
|
||||||
|
};
|
||||||
|
|
||||||
use tracing_subscriber::{reload, EnvFilter};
|
use tracing_subscriber::{reload, EnvFilter};
|
||||||
|
|
||||||
|
use crate::{error, Result};
|
||||||
|
|
||||||
/// We need to store a reload::Handle value, but can't name it's type explicitly
|
/// We need to store a reload::Handle value, but can't name it's type explicitly
|
||||||
/// because the S type parameter depends on the subscriber's previous layers. In
|
/// because the S type parameter depends on the subscriber's previous layers. In
|
||||||
/// our case, this includes unnameable 'impl Trait' types.
|
/// our case, this includes unnameable 'impl Trait' types.
|
||||||
|
@ -24,32 +29,39 @@ impl<L, S> ReloadHandle<L> for reload::Handle<L, S> {
|
||||||
fn reload(&self, new_value: L) -> Result<(), reload::Error> { Self::reload(self, new_value) }
|
fn reload(&self, new_value: L) -> Result<(), reload::Error> { Self::reload(self, new_value) }
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LogLevelReloadHandlesInner {
|
|
||||||
handles: Vec<Box<dyn ReloadHandle<EnvFilter> + Send + Sync>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Wrapper to allow reloading the filter on several several
|
|
||||||
/// [`tracing_subscriber::reload::Handle`]s at once, with the same value.
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct LogLevelReloadHandles {
|
pub struct LogLevelReloadHandles {
|
||||||
inner: Arc<LogLevelReloadHandlesInner>,
|
handles: Arc<Mutex<HandleMap>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type HandleMap = HashMap<String, Handle>;
|
||||||
|
type Handle = Box<dyn ReloadHandle<EnvFilter> + Send + Sync>;
|
||||||
|
|
||||||
impl LogLevelReloadHandles {
|
impl LogLevelReloadHandles {
|
||||||
#[must_use]
|
pub fn add(&self, name: &str, handle: Handle) {
|
||||||
pub fn new(handles: Vec<Box<dyn ReloadHandle<EnvFilter> + Send + Sync>>) -> Self {
|
self.handles
|
||||||
Self {
|
.lock()
|
||||||
inner: Arc::new(LogLevelReloadHandlesInner {
|
.expect("locked")
|
||||||
handles,
|
.insert(name.into(), handle);
|
||||||
}),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn reload(&self, new_value: &EnvFilter) -> Result<(), reload::Error> {
|
pub fn reload(&self, new_value: &EnvFilter) -> Result<()> {
|
||||||
for handle in &self.inner.handles {
|
self.handles
|
||||||
handle.reload(new_value.clone())?;
|
.lock()
|
||||||
}
|
.expect("locked")
|
||||||
|
.values()
|
||||||
|
.for_each(|handle| {
|
||||||
|
_ = handle.reload(new_value.clone()).or_else(error::else_log);
|
||||||
|
});
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for LogLevelReloadHandles {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
handles: Arc::new(HandleMap::new().into()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ use conduit::{
|
||||||
config,
|
config,
|
||||||
config::Config,
|
config::Config,
|
||||||
debug_warn,
|
debug_warn,
|
||||||
log::{capture, LogLevelReloadHandles, ReloadHandle},
|
log::{capture, LogLevelReloadHandles},
|
||||||
};
|
};
|
||||||
use tracing_subscriber::{layer::SubscriberExt, reload, EnvFilter, Layer, Registry};
|
use tracing_subscriber::{layer::SubscriberExt, reload, EnvFilter, Layer, Registry};
|
||||||
|
|
||||||
|
@ -15,6 +15,8 @@ pub(crate) type TracingFlameGuard = ();
|
||||||
|
|
||||||
#[allow(clippy::redundant_clone)]
|
#[allow(clippy::redundant_clone)]
|
||||||
pub(crate) fn init(config: &Config) -> (LogLevelReloadHandles, TracingFlameGuard, Arc<capture::State>) {
|
pub(crate) fn init(config: &Config) -> (LogLevelReloadHandles, TracingFlameGuard, Arc<capture::State>) {
|
||||||
|
let reload_handles = LogLevelReloadHandles::default();
|
||||||
|
|
||||||
let fmt_layer = tracing_subscriber::fmt::Layer::new();
|
let fmt_layer = tracing_subscriber::fmt::Layer::new();
|
||||||
let filter_layer = match EnvFilter::try_new(&config.log) {
|
let filter_layer = match EnvFilter::try_new(&config.log) {
|
||||||
Ok(s) => s,
|
Ok(s) => s,
|
||||||
|
@ -24,9 +26,8 @@ pub(crate) fn init(config: &Config) -> (LogLevelReloadHandles, TracingFlameGuard
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut reload_handles = Vec::<Box<dyn ReloadHandle<EnvFilter> + Send + Sync>>::new();
|
|
||||||
let (fmt_reload_filter, fmt_reload_handle) = reload::Layer::new(filter_layer.clone());
|
let (fmt_reload_filter, fmt_reload_handle) = reload::Layer::new(filter_layer.clone());
|
||||||
reload_handles.push(Box::new(fmt_reload_handle));
|
reload_handles.add("format", Box::new(fmt_reload_handle));
|
||||||
|
|
||||||
let subscriber = Registry::default().with(fmt_layer.with_filter(fmt_reload_filter));
|
let subscriber = Registry::default().with(fmt_layer.with_filter(fmt_reload_filter));
|
||||||
|
|
||||||
|
@ -38,7 +39,7 @@ pub(crate) fn init(config: &Config) -> (LogLevelReloadHandles, TracingFlameGuard
|
||||||
let subscriber = {
|
let subscriber = {
|
||||||
let sentry_layer = sentry_tracing::layer();
|
let sentry_layer = sentry_tracing::layer();
|
||||||
let (sentry_reload_filter, sentry_reload_handle) = reload::Layer::new(filter_layer.clone());
|
let (sentry_reload_filter, sentry_reload_handle) = reload::Layer::new(filter_layer.clone());
|
||||||
reload_handles.push(Box::new(sentry_reload_handle));
|
reload_handles.add("sentry", Box::new(sentry_reload_handle));
|
||||||
subscriber.with(sentry_layer.with_filter(sentry_reload_filter))
|
subscriber.with(sentry_layer.with_filter(sentry_reload_filter))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -73,7 +74,7 @@ pub(crate) fn init(config: &Config) -> (LogLevelReloadHandles, TracingFlameGuard
|
||||||
let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
|
let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
|
||||||
|
|
||||||
let (jaeger_reload_filter, jaeger_reload_handle) = reload::Layer::new(filter_layer.clone());
|
let (jaeger_reload_filter, jaeger_reload_handle) = reload::Layer::new(filter_layer.clone());
|
||||||
reload_handles.push(Box::new(jaeger_reload_handle));
|
reload_handles.add("jaeger", Box::new(jaeger_reload_handle));
|
||||||
Some(telemetry.with_filter(jaeger_reload_filter))
|
Some(telemetry.with_filter(jaeger_reload_filter))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
@ -87,7 +88,7 @@ pub(crate) fn init(config: &Config) -> (LogLevelReloadHandles, TracingFlameGuard
|
||||||
#[cfg_attr(not(feature = "perf_measurements"), allow(clippy::let_unit_value))]
|
#[cfg_attr(not(feature = "perf_measurements"), allow(clippy::let_unit_value))]
|
||||||
let flame_guard = ();
|
let flame_guard = ();
|
||||||
|
|
||||||
let ret = (LogLevelReloadHandles::new(reload_handles), flame_guard, cap_state);
|
let ret = (reload_handles, flame_guard, cap_state);
|
||||||
|
|
||||||
// Enable the tokio console. This is slightly kludgy because we're judggling
|
// Enable the tokio console. This is slightly kludgy because we're judggling
|
||||||
// compile-time and runtime conditions to elide it, each of those changing the
|
// compile-time and runtime conditions to elide it, each of those changing the
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue