add configuration for sentry to send panics and errors

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-07-11 02:04:21 +00:00
parent bc58e5002d
commit d88ab37120
3 changed files with 66 additions and 8 deletions

View file

@ -60,6 +60,13 @@
# Whether to attach a stacktrace to Sentry reports.
#sentry_attach_stacktrace = false
# Send panics to sentry. This is true by default, but sentry has to be enabled.
#sentry_send_panic = true
# Send errors to sentry. This is true by default, but sentry has to be enabled. This option is
# only effective in release-mode; forced to false in debug-mode.
#sentry_send_error = true
### Database configuration

View file

@ -358,6 +358,10 @@ pub struct Config {
pub sentry_traces_sample_rate: f32,
#[serde(default)]
pub sentry_attach_stacktrace: bool,
#[serde(default = "true_fn")]
pub sentry_send_panic: bool,
#[serde(default = "true_fn")]
pub sentry_send_error: bool,
#[serde(default)]
pub tokio_console: bool,
@ -822,6 +826,8 @@ impl fmt::Display for Config {
#[cfg(feature = "sentry_telemetry")]
("Sentry.io tracing sample rate", &self.sentry_traces_sample_rate.to_string()),
("Sentry.io attach stacktrace", &self.sentry_attach_stacktrace.to_string()),
("Sentry.io send panics", &self.sentry_send_panic.to_string()),
("Sentry.io send errors", &self.sentry_send_error.to_string()),
(
"Well-known server name",
self.well_known

View file

@ -1,18 +1,34 @@
#![cfg(feature = "sentry_telemetry")]
use std::{str::FromStr, sync::Arc};
use conduit::{config::Config, trace};
use sentry::{
types::{protocol::v7::Event, Dsn},
Breadcrumb, ClientOptions,
use std::{
str::FromStr,
sync::{Arc, OnceLock},
};
use conduit::{config::Config, debug, trace};
use sentry::{
types::{
protocol::v7::{Context, Event},
Dsn,
},
Breadcrumb, ClientOptions, Level,
};
static SEND_PANIC: OnceLock<bool> = OnceLock::new();
static SEND_ERROR: OnceLock<bool> = OnceLock::new();
pub(crate) fn init(config: &Config) -> Option<sentry::ClientInitGuard> {
config.sentry.then(|| sentry::init(options(config)))
}
fn options(config: &Config) -> ClientOptions {
SEND_PANIC
.set(config.sentry_send_panic)
.expect("SEND_PANIC was not previously set");
SEND_ERROR
.set(config.sentry_send_error)
.expect("SEND_ERROR was not previously set");
let dsn = config
.sentry_endpoint
.as_ref()
@ -36,11 +52,40 @@ fn options(config: &Config) -> ClientOptions {
}
fn before_send(event: Event<'static>) -> Option<Event<'static>> {
trace!("Sending sentry event: {event:?}");
if event.exception.iter().any(|e| e.ty == "panic") && !SEND_PANIC.get().unwrap_or(&true) {
return None;
}
if event.level == Level::Error {
if !SEND_ERROR.get().unwrap_or(&true) {
return None;
}
if cfg!(debug_assertions) {
return None;
}
//NOTE: we can enable this to specify error!(sentry = true, ...)
if let Some(Context::Other(context)) = event.contexts.get("Rust Tracing Fields") {
if !context.contains_key("sentry") {
//return None;
}
}
}
if event.level == Level::Fatal {
trace!("{event:#?}");
}
debug!("Sending sentry event: {event:?}");
Some(event)
}
fn before_breadcrumb(crumb: Breadcrumb) -> Option<Breadcrumb> {
trace!("Adding sentry breadcrumb: {crumb:?}");
if crumb.ty == "log" && crumb.level == Level::Debug {
return None;
}
trace!("Sentry breadcrumb: {crumb:?}");
Some(crumb)
}