tracing_facade/
macros.rs

1#[doc(hidden)]
2pub use scopeguard::guard;
3
4/// Records the end of a synchronous duration.
5///
6/// Accepts an expression of a type that implements [Into<Cow<str>>], with optional metadata
7/// following. Uses of `trace_begin` and `trace_end` must be balanced; in most cases, [trace_scoped]
8/// should be used instead.
9///
10/// The behavior of Metadata specification depends on the implementation of [Tracer] being used.
11/// Chromium's trace event format will merge metadata from beginning and end, preferring values from
12/// the end in the case of conflict.
13///
14/// # Example
15/// ```
16/// # #[macro_use] extern crate tracing_facade;
17/// trace_begin!("foo");
18/// trace_begin!("bar", "value": 42);
19/// trace_end!("bar", "value": 123, "values": [1, 2, 3]);
20/// trace_end!("foo");
21/// ```
22#[macro_export]
23macro_rules! trace_begin {
24  ($name: expr) => {
25    if $crate::is_enabled() {
26      let event = $crate::Event {
27        name: $name.into(),
28        kind: $crate::EventKind::SyncBegin,
29        metadata: $crate::Metadata::default(),
30      };
31      $crate::record_event(event);
32    }
33  };
34
35  ($name: expr, $($metadata: tt)+) => {
36    if $crate::is_enabled() {
37      let metadata = if $crate::supports_metadata() {
38        $crate::Metadata::from_json(serde_json::json!({$($metadata)+}))
39      } else {
40        $crate::Metadata::default()
41      };
42
43      let event = $crate::Event {
44        name: $name.into(),
45        kind: $crate::EventKind::SyncBegin,
46        metadata,
47      };
48      $crate::record_event(event);
49    }
50  };
51}
52
53/// Records the end of a synchronous duration.
54///
55/// Accepts an expression of a type that implements [Into<Cow<str>>], with optional metadata
56/// following. Uses of `trace_begin` and `trace_end` must be balanced; in most cases, [trace_scoped]
57/// should be used instead.
58///
59/// The behavior of Metadata specification depends on the implementation of [Tracer] being used.
60/// Chromium's trace event format will merge metadata from beginning and end, preferring values from
61/// the end in the case of conflict.
62///
63/// # Example
64/// ```
65/// # #[macro_use] extern crate tracing_facade;
66/// trace_begin!("foo");
67/// trace_begin!("bar", "value": 42);
68/// trace_end!("bar", "value": 123, "values": [1, 2, 3]);
69/// trace_end!("foo");
70/// ```
71#[macro_export]
72macro_rules! trace_end {
73  ($name: expr) => {
74    if $crate::is_enabled() {
75      let event = $crate::Event {
76        name: $name.into(),
77        kind: $crate::EventKind::SyncEnd,
78        metadata: $crate::Metadata::default(),
79      };
80      $crate::record_event(event);
81    }
82  };
83
84  ($name: expr, $($metadata: tt)+) => {
85    if $crate::is_enabled() {
86      let metadata = if $crate::supports_metadata() {
87        $crate::Metadata::from_json(serde_json::json!({$($metadata)+}))
88      } else {
89        $crate::Metadata::default()
90      };
91
92      let event = $crate::Event {
93        name: $name.into(),
94        kind: $crate::EventKind::SyncEnd,
95        metadata,
96      };
97      $crate::record_event(event);
98    }
99  };
100}
101
102/// Traces in a given scope.
103///
104/// [trace_scoped] calls [trace_begin], and then constructs a scope guard that calls [trace_end]
105/// upon the exit of the scope. Metadata, if specified, is provided to only [trace_begin].
106#[macro_export]
107macro_rules! trace_scoped {
108  ($name: expr) => {
109    let guard = if $crate::is_enabled() {
110      let name: std::borrow::Cow<str> = $name.into();
111      $crate::trace_begin!(name.clone());
112      Some($crate::guard(name, move |name| {
113        $crate::trace_end!(name);
114      }))
115    } else {
116      None
117    };
118  };
119
120  ($name: expr, $($metadata: tt)+) => {
121    let guard = if $crate::is_enabled() {
122      let name: std::borrow::Cow<str> = $name.into();
123      let metadata = if $crate::supports_metadata() {
124        $crate::Metadata::from_json(serde_json::json!({$($metadata)+}))
125      } else {
126        $crate::Metadata::default()
127      };
128      $crate::trace_begin!(name.clone(), metadata);
129      Some($crate::guard(name, move |name| {
130        $crate::trace_end!(name);
131      }))
132    } else {
133      None
134    };
135  };
136}