Skip to content

Commit 855d4d9

Browse files
sypharjyn514
authored andcommitted
Resolves rust-lang#1151 - send errors, error-logs and panics to sentry
1 parent 333ed8a commit 855d4d9

File tree

5 files changed

+211
-21
lines changed

5 files changed

+211
-21
lines changed

Cargo.lock

Lines changed: 173 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 0 deletions
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

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,29 @@ use docs_rs::{
1111
BuildQueue, Config, Context, Index, Metrics, PackageKind, RustwideBuilder, Server, Storage,
1212
};
1313
use once_cell::sync::OnceCell;
14+
use sentry_anyhow::capture_anyhow;
15+
use sentry_log::SentryLogger;
1416
use structopt::StructOpt;
1517
use strum::VariantNames;
1618

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

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

36-
fn logger_init() {
61+
fn logger_init() -> env_logger::Logger {
3762
use std::io::Write;
3863

3964
let env = env_logger::Env::default().filter_or("DOCSRS_LOG", "docs_rs=info");
40-
let logger = env_logger::from_env(env)
65+
env_logger::from_env(env)
4166
.format(|buf, record| {
4267
writeln!(
4368
buf,
@@ -48,9 +73,7 @@ fn logger_init() {
4873
record.args()
4974
)
5075
})
51-
.build();
52-
53-
rustwide::logging::init_with(logger);
76+
.build()
5477
}
5578

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

src/build_queue.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,8 @@ impl BuildQueue {
129129
}
130130

131131
error!(
132-
"Failed to build package {}-{} from queue: {}\nBacktrace: {}",
133-
to_process.name,
134-
to_process.version,
135-
e,
136-
e.backtrace()
132+
"Failed to build package {}-{} from queue: {}",
133+
to_process.name, to_process.version, e,
137134
);
138135
}
139136
}

src/web/mod.rs

Lines changed: 3 additions & 4 deletions
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)