Skip to content

Commit 486bc47

Browse files
committed
middleware::LogRequests: Extract Sentry setup into dedicated middleware struct
1 parent 84348ce commit 486bc47

File tree

4 files changed

+63
-45
lines changed

4 files changed

+63
-45
lines changed

src/middleware.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,19 @@ mod log_connection_pool_status;
2525
pub mod log_request;
2626
mod normalize_path;
2727
mod require_user_agent;
28-
mod response_timing;
28+
pub mod response_timing;
2929
mod static_or_continue;
3030
mod update_metrics;
3131

3232
use conduit_conditional_get::ConditionalGet;
3333
use conduit_cookie::{Middleware as Cookie, SessionMiddleware};
3434
use conduit_middleware::MiddlewareBuilder;
3535
use conduit_router::RouteBuilder;
36-
use sentry_conduit::SentryMiddleware;
3736

3837
use std::env;
3938
use std::sync::Arc;
4039

40+
use crate::sentry::SentryMiddleware;
4141
use crate::{App, Env};
4242

4343
pub fn build_middleware(app: Arc<App>, endpoints: RouteBuilder) -> MiddlewareBuilder {

src/middleware/log_request.rs

Lines changed: 0 additions & 43 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::response_timing::ResponseTime;
@@ -17,23 +16,9 @@ const SLOW_REQUEST_THRESHOLD_MS: u64 = 1000;
1716
pub(super) struct LogRequests();
1817

1918
impl Middleware for LogRequests {
20-
fn before(&self, req: &mut dyn RequestExt) -> BeforeResult {
21-
if let Some(request_id) = req
22-
.headers()
23-
.get("x-request-id")
24-
.and_then(|value| value.to_str().ok())
25-
{
26-
sentry::configure_scope(|scope| scope.set_tag("request.id", request_id));
27-
}
28-
29-
Ok(())
30-
}
31-
3219
fn after(&self, req: &mut dyn RequestExt, res: AfterResult) -> AfterResult {
3320
println!("{}", RequestLine { req, res: &res });
3421

35-
report_to_sentry(req, &res);
36-
3722
res
3823
}
3924
}
@@ -56,34 +41,6 @@ pub fn add_custom_metadata<V: Display>(req: &mut dyn RequestExt, key: &'static s
5641
sentry::configure_scope(|scope| scope.set_extra(key, value.to_string().into()));
5742
}
5843

59-
fn report_to_sentry(req: &dyn RequestExt, res: &AfterResult) {
60-
sentry::configure_scope(|scope| {
61-
{
62-
let id = req.session().get("user_id").map(|str| str.to_string());
63-
64-
let user = sentry::User {
65-
id,
66-
..Default::default()
67-
};
68-
69-
scope.set_user(Some(user));
70-
}
71-
72-
{
73-
let status = res
74-
.as_ref()
75-
.map(|resp| resp.status())
76-
.unwrap_or(StatusCode::INTERNAL_SERVER_ERROR);
77-
78-
scope.set_tag("response.status", status.as_str());
79-
}
80-
81-
if let Some(response_time) = req.extensions().find::<ResponseTime>() {
82-
scope.set_extra("Response time [ms]", response_time.as_millis().into());
83-
}
84-
});
85-
}
86-
8744
#[cfg(test)]
8845
pub(crate) fn get_log_message(req: &dyn RequestExt, key: &'static str) -> String {
8946
// Unwrap shouldn't panic as no other code has access to the private struct to remove it

src/sentry/middleware.rs

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

src/sentry/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
mod middleware;
2+
3+
pub use middleware::CustomSentryMiddleware as SentryMiddleware;
14
use sentry::{ClientInitGuard, ClientOptions, IntoDsn};
25

36
/// Initializes the Sentry SDK from the environment variables.

0 commit comments

Comments
 (0)