starweaver_runtime/trace/
recorder.rs1use std::sync::Arc;
2
3use starweaver_core::TraceContext;
4
5use super::{SpanEvent, SpanHandle, SpanSpec, SpanStatus};
6
7pub type DynTraceRecorder = Arc<dyn TraceRecorder>;
9
10#[derive(Clone)]
12pub struct TraceRecorderHandle {
13 recorder: DynTraceRecorder,
14}
15
16impl TraceRecorderHandle {
17 #[must_use]
19 pub fn new(recorder: DynTraceRecorder) -> Self {
20 Self { recorder }
21 }
22
23 #[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
36pub trait TraceRecorder: Send + Sync {
38 fn start_span(&self, spec: SpanSpec, parent: &TraceContext) -> SpanHandle;
40
41 fn record_event(&self, span: &SpanHandle, event: SpanEvent);
43
44 fn close_span(&self, span: &SpanHandle, status: SpanStatus);
46}
47
48#[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}