Skip to content

Commit cf80426

Browse files
committed
wip: log matching item in compact mode
1 parent c5979c5 commit cf80426

File tree

7 files changed

+74
-23
lines changed

7 files changed

+74
-23
lines changed

core/lib/src/server.rs

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ impl Rocket<Orbit> {
3434
upgrade: Option<hyper::upgrade::OnUpgrade>,
3535
connection: ConnectionMeta,
3636
) -> Result<hyper::Response<ReaderStream<ErasedResponse>>, http::Error> {
37+
connection.trace_debug();
3738
let request = ErasedRequest::new(self, parts, |rocket, parts| {
3839
Request::from_hyp(rocket, parts, connection).unwrap_or_else(|e| e)
3940
});

core/lib/src/trace/subscriber/common.rs

+3-8
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
use std::fmt;
22
use std::cell::Cell;
3-
use std::sync::OnceLock;
43

54
use tracing::field::Field;
65
use tracing::{Level, Metadata};
7-
use tracing_subscriber::prelude::*;
8-
use tracing_subscriber::layer::Layered;
9-
use tracing_subscriber::{reload, filter, Layer, Registry};
6+
use tracing_subscriber::filter;
107
use tracing_subscriber::field::RecordFields;
118

129
use thread_local::ThreadLocal;
1310
use yansi::{Condition, Paint, Style};
1411

15-
use crate::config::{Config, CliColors};
16-
use crate::trace::subscriber::{RecordDisplay, RequestId, RequestIdLayer};
12+
use crate::config::CliColors;
13+
use crate::trace::subscriber::RecordDisplay;
1714
use crate::util::Formatter;
1815

1916
mod private {
@@ -31,8 +28,6 @@ pub struct RocketFmt<K: private::FmtKind> {
3128
pub(crate) style: Style,
3229
}
3330

34-
pub type Handle<K> = reload::Handle<RocketFmt<K>, Layered<RequestIdLayer, Registry>>;
35-
3631
impl<K: private::FmtKind + Default + Copy> RocketFmt<K> {
3732
pub(crate) fn state(&self) -> K {
3833
self.state.get_or_default().get()

core/lib/src/trace/subscriber/compact.rs

+51-10
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@ use std::fmt;
22
use std::time::Instant;
33
use std::num::NonZeroU64;
44

5-
use time::OffsetDateTime;
6-
use tracing::level_filters::LevelFilter;
75
use tracing::{Event, Level, Metadata, Subscriber};
86
use tracing::span::{Attributes, Id, Record};
9-
107
use tracing_subscriber::layer::{Layer, Context};
118
use tracing_subscriber::registry::LookupSpan;
129
use tracing_subscriber::field::RecordFields;
1310

11+
use time::OffsetDateTime;
1412
use yansi::{Paint, Painted};
1513

1614
use crate::util::Formatter;
1715
use crate::trace::subscriber::{Data, RocketFmt};
16+
use crate::http::{Status, StatusClass};
17+
use super::RecordDisplay;
1818

1919
#[derive(Debug, Default, Copy, Clone)]
2020
pub struct Compact {
@@ -26,13 +26,15 @@ pub struct Compact {
2626
pub struct RequestData {
2727
start: Instant,
2828
fields: Data,
29+
item: Option<(String, String)>,
2930
}
3031

3132
impl RequestData {
3233
pub fn new<T: RecordFields>(attrs: T) -> Self {
3334
Self {
3435
start: Instant::now(),
3536
fields: Data::new(attrs),
37+
item: None,
3638
}
3739
}
3840
}
@@ -95,11 +97,17 @@ impl<S: Subscriber + for<'a> LookupSpan<'a>> Layer<S> for RocketFmt<Compact> {
9597

9698
fn on_event(&self, event: &Event<'_>, ctxt: Context<'_, S>) {
9799
if let Some(id) = self.request_span_id() {
98-
if event.metadata().name() == "response" {
100+
let name = event.metadata().name();
101+
if name == "response" {
99102
let req_span = ctxt.span(&id).expect("on_event: req does not exist");
100103
let mut exts = req_span.extensions_mut();
101104
let data = exts.get_mut::<RequestData>().unwrap();
102105
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()))
103111
}
104112

105113
if !self.in_debug() {
@@ -169,16 +177,49 @@ impl<S: Subscriber + for<'a> LookupSpan<'a>> Layer<S> for RocketFmt<Compact> {
169177
let datetime = OffsetDateTime::now_utc() - elapsed;
170178
let timestamp = self.timestamp_for(datetime);
171179

172-
let style = self.style(span.metadata());
180+
let s = self.style(span.metadata());
173181
let prefix = self.prefix(span.metadata());
174182
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(),
178219
elapsed.as_millis(),
179-
&data.fields["method"].paint(style),
220+
&data.fields["method"].paint(s),
180221
&data.fields["uri"],
181-
&data.fields["status"],
222+
&data.fields["status"].paint(status_style),
182223
);
183224
}
184225
}

core/lib/src/trace/subscriber/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,4 @@ pub use common::RocketFmt;
1111
pub use request_id::{RequestId, RequestIdLayer};
1212
pub use dynamic::RocketDynFmt;
1313

14-
pub(crate) use common::Handle;
1514
pub(crate) use visit::{RecordDisplay, Data};

core/lib/src/trace/subscriber/pretty.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
use std::fmt;
2-
use std::sync::OnceLock;
32

3+
use tracing::field::Field;
44
use tracing::{Event, Level, Metadata, Subscriber};
55
use tracing::span::{Attributes, Id, Record};
6-
use tracing::field::Field;
7-
86
use tracing_subscriber::layer::{Layer, Context};
97
use tracing_subscriber::registry::LookupSpan;
108
use tracing_subscriber::field::RecordFields;
119

1210
use yansi::{Paint, Painted};
1311

14-
use crate::trace::subscriber::{Data, RecordDisplay, Handle, RocketFmt};
1512
use crate::util::Formatter;
13+
use crate::trace::subscriber::{Data, RecordDisplay, RocketFmt};
1614

1715
#[derive(Debug, Default, Copy, Clone)]
1816
pub struct Pretty {

core/lib/src/trace/subscriber/visit.rs

+7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use tracing_subscriber::field::RecordFields;
77
use crate::util::Formatter;
88

99
pub trait RecordDisplay: RecordFields {
10+
fn find_map_display<T, F: Fn(&dyn fmt::Display) -> T>(&self, name: &str, f: F) -> Option<T>;
1011
fn record_display<F: FnMut(&Field, &dyn fmt::Display)>(&self, f: F);
1112
}
1213

@@ -53,6 +54,12 @@ impl Visit for Data {
5354
}
5455

5556
impl<T: RecordFields> RecordDisplay for T {
57+
fn find_map_display<V, F: Fn(&dyn fmt::Display) -> V>(&self, name: &str, f: F) -> Option<V> {
58+
let mut value = None;
59+
self.record_display(|field, item| if field.name() == name { value = Some(f(item)); });
60+
value
61+
}
62+
5663
fn record_display<F: FnMut(&Field, &dyn fmt::Display)>(&self, f: F) {
5764
struct DisplayVisit<F>(F);
5865

core/lib/src/trace/traceable.rs

+10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::error::Error as StdError;
22

3+
use crate::request::ConnectionMeta;
34
use crate::sentinel::Sentry;
45
use crate::util::Formatter;
56
use crate::{route, Catcher, Config, Error, Request, Response, Route};
@@ -270,6 +271,15 @@ impl Traceable for Request<'_> {
270271
}
271272
}
272273

274+
impl Traceable for ConnectionMeta {
275+
fn trace(&self, level: Level) {
276+
event!(level, "connection",
277+
endpoint = self.peer_endpoint.as_ref().map(display),
278+
certs = self.peer_certs.is_some(),
279+
)
280+
}
281+
}
282+
273283
impl Traceable for ErrorKind {
274284
fn trace(&self, level: Level) {
275285
use ErrorKind::*;

0 commit comments

Comments
 (0)