sentry 0.3.0-beta

Sentry (getsentry.com) client for rust ;)
Documentation

This crate provides support for logging events and errors / panics to the Sentry error logging service. It integrates with the standard panic system in Rust as well as a few popular error handling setups.

Quickstart

To use the crate you need to create a client first. When a client is created it's typically bound to the current thread by calling bind_client. By default this happens by using the sentry::init convenience function. When the client is bound to the main thread it also becomes the default client for future threads created but it is always possible to override the client for a thread later by explicitly binding it.

The sentry::init function returns a guard that when dropped will flush Events that were not yet sent to the sentry service. It has a two second deadline for this so shutdown of applications might slightly delay as a result of this.

extern crate sentry;

fn main() {
    let _guard = sentry::init("https://key@sentry.io/42");
    sentry::capture_message("Hello World!", sentry::Level::Info);
    // when the guard goes out of scope here, the client will wait up to two
    // seconds to send remaining events to the service.
}

Integrations

What makes this crate useful are the various integrations that exist. Some of them are enabled by default, some uncommon ones or for deprecated parts of the ecosystem a feature flag needs to be enabled.

Panic Handler

Feature: always available

A panic handler can be installed that will automatically dispatch all errors to Sentry that are caused by a panic:

use sentry::integrations::panic::register_panic_handler;
register_panic_handler();

Failure

Feature: enabled by default (with_failure)

Failure errors and Fail objects can be logged with the failure integration. This works really well if you use the failure::Error type or if you have failure::Fail objects that use the failure context internally to gain a backtrace.

Example usage:

# extern crate sentry;
# extern crate failure;
# fn function_that_might_fail() -> Result<(), failure::Error> { Ok(()) }
use sentry::integrations::failure::capture_error;
# fn test() -> Result<(), failure::Error> {
let result = match function_that_might_fail() {
    Ok(result) => result,
    Err(err) => {
        capture_error(&err);
        return Err(err);
    }
};
# Ok(()) }
# fn main() { test().unwrap() }

To capture fails and not errors use capture_fail.

Log

Feature: enabled by default (with_log)

The log crate is supported in two ways. First events can be captured as breadcrumbs for later, secondly error events can be logged as events to Sentry. By default anything above Info is recorded as breadcrumb and anything above Error is captured as error event.

However due to how log systems in Rust work this currently requires you to slightly change your log setup. This is an example with the pretty env logger crate:

# extern crate sentry;
# extern crate pretty_env_logger;
let mut log_builder = pretty_env_logger::formatted_builder().unwrap();
log_builder.parse("info");  // or env::var("RUST_LOG")
sentry::integrations::log::init(Some(
    Box::new(log_builder.build())), Default::default());