use std::sync::Arc;
use starweaver_core::TraceContext;
use super::{SpanEvent, SpanHandle, SpanSpec, SpanStatus};
pub type DynTraceRecorder = Arc<dyn TraceRecorder>;
#[derive(Clone)]
pub struct TraceRecorderHandle {
recorder: DynTraceRecorder,
}
impl TraceRecorderHandle {
#[must_use]
pub fn new(recorder: DynTraceRecorder) -> Self {
Self { recorder }
}
#[must_use]
pub fn recorder(&self) -> DynTraceRecorder {
self.recorder.clone()
}
}
impl std::fmt::Debug for TraceRecorderHandle {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str("TraceRecorderHandle")
}
}
pub trait TraceRecorder: Send + Sync {
fn start_span(&self, spec: SpanSpec, parent: &TraceContext) -> SpanHandle;
fn record_event(&self, span: &SpanHandle, event: SpanEvent);
fn close_span(&self, span: &SpanHandle, status: SpanStatus);
}
#[derive(Clone, Debug, Default)]
pub struct NoopTraceRecorder;
impl TraceRecorder for NoopTraceRecorder {
fn start_span(&self, _spec: SpanSpec, parent: &TraceContext) -> SpanHandle {
SpanHandle::new(parent.clone(), parent.span_id.clone().unwrap_or_default())
}
fn record_event(&self, _span: &SpanHandle, _event: SpanEvent) {}
fn close_span(&self, _span: &SpanHandle, _status: SpanStatus) {}
}