diff --git a/docs/platforms/rust/guides/tracing/config.yml b/docs/platforms/rust/guides/tracing/config.yml new file mode 100644 index 0000000000000..3b078316ccf90 --- /dev/null +++ b/docs/platforms/rust/guides/tracing/config.yml @@ -0,0 +1 @@ +title: tracing \ No newline at end of file diff --git a/docs/platforms/rust/guides/tracing/index.mdx b/docs/platforms/rust/guides/tracing/index.mdx new file mode 100644 index 0000000000000..a451fec007b97 --- /dev/null +++ b/docs/platforms/rust/guides/tracing/index.mdx @@ -0,0 +1,120 @@ +--- +title: tracing +description: "Learn about monitoring your Rust application with Sentry's tracing integration." +--- + +The Sentry SDK offers an integration for tokio's [tracing](https://github.com/tokio-rs/tracing) ecosystem that supports: + +- Reporting `tracing` events to Sentry as events, breadcrumbs, or logs. +- Reporting `tracing` spans to Sentry. +- Reporting errors and panics with the correct trace correlation. + +## Install + + + +To add Sentry with the `tracing` integration to your Rust project, add the necessary dependencies to your `Cargo.toml`: + +```toml {filename:Cargo.toml} +[dependencies] +tracing = "0.1.41" +tracing-subscriber = "0.3.19" +sentry = { version = "{{@inject packages.version('sentry.rust') }}", features = [ + "tracing", + # ___PRODUCT_OPTION_START___ logs + "logs", + # ___PRODUCT_OPTION_END___ logs +] } +tokio = { version = "1.45.0", features = ["full"] } +``` + +## Configure + +Initialize the Sentry SDK and register the Sentry layer to start sending `tracing` events and spans to Sentry: + + + +Macros like `#[tokio::main]` and `#[actix_web::main]` are not supported. The Sentry client must be initialized before the async runtime is started, as shown below. + + + +```rust +use tracing_subscriber::prelude::*; + +fn main() { + // Initialize Sentry + let _guard = sentry::init(( + "___PUBLIC_DSN___", + sentry::ClientOptions { + release: sentry::release_name!(), + # ___PRODUCT_OPTION_START___ performance + // Capture all traces and spans. Set to a lower value in production + traces_sample_rate: 1.0, + # ___PRODUCT_OPTION_END___ performance + # ___PRODUCT_OPTION_START___ logs + enable_logs:true + # ___PRODUCT_OPTION_END___ logs + ..sentry::ClientOptions::default() + }, + }); + + // Register the Sentry tracing layer + tracing_subscriber::registry() + .with(tracing_subscriber::fmt::layer()) + .with(sentry::integrations::tracing::layer()) + .init(); + + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build()? + .block_on(async { + // Futures should to be bound to a Hub + // Learn more at https://docs.rs/sentry-core/latest/sentry_core/#parallelism-concurrency-and-async + fail().bind_hub(sentry::Hub::current()).await; + }); +} + +# ___PRODUCT_OPTION_START___ performance +#[tracing::instrument] // Captures a root span (transaction) around this function execution +# ___PRODUCT_OPTION_END___ performance +async fn fail() { + tracing::debug!("Doing work"); // Adds a breadrcumb + # ___PRODUCT_OPTION_START___ performance + let _span = tracing::info_span("Child span").entered(); // Captures a child span + # ___PRODUCT_OPTION_END___ performance + tracing::error!("Everything is on fire!"); +} +``` + +By default, error level events are captured as Sentry events, while anything at or above info is added as a breadcrumb. + +{/* ___PRODUCT_OPTION_START___ logs */} + +To capture structured logs for `tracing` events instead, you need to set up the Sentry layer with a custom event filter that maps to logs, like so: + +```rust +use sentry::integrations::tracing::EventFilter; + +sentry::integrations::tracing::layer().event_filter(|md| match *md.level() { + // Capture error level events as Sentry events + tracing::Level::ERROR => EventFilter::Event, + // Ignore trace level events, as they're too verbose + tracing::Level::TRACE => EventFilter::Ignore, + // Capture everything else as a structured log + _ => EventFilter::Log, +}); +``` + +{/* ___PRODUCT_OPTION_END___ logs */} + +## Verify + + + +Learn more about manually capturing an error or message in our Usage documentation. + + + +To view and resolve the recorded error, log into [sentry.io](https://sentry.io) and select your project. Select Issues, and then Errors & Outages in the sidebar, where you will find the newly created issue. Clicking on the issue's title will open a page where you can see detailed information and mark it as resolved. \ No newline at end of file diff --git a/src/components/platformIcon.tsx b/src/components/platformIcon.tsx index b1c6516596c34..9a24de4198877 100644 --- a/src/components/platformIcon.tsx +++ b/src/components/platformIcon.tsx @@ -131,6 +131,7 @@ import SymfonySVG from 'platformicons/svg/symfony.svg'; import TanstackSVG from 'platformicons/svg/tanstack.svg'; import TokioSVG from 'platformicons/svg/tokio.svg'; import TornadoSVG from 'platformicons/svg/tornado.svg'; +import TracingSVG from 'platformicons/svg/tracing.svg'; import TrytonSVG from 'platformicons/svg/tryton.svg'; import UnitySVG from 'platformicons/svg/unity.svg'; import UnoSVG from 'platformicons/svg/uno.svg'; @@ -275,6 +276,7 @@ import SymfonySVGLarge from 'platformicons/svg_80x80/symfony.svg'; import TanstackSVGLarge from 'platformicons/svg_80x80/tanstack.svg'; import TokioSVGLarge from 'platformicons/svg_80x80/tokio.svg'; import TornadoSVGLarge from 'platformicons/svg_80x80/tornado.svg'; +import TracingSVGLarge from 'platformicons/svg_80x80/tracing.svg'; import TrytonSVGLarge from 'platformicons/svg_80x80/tryton.svg'; import UnitySVGLarge from 'platformicons/svg_80x80/unity.svg'; import UnoSVGLarge from 'platformicons/svg_80x80/uno.svg'; @@ -825,6 +827,10 @@ const formatToSVG = { sm: TornadoSVG, lg: TornadoSVGLarge, }, + tracing: { + sm: TracingSVG, + lg: TracingSVGLarge, + }, tryton: { sm: TrytonSVG, lg: TrytonSVGLarge, @@ -1039,6 +1045,7 @@ export const PLATFORM_TO_ICON = { 'ruby-sinatra': 'sinatra', rust: 'rust', 'rust-actix-web': 'actix', + 'rust-tracing': 'tracing', 'rust-axum': 'axum', scala: 'scala', stride3d: 'stride3d',