@@ -2,19 +2,19 @@ use std::fmt;
2
2
use std:: time:: Instant ;
3
3
use std:: num:: NonZeroU64 ;
4
4
5
- use time:: OffsetDateTime ;
6
- use tracing:: level_filters:: LevelFilter ;
7
5
use tracing:: { Event , Level , Metadata , Subscriber } ;
8
6
use tracing:: span:: { Attributes , Id , Record } ;
9
-
10
7
use tracing_subscriber:: layer:: { Layer , Context } ;
11
8
use tracing_subscriber:: registry:: LookupSpan ;
12
9
use tracing_subscriber:: field:: RecordFields ;
13
10
11
+ use time:: OffsetDateTime ;
14
12
use yansi:: { Paint , Painted } ;
15
13
16
14
use crate :: util:: Formatter ;
17
15
use crate :: trace:: subscriber:: { Data , RocketFmt } ;
16
+ use crate :: http:: { Status , StatusClass } ;
17
+ use super :: RecordDisplay ;
18
18
19
19
#[ derive( Debug , Default , Copy , Clone ) ]
20
20
pub struct Compact {
@@ -26,13 +26,15 @@ pub struct Compact {
26
26
pub struct RequestData {
27
27
start : Instant ,
28
28
fields : Data ,
29
+ item : Option < ( String , String ) > ,
29
30
}
30
31
31
32
impl RequestData {
32
33
pub fn new < T : RecordFields > ( attrs : T ) -> Self {
33
34
Self {
34
35
start : Instant :: now ( ) ,
35
36
fields : Data :: new ( attrs) ,
37
+ item : None ,
36
38
}
37
39
}
38
40
}
@@ -95,11 +97,17 @@ impl<S: Subscriber + for<'a> LookupSpan<'a>> Layer<S> for RocketFmt<Compact> {
95
97
96
98
fn on_event ( & self , event : & Event < ' _ > , ctxt : Context < ' _ , S > ) {
97
99
if let Some ( id) = self . request_span_id ( ) {
98
- if event. metadata ( ) . name ( ) == "response" {
100
+ let name = event. metadata ( ) . name ( ) ;
101
+ if name == "response" {
99
102
let req_span = ctxt. span ( & id) . expect ( "on_event: req does not exist" ) ;
100
103
let mut exts = req_span. extensions_mut ( ) ;
101
104
let data = exts. get_mut :: < RequestData > ( ) . unwrap ( ) ;
102
105
event. record ( & mut data. fields ) ;
106
+ } else if name == "catcher" || name == "route" {
107
+ let req_span = ctxt. span ( & id) . expect ( "on_event: req does not exist" ) ;
108
+ let mut exts = req_span. extensions_mut ( ) ;
109
+ let data = exts. get_mut :: < RequestData > ( ) . unwrap ( ) ;
110
+ data. item = event. find_map_display ( "name" , |v| ( name. into ( ) , v. to_string ( ) ) )
103
111
}
104
112
105
113
if !self . in_debug ( ) {
@@ -169,16 +177,49 @@ impl<S: Subscriber + for<'a> LookupSpan<'a>> Layer<S> for RocketFmt<Compact> {
169
177
let datetime = OffsetDateTime :: now_utc ( ) - elapsed;
170
178
let timestamp = self . timestamp_for ( datetime) ;
171
179
172
- let style = self . style ( span. metadata ( ) ) ;
180
+ let s = self . style ( span. metadata ( ) ) ;
173
181
let prefix = self . prefix ( span. metadata ( ) ) ;
174
182
let chevron = self . chevron ( span. metadata ( ) ) ;
175
-
176
- println ! ( "{prefix}{chevron} ({} {}ms) {} {} => {}" ,
177
- timestamp. paint( style) . primary( ) . dim( ) ,
183
+ let arrow = "→" . paint ( s. primary ( ) . bright ( ) ) ;
184
+
185
+ let status_class = data. fields [ "status" ] . parse ( ) . ok ( )
186
+ . and_then ( Status :: from_code)
187
+ . map ( |status| status. class ( ) ) ;
188
+
189
+ let status_style = match status_class {
190
+ Some ( StatusClass :: Informational ) => s,
191
+ Some ( StatusClass :: Success ) => s. green ( ) ,
192
+ Some ( StatusClass :: Redirection ) => s. magenta ( ) ,
193
+ Some ( StatusClass :: ClientError ) => s. yellow ( ) ,
194
+ Some ( StatusClass :: ServerError ) => s. red ( ) ,
195
+ Some ( StatusClass :: Unknown ) => s. cyan ( ) ,
196
+ None => s. primary ( ) ,
197
+ } ;
198
+
199
+ let autohandle = Formatter ( |f| {
200
+ match data. fields . get ( "autohandled" ) {
201
+ Some ( "true" ) => write ! ( f, " {} {}" , "via" . paint( s. dim( ) ) , "GET" . paint( s) ) ,
202
+ _ => Ok ( ( ) )
203
+ }
204
+ } ) ;
205
+
206
+ let item = Formatter ( |f| {
207
+ match & data. item {
208
+ Some ( ( kind, name) ) => write ! ( f,
209
+ "{} {} {arrow} " ,
210
+ kind. paint( s) ,
211
+ name. paint( s. bold( ) ) ,
212
+ ) ,
213
+ None => Ok ( ( ) )
214
+ }
215
+ } ) ;
216
+
217
+ println ! ( "{prefix}{chevron} ({} {}ms) {}{autohandle} {} {arrow} {item}{}" ,
218
+ timestamp. paint( s) . primary( ) . dim( ) ,
178
219
elapsed. as_millis( ) ,
179
- & data. fields[ "method" ] . paint( style ) ,
220
+ & data. fields[ "method" ] . paint( s ) ,
180
221
& data. fields[ "uri" ] ,
181
- & data. fields[ "status" ] ,
222
+ & data. fields[ "status" ] . paint ( status_style ) ,
182
223
) ;
183
224
}
184
225
}
0 commit comments