diff --git a/CHANGELOG.md b/CHANGELOG.md index 28ae54860..2ac9472f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ - The minium supported Rust version was bumped to **1.46.0** due to requirements from dependencies. +**Fixes**: + +- Honor the `attach_stacktrace` option correctly when capturing errors. + ## 0.22.0 **Breaking Changes**: diff --git a/sentry-backtrace/src/integration.rs b/sentry-backtrace/src/integration.rs index 49f68266e..4a3b6077b 100644 --- a/sentry-backtrace/src/integration.rs +++ b/sentry-backtrace/src/integration.rs @@ -73,7 +73,7 @@ impl Integration for AttachStacktraceIntegration { mut event: Event<'static>, options: &ClientOptions, ) -> Option> { - if options.attach_stacktrace && event.exception.is_empty() { + if options.attach_stacktrace && !has_stacktrace(&event) { let thread = current_thread(true); if thread.stacktrace.is_some() { event.threads.values.push(thread); @@ -83,6 +83,12 @@ impl Integration for AttachStacktraceIntegration { } } +fn has_stacktrace(event: &Event) -> bool { + event.stacktrace.is_some() + || event.exception.iter().any(|exc| exc.stacktrace.is_some()) + || event.threads.iter().any(|thrd| thrd.stacktrace.is_some()) +} + /// Captures information about the current thread. /// /// If `with_stack` is set to `true` the current stacktrace is diff --git a/sentry/tests/test_basic.rs b/sentry/tests/test_basic.rs index 33f5607dc..54bedc930 100644 --- a/sentry/tests/test_basic.rs +++ b/sentry/tests/test_basic.rs @@ -139,3 +139,38 @@ fn test_reentrant_configure_scope() { // well, the "outer" `configure_scope` wins assert_eq!(events[0].tags["which_scope"], "scope1"); } + +#[test] +fn test_attached_stacktrace() { + use log_ as log; + + let logger = sentry_log::SentryLogger::new(); + + log::set_boxed_logger(Box::new(logger)) + .map(|()| log::set_max_level(log::LevelFilter::Info)) + .unwrap(); + + let options = sentry::apply_defaults(sentry::ClientOptions { + attach_stacktrace: true, + ..Default::default() + }); + let events = sentry::test::with_captured_events_options( + || { + let error = "thisisnotanumber".parse::().unwrap_err(); + sentry::capture_error(&error); + + sentry::capture_message("some kind of message", sentry::Level::Info); + + log::error!("Shit's on fire yo"); + }, + options, + ); + + assert_eq!(events.len(), 3); + + let stacktraces: Vec<_> = events + .into_iter() + .flat_map(|ev| ev.threads.into_iter().filter_map(|thrd| thrd.stacktrace)) + .collect(); + assert_eq!(stacktraces.len(), 3); +}