Skip to content

Commit 221f50d

Browse files
committed
middleware::log_request: Split Sentry error reporting code into dedicated middleware
1 parent 59901d7 commit 221f50d

File tree

3 files changed

+60
-45
lines changed

3 files changed

+60
-45
lines changed

src/middleware.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use self::head::Head;
1111
use self::known_error_to_json::KnownErrorToJson;
1212
use self::log_connection_pool_status::LogConnectionPoolStatus;
1313
use self::request_timing::RequestTiming;
14+
use self::sentry::SentryMiddleware as CustomSentryMiddleware;
1415
use self::static_or_continue::StaticOrContinue;
1516
use self::update_metrics::UpdateMetrics;
1617

@@ -27,6 +28,7 @@ pub mod log_request;
2728
mod normalize_path;
2829
mod request_timing;
2930
mod require_user_agent;
31+
mod sentry;
3032
mod static_or_continue;
3133
mod update_metrics;
3234

@@ -49,6 +51,7 @@ pub fn build_middleware(app: Arc<App>, endpoints: RouteBuilder) -> MiddlewareBui
4951
if env != Env::Test {
5052
m.add(ensure_well_formed_500::EnsureWellFormed500);
5153
m.add(log_request::LogRequests::default());
54+
m.add(CustomSentryMiddleware::default());
5255
m.around(SentryMiddleware::default());
5356
}
5457

src/middleware/log_request.rs

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use super::prelude::*;
55
use crate::util::request_header;
66

77
use conduit::{header, RequestExt, StatusCode};
8-
use conduit_cookie::RequestSession;
98

109
use crate::middleware::normalize_path::OriginalPath;
1110
use crate::middleware::request_timing::ResponseTime;
@@ -29,14 +28,12 @@ impl Middleware for LogRequests {
2928
}
3029
);
3130

32-
report_to_sentry(req, &res, response_time.as_millis());
33-
3431
res
3532
}
3633
}
3734

38-
struct CustomMetadata {
39-
entries: Vec<(&'static str, String)>,
35+
pub struct CustomMetadata {
36+
pub entries: Vec<(&'static str, String)>,
4037
}
4138

4239
pub fn add_custom_metadata<V: Display>(req: &mut dyn RequestExt, key: &'static str, value: V) {
@@ -51,46 +48,6 @@ pub fn add_custom_metadata<V: Display>(req: &mut dyn RequestExt, key: &'static s
5148
}
5249
}
5350

54-
fn report_to_sentry(req: &dyn RequestExt, res: &AfterResult, response_time: u64) {
55-
sentry::configure_scope(|scope| {
56-
{
57-
let id = req.session().get("user_id").map(|str| str.to_string());
58-
59-
let user = sentry::User {
60-
id,
61-
..Default::default()
62-
};
63-
64-
scope.set_user(Some(user));
65-
}
66-
67-
if let Some(request_id) = req
68-
.headers()
69-
.get("x-request-id")
70-
.and_then(|value| value.to_str().ok())
71-
{
72-
scope.set_tag("request.id", request_id);
73-
}
74-
75-
{
76-
let status = res
77-
.as_ref()
78-
.map(|resp| resp.status())
79-
.unwrap_or(StatusCode::INTERNAL_SERVER_ERROR);
80-
81-
scope.set_tag("response.status", status.as_str());
82-
}
83-
84-
scope.set_extra("Response time [ms]", response_time.into());
85-
86-
if let Some(metadata) = req.extensions().find::<CustomMetadata>() {
87-
for (key, value) in &metadata.entries {
88-
scope.set_extra(key, value.to_string().into());
89-
}
90-
}
91-
});
92-
}
93-
9451
#[cfg(test)]
9552
pub(crate) fn get_log_message(req: &dyn RequestExt, key: &'static str) -> String {
9653
// Unwrap shouldn't panic as no other code has access to the private struct to remove it

src/middleware/sentry.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
use super::prelude::*;
2+
use crate::middleware::log_request::CustomMetadata;
3+
use crate::middleware::request_timing::ResponseTime;
4+
use conduit::{RequestExt, StatusCode};
5+
use conduit_cookie::RequestSession;
6+
7+
#[derive(Default)]
8+
pub struct SentryMiddleware();
9+
10+
impl Middleware for SentryMiddleware {
11+
fn after(&self, req: &mut dyn RequestExt, res: AfterResult) -> AfterResult {
12+
sentry::configure_scope(|scope| {
13+
{
14+
let id = req.session().get("user_id").map(|str| str.to_string());
15+
16+
let user = sentry::User {
17+
id,
18+
..Default::default()
19+
};
20+
21+
scope.set_user(Some(user));
22+
}
23+
24+
if let Some(request_id) = req
25+
.headers()
26+
.get("x-request-id")
27+
.and_then(|value| value.to_str().ok())
28+
{
29+
scope.set_tag("request.id", request_id);
30+
}
31+
32+
{
33+
let status = res
34+
.as_ref()
35+
.map(|resp| resp.status())
36+
.unwrap_or(StatusCode::INTERNAL_SERVER_ERROR);
37+
38+
scope.set_tag("response.status", status.as_str());
39+
}
40+
41+
let response_time = req.extensions().find::<ResponseTime>();
42+
if let Some(response_time) = response_time {
43+
scope.set_extra("Response time [ms]", response_time.as_millis().into());
44+
}
45+
46+
if let Some(metadata) = req.extensions().find::<CustomMetadata>() {
47+
for (key, value) in &metadata.entries {
48+
scope.set_extra(key, value.to_string().into());
49+
}
50+
}
51+
});
52+
53+
res
54+
}
55+
}

0 commit comments

Comments
 (0)