@@ -38,6 +38,23 @@ macro_rules! private_tracing_dynamic_event {
38
38
} } ;
39
39
}
40
40
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
+
41
58
#[ doc( hidden) ]
42
59
pub fn private_level_filter_to_levels (
43
60
filter : log:: LevelFilter ,
@@ -68,16 +85,33 @@ pub struct QueryLogger<'q> {
68
85
rows_affected : u64 ,
69
86
start : Instant ,
70
87
settings : LogSettings ,
88
+ pub span : tracing:: Span ,
71
89
}
72
90
73
91
impl < ' 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
+
75
108
Self {
76
109
sql,
77
110
rows_returned : 0 ,
78
111
rows_affected : 0 ,
79
112
start : Instant :: now ( ) ,
80
113
settings,
114
+ span,
81
115
}
82
116
}
83
117
@@ -100,6 +134,7 @@ impl<'q> QueryLogger<'q> {
100
134
self . settings . statements_level
101
135
} ;
102
136
137
+ // only create an event if the level filter is set
103
138
if let Some ( ( tracing_level, log_level) ) = private_level_filter_to_levels ( lvl) {
104
139
// The enabled level could be set from either tracing world or log world, so check both
105
140
// to see if logging should be enabled for our level
@@ -122,37 +157,30 @@ impl<'q> QueryLogger<'q> {
122
157
String :: new ( )
123
158
} ;
124
159
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 {
126
167
private_tracing_dynamic_event ! (
127
168
target: "sqlx::query" ,
128
169
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.
138
170
slow_threshold=?self . settings. slow_statements_duration,
139
171
// Make sure to use "slow" in the message as that's likely
140
172
// what people will grep for.
141
173
"slow statement: execution time exceeded alert threshold"
142
- ) ;
174
+ )
143
175
} else {
144
176
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
- ) ;
177
+ target: "sqlx::query" ,
178
+ tracing_level,
179
+ // Human-friendly - includes units (usually ms). Also kept for backward compatibility
180
+ ?elapsed,
181
+ // Search friendly - numeric
182
+ elapsed_secs = elapsed. as_secs_f64( ) ,
183
+ )
156
184
}
157
185
}
158
186
}
0 commit comments