use crate::event::ObservabilityEvent;
use crate::query::EventQuery;
use std::sync::{Arc, Mutex};
use tracing_subscriber::Layer;
#[derive(Default, Clone)]
pub struct CapturingLayer {
events: Arc<Mutex<Vec<ObservabilityEvent>>>,
}
impl CapturingLayer {
pub fn new() -> Self {
Self::default()
}
pub fn snapshot(&self) -> Vec<ObservabilityEvent> {
match self.events.lock() {
Ok(guard) => guard.clone(),
Err(poison) => poison.into_inner().clone(),
}
}
pub fn query(&self) -> EventQuery {
EventQuery::new(self.snapshot())
}
pub fn clear(&self) {
match self.events.lock() {
Ok(mut guard) => guard.clear(),
Err(poison) => poison.into_inner().clear(),
}
}
pub fn len(&self) -> usize {
match self.events.lock() {
Ok(guard) => guard.len(),
Err(poison) => poison.into_inner().len(),
}
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl std::fmt::Debug for CapturingLayer {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("CapturingLayer")
.field("len", &self.len())
.finish_non_exhaustive()
}
}
impl<S> Layer<S> for CapturingLayer
where
S: tracing::Subscriber,
{
fn on_event(
&self,
event: &tracing::Event<'_>,
_ctx: tracing_subscriber::layer::Context<'_, S>,
) {
if let Some(parsed) = crate::extract::extract_event(event) {
match self.events.lock() {
Ok(mut guard) => guard.push(parsed),
Err(poison) => poison.into_inner().push(parsed),
}
}
}
}