add configuration for sentry to send panics and errors
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
bc58e5002d
commit
d88ab37120
3 changed files with 66 additions and 8 deletions
|
@ -60,6 +60,13 @@
|
||||||
# Whether to attach a stacktrace to Sentry reports.
|
# Whether to attach a stacktrace to Sentry reports.
|
||||||
#sentry_attach_stacktrace = false
|
#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
|
### Database configuration
|
||||||
|
|
||||||
|
|
|
@ -358,6 +358,10 @@ pub struct Config {
|
||||||
pub sentry_traces_sample_rate: f32,
|
pub sentry_traces_sample_rate: f32,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub sentry_attach_stacktrace: bool,
|
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)]
|
#[serde(default)]
|
||||||
pub tokio_console: bool,
|
pub tokio_console: bool,
|
||||||
|
@ -822,6 +826,8 @@ impl fmt::Display for Config {
|
||||||
#[cfg(feature = "sentry_telemetry")]
|
#[cfg(feature = "sentry_telemetry")]
|
||||||
("Sentry.io tracing sample rate", &self.sentry_traces_sample_rate.to_string()),
|
("Sentry.io tracing sample rate", &self.sentry_traces_sample_rate.to_string()),
|
||||||
("Sentry.io attach stacktrace", &self.sentry_attach_stacktrace.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",
|
"Well-known server name",
|
||||||
self.well_known
|
self.well_known
|
||||||
|
|
|
@ -1,18 +1,34 @@
|
||||||
#![cfg(feature = "sentry_telemetry")]
|
#![cfg(feature = "sentry_telemetry")]
|
||||||
|
|
||||||
use std::{str::FromStr, sync::Arc};
|
use std::{
|
||||||
|
str::FromStr,
|
||||||
use conduit::{config::Config, trace};
|
sync::{Arc, OnceLock},
|
||||||
use sentry::{
|
|
||||||
types::{protocol::v7::Event, Dsn},
|
|
||||||
Breadcrumb, ClientOptions,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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> {
|
pub(crate) fn init(config: &Config) -> Option<sentry::ClientInitGuard> {
|
||||||
config.sentry.then(|| sentry::init(options(config)))
|
config.sentry.then(|| sentry::init(options(config)))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn options(config: &Config) -> ClientOptions {
|
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
|
let dsn = config
|
||||||
.sentry_endpoint
|
.sentry_endpoint
|
||||||
.as_ref()
|
.as_ref()
|
||||||
|
@ -36,11 +52,40 @@ fn options(config: &Config) -> ClientOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn before_send(event: Event<'static>) -> Option<Event<'static>> {
|
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)
|
Some(event)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn before_breadcrumb(crumb: Breadcrumb) -> Option<Breadcrumb> {
|
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)
|
Some(crumb)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue