use sentry_core::protocol::{Event, Stacktrace};
use sentry_core::{ClientOptions, Integration};
#[derive(Debug, Default)]
pub struct UnresolvedStacktraceIntegration;
impl Integration for UnresolvedStacktraceIntegration {
fn name(&self) -> &'static str {
"attach-unresolved-stacktrace"
}
fn setup(&self, options: &mut ClientOptions) {
assert!(
!options.integrations.iter().any(|integration| {
integration
.as_ref()
.as_any()
.is::<sentry_backtrace::AttachStacktraceIntegration>()
}),
"UnresolvedStacktraceIntegration must replace sentry_backtrace::AttachStacktraceIntegration"
);
}
fn process_event(
&self,
mut event: Event<'static>,
options: &ClientOptions,
) -> Option<Event<'static>> {
if !options.attach_stacktrace
|| event.stacktrace.is_some()
|| event
.exception
.iter()
.any(|exception| exception.stacktrace.is_some())
|| event
.threads
.iter()
.any(|thread| thread.stacktrace.is_some())
{
return Some(event);
}
if let Some(stacktrace) = unresolved_stacktrace() {
let mut thread = sentry_backtrace::current_thread(false);
thread.stacktrace = Some(stacktrace);
event.threads.values.push(thread);
}
Some(event)
}
}
pub(crate) fn unresolved_stacktrace() -> Option<Stacktrace> {
sentry_backtrace::backtrace_to_stacktrace(&backtrace::Backtrace::new_unresolved())
}