Skip to content

Commit f439755

Browse files
sypharjyn514
authored andcommitted
Resolves rust-lang#1151 - send errors, error-logs and panics to sentry
1 parent 86dbdb5 commit f439755

File tree

5 files changed

+211
-21
lines changed

5 files changed

+211
-21
lines changed

Cargo.lock

+173-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ exclude = [
1919
consistency_check = ["crates-index"]
2020

2121
[dependencies]
22+
sentry = "0.23.0"
23+
sentry-log = "0.23.0"
24+
sentry-panic = "0.23.0"
25+
sentry-anyhow = { version = "0.23.0", features = ["backtrace"] }
2226
log = "0.4"
2327
regex = "1"
2428
structopt = "0.3"

src/bin/cratesfyi.rs

+29-6
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,29 @@ use docs_rs::{
1212
Storage,
1313
};
1414
use once_cell::sync::OnceCell;
15+
use sentry_anyhow::capture_anyhow;
16+
use sentry_log::SentryLogger;
1517
use structopt::StructOpt;
1618
use strum::VariantNames;
1719

1820
pub fn main() {
1921
let _ = dotenv::dotenv();
20-
logger_init();
22+
23+
let _sentry_guard = if let Ok(sentry_dsn) = env::var("SENTRY_DSN") {
24+
rustwide::logging::init_with(SentryLogger::with_dest(logger_init()));
25+
Some(sentry::init((
26+
sentry_dsn,
27+
sentry::ClientOptions {
28+
release: Some(docs_rs::BUILD_VERSION.into()),
29+
attach_stacktrace: true,
30+
..Default::default()
31+
}
32+
.add_integration(sentry_panic::PanicIntegration::default()),
33+
)))
34+
} else {
35+
rustwide::logging::init_with(logger_init());
36+
None
37+
};
2138

2239
if let Err(err) = CommandLine::from_args().handle_args() {
2340
let mut msg = format!("Error: {}", err);
@@ -30,15 +47,23 @@ pub fn main() {
3047
if !backtrace.is_empty() {
3148
eprintln!("\nStack backtrace:\n{}", backtrace);
3249
}
50+
51+
capture_anyhow(&err);
52+
53+
eprintln!("{}", msg);
54+
55+
// we need to drop the sentry guard here so all unsent
56+
// errors are sent to sentry
57+
drop(_sentry_guard);
3358
std::process::exit(1);
3459
}
3560
}
3661

37-
fn logger_init() {
62+
fn logger_init() -> env_logger::Logger {
3863
use std::io::Write;
3964

4065
let env = env_logger::Env::default().filter_or("DOCSRS_LOG", "docs_rs=info");
41-
let logger = env_logger::from_env(env)
66+
env_logger::from_env(env)
4267
.format(|buf, record| {
4368
writeln!(
4469
buf,
@@ -49,9 +74,7 @@ fn logger_init() {
4974
record.args()
5075
)
5176
})
52-
.build();
53-
54-
rustwide::logging::init_with(logger);
77+
.build()
5578
}
5679

5780
#[derive(Debug, Clone, Copy, PartialEq, Eq, strum::EnumString, strum::EnumVariantNames)]

src/build_queue.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,8 @@ impl BuildQueue {
120120
}
121121

122122
error!(
123-
"Failed to build package {}-{} from queue: {}\nBacktrace: {}",
124-
to_process.name,
125-
to_process.version,
126-
e,
127-
e.backtrace()
123+
"Failed to build package {}-{} from queue: {}",
124+
to_process.name, to_process.version, e,
128125
);
129126
}
130127
}

src/web/mod.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ macro_rules! ctry {
1515
Err(error) => {
1616
let request: &::iron::Request = $req;
1717

18+
// TODO this should be `capture_anyhow` if error is `anyhow::Error`
1819
::log::error!(
19-
"called ctry!() on an `Err` value: {:?}\nnote: while attempting to fetch the route {:?}\n{:?}",
20+
"called ctry!() on an `Err` value: {:?}\nnote: while attempting to fetch the route {:?}",
2021
error,
2122
request.url,
22-
::backtrace::Backtrace::new(),
2323
);
2424

2525
// This is very ugly, but it makes it impossible to get a type inference error
@@ -48,9 +48,8 @@ macro_rules! cexpect {
4848
let request: &::iron::Request = $req;
4949

5050
::log::error!(
51-
"called cexpect!() on a `None` value while attempting to fetch the route {:?}\n{:?}",
51+
"called cexpect!() on a `None` value while attempting to fetch the route {:?}",
5252
request.url,
53-
::backtrace::Backtrace::new(),
5453
);
5554

5655
// This is very ugly, but it makes it impossible to get a type inference error

0 commit comments

Comments
 (0)