tracing_distributed/
telemetry.rs1use crate::trace::{Event, Span};
2use std::marker::PhantomData;
3
4pub trait Telemetry {
6 type Visitor: tracing::field::Visit;
8 type TraceId: Send + Sync + Clone;
10 type SpanId: Send + Sync + Clone;
12
13 fn mk_visitor(&self) -> Self::Visitor;
15
16 fn report_span(&self, span: Span<Self::Visitor, Self::SpanId, Self::TraceId>);
18
19 fn report_event(&self, event: Event<Self::Visitor, Self::SpanId, Self::TraceId>);
21}
22
23#[derive(Default, Debug)]
25pub struct BlackholeVisitor;
26
27impl tracing::field::Visit for BlackholeVisitor {
28 fn record_debug(&mut self, _: &tracing::field::Field, _: &dyn std::fmt::Debug) {}
29}
30
31pub struct BlackholeTelemetry<S, T>(PhantomData<S>, PhantomData<T>);
34
35impl<S, T> Default for BlackholeTelemetry<S, T> {
36 fn default() -> Self {
37 BlackholeTelemetry(PhantomData, PhantomData)
38 }
39}
40
41impl<SpanId, TraceId> Telemetry for BlackholeTelemetry<SpanId, TraceId>
42where
43 SpanId: 'static + Clone + Send + Sync,
44 TraceId: 'static + Clone + Send + Sync,
45{
46 type Visitor = BlackholeVisitor;
47 type TraceId = TraceId;
48 type SpanId = SpanId;
49
50 fn mk_visitor(&self) -> Self::Visitor {
51 Default::default()
52 }
53
54 fn report_span(&self, _: Span<Self::Visitor, Self::SpanId, Self::TraceId>) {}
55
56 fn report_event(&self, _: Event<Self::Visitor, Self::SpanId, Self::TraceId>) {}
57}
58
59#[cfg(test)]
60pub(crate) mod test {
61 use super::*;
62 use std::sync::Arc;
63 use std::sync::Mutex;
64
65 pub(crate) type TraceId = u64;
67 pub(crate) type SpanId = tracing::Id;
68
69 pub struct TestTelemetry {
71 spans: Arc<Mutex<Vec<Span<BlackholeVisitor, SpanId, TraceId>>>>,
72 events: Arc<Mutex<Vec<Event<BlackholeVisitor, SpanId, TraceId>>>>,
73 }
74
75 impl TestTelemetry {
76 pub fn new(
77 spans: Arc<Mutex<Vec<Span<BlackholeVisitor, SpanId, TraceId>>>>,
78 events: Arc<Mutex<Vec<Event<BlackholeVisitor, SpanId, TraceId>>>>,
79 ) -> Self {
80 TestTelemetry { spans, events }
81 }
82 }
83
84 impl Telemetry for TestTelemetry {
85 type Visitor = BlackholeVisitor;
86 type SpanId = SpanId;
87 type TraceId = TraceId;
88
89 fn mk_visitor(&self) -> Self::Visitor {
90 BlackholeVisitor
91 }
92
93 fn report_span(&self, span: Span<BlackholeVisitor, SpanId, TraceId>) {
94 let mut spans = self.spans.lock().unwrap();
96 spans.push(span);
97 }
98
99 fn report_event(&self, event: Event<BlackholeVisitor, SpanId, TraceId>) {
100 let mut events = self.events.lock().unwrap();
102 events.push(event);
103 }
104 }
105}