Skip to content

Commit 752f7d8

Browse files
authored
日志和respons 中追加requestid (#1170)
* limit MaxConcurrency * attach request id in tracing and response header
1 parent dcc38b7 commit 752f7d8

File tree

1 file changed

+34
-9
lines changed

1 file changed

+34
-9
lines changed

crates/extra/src/request_id.rs

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
//! }
2020
//! ```
2121
use std::fmt::{self, Debug, Formatter};
22-
22+
use tracing::Instrument;
2323
use ulid::Ulid;
2424

25-
use salvo_core::http::{Request, Response, header::HeaderName};
25+
use salvo_core::http::{HeaderValue, Request, Response, header::HeaderName};
2626
use salvo_core::{Depot, FlowCtrl, Handler, async_trait};
2727

2828
/// Key for incoming flash messages in depot.
@@ -92,6 +92,11 @@ impl RequestId {
9292
self.generator = Box::new(generator);
9393
self
9494
}
95+
96+
fn generate_id(&self, req: &mut Request, depot: &mut Depot) -> HeaderValue {
97+
let id = self.generator.generate(req, depot);
98+
HeaderValue::from_str(&id).expect("invalid header value")
99+
}
95100
}
96101

97102
impl Default for RequestId {
@@ -137,14 +142,34 @@ impl Handler for RequestId {
137142
&self,
138143
req: &mut Request,
139144
depot: &mut Depot,
140-
_res: &mut Response,
141-
_ctrl: &mut FlowCtrl,
145+
res: &mut Response,
146+
ctrl: &mut FlowCtrl,
142147
) {
143-
if !self.overwrite && req.headers().contains_key(&self.header_name) {
144-
return;
148+
let request_id = match req.headers().get(&self.header_name) {
149+
None => self.generate_id(req, depot),
150+
Some(value) => {
151+
if self.overwrite {
152+
self.generate_id(req, depot)
153+
} else {
154+
value.clone()
155+
}
156+
}
157+
};
158+
159+
let _ = req.add_header(self.header_name.clone(), &request_id, false);
160+
161+
let span = tracing::info_span!("request", ?request_id);
162+
163+
res.headers_mut()
164+
.insert(self.header_name.clone(), request_id.clone());
165+
166+
depot.insert(REQUEST_ID_KEY, request_id);
167+
168+
169+
async move {
170+
ctrl.call_next(req, depot, res).await;
145171
}
146-
let id = self.generator.generate(req, depot);
147-
let _ = req.add_header(self.header_name.clone(), &id, true);
148-
depot.insert(REQUEST_ID_KEY, id);
172+
.instrument(span)
173+
.await;
149174
}
150175
}

0 commit comments

Comments
 (0)