@@ -38,6 +38,23 @@ macro_rules! private_tracing_dynamic_event {
3838 } } ;
3939}
4040
41+ #[ doc( hidden) ]
42+ #[ macro_export]
43+ macro_rules! private_tracing_dynamic_span {
44+ ( target: $target: expr, $level: expr, $( $args: tt) * ) => { {
45+ use :: tracing:: Level ;
46+
47+ match $level {
48+ Level :: ERROR => :: tracing:: span!( target: $target, Level :: ERROR , $( $args) * ) ,
49+ Level :: WARN => :: tracing:: span!( target: $target, Level :: WARN , $( $args) * ) ,
50+ Level :: INFO => :: tracing:: span!( target: $target, Level :: INFO , $( $args) * ) ,
51+ Level :: DEBUG => :: tracing:: span!( target: $target, Level :: DEBUG , $( $args) * ) ,
52+ Level :: TRACE => :: tracing:: span!( target: $target, Level :: TRACE , $( $args) * ) ,
53+ }
54+ } } ;
55+ }
56+
57+
4158#[ doc( hidden) ]
4259pub fn private_level_filter_to_levels (
4360 filter : log:: LevelFilter ,
@@ -68,16 +85,33 @@ pub struct QueryLogger<'q> {
6885 rows_affected : u64 ,
6986 start : Instant ,
7087 settings : LogSettings ,
88+ pub span : tracing:: Span ,
7189}
7290
7391impl < ' q > QueryLogger < ' q > {
74- pub fn new ( sql : & ' q str , settings : LogSettings ) -> Self {
92+ pub fn new ( sql : & ' q str , db_system : & ' q str , settings : LogSettings ) -> Self {
93+ use tracing:: field:: Empty ;
94+
95+ let level = private_level_filter_to_trace_level ( settings. tracing_span_level ( ) ) . unwrap_or ( tracing:: Level :: TRACE ) ;
96+
97+ let span = private_tracing_dynamic_span ! (
98+ target: "sqlx::query" ,
99+ level,
100+ "sqlx::query" ,
101+ summary = Empty ,
102+ db. statement = Empty ,
103+ db. system = db_system,
104+ rows_affected = Empty ,
105+ rows_returned = Empty ,
106+ ) ;
107+
75108 Self {
76109 sql,
77110 rows_returned : 0 ,
78111 rows_affected : 0 ,
79112 start : Instant :: now ( ) ,
80113 settings,
114+ span,
81115 }
82116 }
83117
@@ -100,6 +134,7 @@ impl<'q> QueryLogger<'q> {
100134 self . settings . statements_level
101135 } ;
102136
137+ // only create an event if the level filter is set
103138 if let Some ( ( tracing_level, log_level) ) = private_level_filter_to_levels ( lvl) {
104139 // The enabled level could be set from either tracing world or log world, so check both
105140 // to see if logging should be enabled for our level
@@ -122,37 +157,34 @@ impl<'q> QueryLogger<'q> {
122157 String :: new ( )
123158 } ;
124159
125- if was_slow {
160+ self . span . record ( "summary" , summary) ;
161+ self . span . record ( "db.statement" , sql) ;
162+ self . span . record ( "rows_affected" , self . rows_affected ) ;
163+ self . span . record ( "rows_returned" , self . rows_returned ) ;
164+
165+ let _e = self . span . enter ( ) ;
166+ if was_slow {
126167 private_tracing_dynamic_event ! (
127168 target: "sqlx::query" ,
128169 tracing_level,
129- summary,
130- db. statement = sql,
131- rows_affected = self . rows_affected,
132- rows_returned = self . rows_returned,
133- // Human-friendly - includes units (usually ms). Also kept for backward compatibility
134- ?elapsed,
135- // Search friendly - numeric
136- elapsed_secs = elapsed. as_secs_f64( ) ,
137- // When logging to JSON, one can trigger alerts from the presence of this field.
138170 slow_threshold=?self . settings. slow_statements_duration,
171+ // Human-friendly - includes units (usually ms). Also kept for backward compatibility
172+ ?elapsed,
173+ // Search friendly - numeric
174+ elapsed_secs = elapsed. as_secs_f64( ) ,
139175 // Make sure to use "slow" in the message as that's likely
140176 // what people will grep for.
141177 "slow statement: execution time exceeded alert threshold"
142- ) ;
178+ )
143179 } else {
144180 private_tracing_dynamic_event ! (
145- target: "sqlx::query" ,
146- tracing_level,
147- summary,
148- db. statement = sql,
149- rows_affected = self . rows_affected,
150- rows_returned = self . rows_returned,
151- // Human-friendly - includes units (usually ms). Also kept for backward compatibility
152- ?elapsed,
153- // Search friendly - numeric
154- elapsed_secs = elapsed. as_secs_f64( ) ,
155- ) ;
181+ target: "sqlx::query" ,
182+ tracing_level,
183+ // Human-friendly - includes units (usually ms). Also kept for backward compatibility
184+ ?elapsed,
185+ // Search friendly - numeric
186+ elapsed_secs = elapsed. as_secs_f64( ) ,
187+ )
156188 }
157189 }
158190 }
0 commit comments