@@ -48,19 +48,21 @@ macro_rules! error {
48
48
}
49
49
}
50
50
51
- #[ macro_export]
52
- macro_rules! trace_cmd {
53
- ( $cmd: expr) => {
54
- {
55
- :: tracing:: span!(
56
- target: "COMMAND" ,
57
- :: tracing:: Level :: TRACE ,
58
- "cmd" ,
59
- cmd = $cmd. fingerprint( ) . format_short_cmd( ) ,
60
- full_cmd = ?$cmd
61
- ) . entered( )
62
- }
63
- } ;
51
+ #[ cfg( feature = "tracing" ) ]
52
+ const COMMAND_SPAN_TARGET : & str = "COMMAND" ;
53
+
54
+ #[ cfg( feature = "tracing" ) ]
55
+ pub fn trace_cmd ( command : & crate :: BootstrapCommand ) -> tracing:: span:: EnteredSpan {
56
+ let fingerprint = command. fingerprint ( ) ;
57
+ tracing:: span!(
58
+ target: COMMAND_SPAN_TARGET ,
59
+ tracing:: Level :: TRACE ,
60
+ "cmd" ,
61
+ cmd_name = fingerprint. program_name( ) . to_string( ) ,
62
+ cmd = fingerprint. format_short_cmd( ) ,
63
+ full_cmd = ?command
64
+ )
65
+ . entered ( )
64
66
}
65
67
66
68
// # Note on `tracing` usage in bootstrap
@@ -87,7 +89,8 @@ mod inner {
87
89
use tracing_subscriber:: registry:: { LookupSpan , SpanRef } ;
88
90
use tracing_subscriber:: { EnvFilter , Layer } ;
89
91
90
- use crate :: STEP_NAME_TARGET ;
92
+ use crate :: STEP_SPAN_TARGET ;
93
+ use crate :: utils:: tracing:: COMMAND_SPAN_TARGET ;
91
94
92
95
pub fn setup_tracing ( profiling_enabled : bool ) -> Option < TracingGuard > {
93
96
let filter = EnvFilter :: from_env ( "BOOTSTRAP_TRACING" ) ;
@@ -110,10 +113,14 @@ mod inner {
110
113
. name_fn ( Box :: new ( |event_or_span| match event_or_span {
111
114
tracing_chrome:: EventOrSpan :: Event ( e) => e. metadata ( ) . name ( ) . to_string ( ) ,
112
115
tracing_chrome:: EventOrSpan :: Span ( s) => {
113
- if s. metadata ( ) . target ( ) == STEP_NAME_TARGET
116
+ if s. metadata ( ) . target ( ) == STEP_SPAN_TARGET
114
117
&& let Some ( extension) = s. extensions ( ) . get :: < StepNameExtension > ( )
115
118
{
116
119
extension. 0 . clone ( )
120
+ } else if s. metadata ( ) . target ( ) == COMMAND_SPAN_TARGET
121
+ && let Some ( extension) = s. extensions ( ) . get :: < CommandNameExtension > ( )
122
+ {
123
+ extension. 0 . clone ( )
117
124
} else {
118
125
s. metadata ( ) . name ( ) . to_string ( )
119
126
}
@@ -151,6 +158,8 @@ mod inner {
151
158
message : Option < String > ,
152
159
/// Name of a recorded psna
153
160
step_name : Option < String > ,
161
+ /// Short name of an executed command
162
+ cmd_name : Option < String > ,
154
163
/// The rest of arbitrary event/span fields
155
164
fields : Vec < ( & ' static str , String ) > ,
156
165
}
@@ -163,6 +172,9 @@ mod inner {
163
172
"step_name" => {
164
173
self . step_name = Some ( value. to_string ( ) ) ;
165
174
}
175
+ "cmd_name" => {
176
+ self . cmd_name = Some ( value. to_string ( ) ) ;
177
+ }
166
178
name => {
167
179
self . fields . push ( ( name, value. to_string ( ) ) ) ;
168
180
}
@@ -187,9 +199,12 @@ mod inner {
187
199
Enter ,
188
200
}
189
201
190
- /// Holds the name of a step, stored in `tracing_subscriber`'s extensions.
202
+ /// Holds the name of a step span , stored in `tracing_subscriber`'s extensions.
191
203
struct StepNameExtension ( String ) ;
192
204
205
+ /// Holds the name of a command span, stored in `tracing_subscriber`'s extensions.
206
+ struct CommandNameExtension ( String ) ;
207
+
193
208
#[ derive( Default ) ]
194
209
struct TracingPrinter {
195
210
indent : std:: sync:: atomic:: AtomicU32 ,
@@ -264,7 +279,7 @@ mod inner {
264
279
// We handle steps specially. We instrument them dynamically in `Builder::ensure`,
265
280
// and we want to have custom name for each step span. But tracing doesn't allow setting
266
281
// dynamic span names. So we detect step spans here and override their name.
267
- if span. metadata ( ) . target ( ) == STEP_NAME_TARGET {
282
+ if span. metadata ( ) . target ( ) == STEP_SPAN_TARGET {
268
283
let name = field_values. and_then ( |v| v. step_name . as_deref ( ) ) . unwrap_or ( span. name ( ) ) ;
269
284
write ! ( writer, "{name}" ) ?;
270
285
@@ -334,8 +349,14 @@ mod inner {
334
349
335
350
// We need to propagate the actual name of the span to the Chrome layer below, because
336
351
// it cannot access field values. We do that through extensions.
337
- if let Some ( step_name) = field_values. step_name . clone ( ) {
352
+ if attrs. metadata ( ) . target ( ) == STEP_SPAN_TARGET
353
+ && let Some ( step_name) = field_values. step_name . clone ( )
354
+ {
338
355
ctx. span ( id) . unwrap ( ) . extensions_mut ( ) . insert ( StepNameExtension ( step_name) ) ;
356
+ } else if attrs. metadata ( ) . target ( ) == COMMAND_SPAN_TARGET
357
+ && let Some ( cmd_name) = field_values. cmd_name . clone ( )
358
+ {
359
+ ctx. span ( id) . unwrap ( ) . extensions_mut ( ) . insert ( CommandNameExtension ( cmd_name) ) ;
339
360
}
340
361
self . span_values . lock ( ) . unwrap ( ) . insert ( id. clone ( ) , field_values) ;
341
362
}
0 commit comments