near_o11y/
span_wrapped_msg.rs

1use tracing::{Span, debug_span};
2
3#[derive(Debug, Clone)]
4pub struct SpanWrapped<T> {
5    _span: Span,
6    msg: T,
7}
8
9impl<T> SpanWrapped<T> {
10    pub fn span_unwrap(self) -> T {
11        self.msg
12    }
13}
14
15impl<T> From<T> for SpanWrapped<T> {
16    fn from(msg: T) -> Self {
17        Self { _span: debug_span!("pending_message", message_type = pretty_type_name::<T>()), msg }
18    }
19}
20
21impl<T: PartialEq> PartialEq for SpanWrapped<T> {
22    fn eq(&self, other: &Self) -> bool {
23        self.msg == other.msg
24    }
25}
26
27impl<T: Eq> Eq for SpanWrapped<T> {}
28
29pub trait SpanWrappedMessageExt: Sized {
30    fn span_wrap(self) -> SpanWrapped<Self> {
31        self.into()
32    }
33}
34
35impl<T> SpanWrappedMessageExt for T {}
36
37// Quick and dirty way of getting the type name without the module path.
38// Does not work for more complex types like std::sync::Arc<std::sync::atomic::AtomicBool<...>>
39// example near_chunks::shards_manager_actor::ShardsManagerActor -> ShardsManagerActor
40fn pretty_type_name<T>() -> &'static str {
41    std::any::type_name::<T>().split("::").last().unwrap()
42}