timeout_tracing/
trace.rs

1use std::{backtrace::Backtrace, fmt::Display};
2
3use tracing_error::SpanTrace;
4
5pub trait CaptureTrace {
6    type Trace;
7    fn capture(&self) -> Self::Trace;
8}
9
10pub struct DefaultTraceCapturer;
11
12impl CaptureTrace for DefaultTraceCapturer {
13    type Trace = StackAndSpanTrace;
14
15    fn capture(&self) -> Self::Trace {
16        StackAndSpanTrace::capture()
17    }
18}
19
20#[derive(Debug)]
21pub struct StackAndSpanTrace {
22    pub(crate) stack_trace: Backtrace,
23    pub(crate) span_trace: SpanTrace,
24}
25
26impl StackAndSpanTrace {
27    pub(crate) fn capture() -> Self {
28        Self {
29            span_trace: SpanTrace::capture(),
30            stack_trace: Backtrace::capture(),
31        }
32    }
33
34    pub fn stack_trace(&self) -> &Backtrace {
35        &self.stack_trace
36    }
37
38    pub fn span_trace(&self) -> &SpanTrace {
39        &self.span_trace
40    }
41}
42
43impl Display for StackAndSpanTrace {
44    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45        write!(
46            f,
47            "{span_trace}\n{stack_trace}",
48            span_trace = self.span_trace,
49            stack_trace = self.stack_trace,
50        )
51    }
52}