1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use std::sync::Mutex;
use rocket::fairing::{Fairing, Info, Kind};
use rocket::Rocket;
use sentry::internals::ClientInitGuard;
pub struct RocketSentry {
guard: Mutex<Option<ClientInitGuard>>,
}
impl RocketSentry {
pub fn fairing() -> impl Fairing {
RocketSentry {
guard: Mutex::new(None),
}
}
fn init(&self, dsn: &str) {
let guard = sentry::init(dsn);
if guard.is_enabled() {
let mut self_guard = self.guard.lock().unwrap();
*self_guard = Some(guard);
self.configure();
println!("Sentry enabled.");
} else {
println!("Sentry did not initialize.");
}
}
fn configure(&self) {
sentry::integrations::panic::register_panic_handler();
}
}
impl Fairing for RocketSentry {
fn info(&self) -> Info {
Info {
name: "rocket-sentry",
kind: Kind::Attach | Kind::Response,
}
}
fn on_attach(&self, rocket: Rocket) -> Result<Rocket, Rocket> {
match rocket.config().get_str("sentry_dsn") {
Ok("") => {
println!("Sentry disabled.");
}
Ok(dsn) => {
self.init(dsn);
}
Err(err) => println!("Sentry disabled: {}", err),
}
Ok(rocket)
}
}