Skip to main content

starweaver_runtime/trace/
recorder.rs

1use std::sync::Arc;
2
3use starweaver_core::TraceContext;
4
5use super::{SpanEvent, SpanHandle, SpanSpec, SpanStatus};
6
7/// Shared trace recorder reference.
8pub type DynTraceRecorder = Arc<dyn TraceRecorder>;
9
10/// Typed dependency handle for tools that need to create child trace spans.
11#[derive(Clone)]
12pub struct TraceRecorderHandle {
13    recorder: DynTraceRecorder,
14}
15
16impl TraceRecorderHandle {
17    /// Create a tool dependency handle from a shared recorder.
18    #[must_use]
19    pub fn new(recorder: DynTraceRecorder) -> Self {
20        Self { recorder }
21    }
22
23    /// Return the shared recorder.
24    #[must_use]
25    pub fn recorder(&self) -> DynTraceRecorder {
26        self.recorder.clone()
27    }
28}
29
30impl std::fmt::Debug for TraceRecorderHandle {
31    fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32        formatter.write_str("TraceRecorderHandle")
33    }
34}
35
36/// Runtime trace recorder abstraction.
37pub trait TraceRecorder: Send + Sync {
38    /// Start a child span.
39    fn start_span(&self, spec: SpanSpec, parent: &TraceContext) -> SpanHandle;
40
41    /// Record a span event.
42    fn record_event(&self, span: &SpanHandle, event: SpanEvent);
43
44    /// Close a span.
45    fn close_span(&self, span: &SpanHandle, status: SpanStatus);
46}
47
48/// No-op trace recorder.
49#[derive(Clone, Debug, Default)]
50pub struct NoopTraceRecorder;
51
52impl TraceRecorder for NoopTraceRecorder {
53    fn start_span(&self, _spec: SpanSpec, parent: &TraceContext) -> SpanHandle {
54        SpanHandle::new(parent.clone(), parent.span_id.clone().unwrap_or_default())
55    }
56
57    fn record_event(&self, _span: &SpanHandle, _event: SpanEvent) {}
58
59    fn close_span(&self, _span: &SpanHandle, _status: SpanStatus) {}
60}