1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
use std::any::{type_name, Any};
use crate::protocol::Event;
use crate::ClientOptions;
/// Integration abstraction.
///
/// An Integration in sentry has two primary purposes.
/// It can act as an *Event Source*, which will capture new events;
/// or as an *Event Processor*, which can modify every `Event` flowing through
/// the pipeline.
///
/// # Examples
///
/// ```
/// use sentry::protocol::{Event, Level};
/// use sentry::ClientOptions;
///
/// struct MyProcessorIntegration {
/// override_environment: &'static str,
/// override_level: Level,
/// }
///
/// impl sentry::Integration for MyProcessorIntegration {
/// fn setup(&self, options: &mut ClientOptions) {
/// options.environment = Some(self.override_environment.into());
/// }
/// fn process_event(
/// &self,
/// mut event: Event<'static>,
/// _options: &ClientOptions,
/// ) -> Option<Event<'static>> {
/// event.level = self.override_level;
/// Some(event)
/// }
/// }
///
/// let options = ClientOptions::new().add_integration(MyProcessorIntegration {
/// override_environment: "my_env",
/// override_level: Level::Error,
/// });
///
/// let events = sentry::test::with_captured_events_options(
/// || {
/// sentry::capture_message("some message", Level::Info);
/// },
/// options,
/// );
/// let captured_event = events.into_iter().next().unwrap();
///
/// assert_eq!(captured_event.level, Level::Error);
/// assert_eq!(captured_event.environment, Some("my_env".into()));
/// ```
// NOTE: we need `Any` here so that the `TypeId` machinery works correctly.
pub trait Integration: Sync + Send + Any + AsAny {
/// Name of this integration.
///
/// This will be added to the SDK information sent to sentry.
fn name(&self) -> &'static str {
type_name::<Self>()
}
/// Called whenever the integration is attached to a Client.
fn setup(&self, options: &mut ClientOptions) {
let _ = options;
}
/// The Integrations Event Processor Hook.
///
/// An integration can process, or even completely drop an `Event`.
/// Examples include adding or processing a backtrace, obfuscate some
/// personal information, or add additional information.
fn process_event(
&self,
event: Event<'static>,
options: &ClientOptions,
) -> Option<Event<'static>> {
let _ = options;
Some(event)
}
}
// This is needed as a workaround to be able to safely downcast integrations
#[doc(hidden)]
pub trait AsAny {
fn as_any(&self) -> &dyn Any;
}
impl<T: Any> AsAny for T {
fn as_any(&self) -> &dyn Any {
self
}
}