tracing_s3/layer/with_event_from_span.rs
1/// Macro for creating synthetic events from span data.
2///
3/// This macro creates a new tracing event that appears to come from a specific span,
4/// allowing for rich span lifecycle logging with custom fields.
5///
6/// # Arguments
7/// * `$id` - The span ID
8/// * `$span` - The span reference
9/// * `$field:literal = $value:expr` - Field-value pairs to include in the event
10/// * `|$event| $code:block` - Closure that receives the created event
11///
12/// # Example
13/// ```rust
14/// with_event_from_span!(
15/// span_id,
16/// span_ref,
17/// "message" = "span_entered",
18/// "duration" = elapsed_time,
19/// |event| {
20/// // Handle the synthetic event
21/// self.on_event(&event, ctx);
22/// }
23/// );
24/// ```
25#[macro_export]
26macro_rules! with_event_from_span {
27 ($id:ident, $span:ident, $($field:literal = $value:expr),*, |$event:ident| $code:block) => {
28 let meta = $span.metadata();
29 let cs = meta.callsite();
30 let fs = field::FieldSet::new(&[$($field),*], cs);
31 #[allow(unused)]
32 let mut iter = fs.iter();
33 let v = [$(
34 (&iter.next().unwrap(), ::core::option::Option::Some(&$value as &dyn field::Value)),
35 )*];
36 let vs = fs.value_set(&v);
37 let $event = Event::new_child_of($id, meta, &vs);
38 $code
39 };
40}