From 3eadeaba36b0df2622fcd1a41f8e9da76cd64fcb Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Fri, 9 Oct 2026 16:09:21 +0200 Subject: [PATCH] Upgrade OpenTelemetry to 0.33 and Sentry to 0.49 This bumps the `opentelemetry` crates to 0.33, `opentelemetry-resource-detectors` to 0.13, `tracing-opentelemetry` to 0.34, and `sentry`, `sentry-tower` and `sentry-tracing` to 0.49. The process and Tokio instrumentation crates move to 0.3 and the Prometheus text exporter to 0.4, their releases for OpenTelemetry 0.33. Everything stays on reqwest 0.13, so the shared `mas_http::reqwest_client()` can still be handed to both the OTLP exporters and the Sentry transport. `sentry::ClientOptions` is now non-exhaustive, so it is built with its setters instead of a struct literal. The `experimental_metrics_custom_reader` feature of `opentelemetry_sdk` is now enabled explicitly, as we use `ManualReader` directly instead of relying on the Prometheus exporter enabling it. The OTLP exporters now retry failed exports by default (up to 3 retries with exponential backoff, on HTTP 429, 502, 503 and 504). When the configuration sets no endpoint, an invalid `OTEL_EXPORTER_OTLP_ENDPOINT` or `OTEL_EXPORTER_OTLP_{TRACES,METRICS}_ENDPOINT` environment variable now fails startup instead of falling back to `localhost`. --- Cargo.lock | 99 +++++++++++++++++++++--------------------- Cargo.toml | 29 +++++++------ crates/cli/src/main.rs | 24 +++++----- deny.toml | 4 +- 4 files changed, 80 insertions(+), 76 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1ef2bf461..5270a87d3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1838,7 +1838,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -4314,7 +4314,7 @@ dependencies = [ "sha1 0.11.0", "sha2 0.11.0", "sprintf", - "thiserror 1.0.69", + "thiserror 2.0.18", "tokio", "tracing", "urlencoding", @@ -4336,9 +4336,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "opentelemetry" -version = "0.32.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0142c63252a9e054e68a4c61a5778f7b14f576274d593f8ce883d191a099682" +checksum = "6cdb0b1b267eb9db3331b434ed9ddab10d50e280a9adf9d13e5233e2002b61b5" dependencies = [ "futures-core", "futures-sink", @@ -4350,9 +4350,9 @@ dependencies = [ [[package]] name = "opentelemetry-http" -version = "0.32.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5683015d09e2df236ef005b17f6f196f0d5f6313c4fa43a7b6a53b52776e4331" +checksum = "ee2c3625b8aa04209f7e01e513bc8044da9687fa38a9eacf59628ca5f3b87300" dependencies = [ "async-trait", "bytes", @@ -4363,9 +4363,9 @@ dependencies = [ [[package]] name = "opentelemetry-instrumentation-process" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065d9891eac9d4089f2c61872a43236029496c3642f62706ddbe71e96f6e00be" +checksum = "050a1c8ed107f0e1e384599ace870d68d5bfa3f64839dd59b2e278c615e60ca4" dependencies = [ "opentelemetry", "opentelemetry-semantic-conventions", @@ -4374,9 +4374,9 @@ dependencies = [ [[package]] name = "opentelemetry-instrumentation-tokio" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac2efa77dc2389d53fc00e53074a8117f53b1bd5ab92b0cd8bf7625156dc49f" +checksum = "32707b35a8ea8950e732ac39ca4a9c73690c9d940c8ea51a27ed2a04cf5d3332" dependencies = [ "opentelemetry", "tokio", @@ -4384,11 +4384,12 @@ dependencies = [ [[package]] name = "opentelemetry-otlp" -version = "0.32.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9966929966d17620d7c316c643ba62631826e10021409357772d5eea84f62c35" +checksum = "699a67345e21962a231955b9059a157e428b219fa5df8efe11f08346fb23a344" dependencies = [ "http", + "httpdate", "opentelemetry", "opentelemetry-http", "opentelemetry-proto", @@ -4400,9 +4401,9 @@ dependencies = [ [[package]] name = "opentelemetry-prometheus-text-exporter" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4fe57ea90b12f643a366aa7c4fa5cfb54bd1cf252f55368337e40534b278a68" +checksum = "884d95dfaf00ec1e068b5786ced2ab28f2d264cb3ff2cfd98a7408eed0207e85" dependencies = [ "opentelemetry", "opentelemetry_sdk", @@ -4411,9 +4412,9 @@ dependencies = [ [[package]] name = "opentelemetry-proto" -version = "0.32.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d658ba1faf63f7b9c492cfbe6e0ec365440a16132d3270c1065f7b33f1b638" +checksum = "25da1ac11a0aeccf38d7f77ee0348715adaf8340f65ad46c94a02c6b20e2f65d" dependencies = [ "opentelemetry", "opentelemetry_sdk", @@ -4422,9 +4423,9 @@ dependencies = [ [[package]] name = "opentelemetry-resource-detectors" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ca3c069db41e9a9319dc075cf05aac4841d7c174995270223f1f16ad2eab18" +checksum = "60ac54422fb2a7ed2e0325b5650bedff0b6e777e33dbbac7b49572d92d689a56" dependencies = [ "opentelemetry", "opentelemetry-semantic-conventions", @@ -4433,15 +4434,15 @@ dependencies = [ [[package]] name = "opentelemetry-semantic-conventions" -version = "0.32.1" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c913ac17a6c451661ee255f4625d143e51647ae78ebd969b75e41c4442f4fe47" +checksum = "d288b1e1bc3590052fbb8f0f635ef248dd9022cf1fbaeb6582b7ad6081a17b87" [[package]] name = "opentelemetry-stdout" -version = "0.32.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b1c6a247d79091f0062a5f4bd058589525cf987a8d4c169440d9c1be72f0ad" +checksum = "9f71803f481d3f5ccbe477edb42a78f473613712b2327835911a9ea0ab069824" dependencies = [ "chrono", "opentelemetry", @@ -4450,9 +4451,9 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" -version = "0.32.1" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b59f80e1ac4d5ff7a2db8fb6c80badb7f0f3f858211fba08dd9aaec750894f9" +checksum = "cb39533d9d1c912123efd7d41d7e0c29d16917b60ce15b4c8d87cb1af7f67520" dependencies = [ "futures-channel", "futures-executor", @@ -5434,7 +5435,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5492,7 +5493,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5704,9 +5705,9 @@ dependencies = [ [[package]] name = "sentry" -version = "0.48.5" +version = "0.49.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d631477761f57c76148456e55e80e9a479ff3fa4c65b2b4a0c3acf1167fd4638" +checksum = "9fa951f4e644464ebfd2347a7ab03b0828c512d2448a76262cad2607b343dff4" dependencies = [ "cfg_aliases", "httpdate", @@ -5724,9 +5725,9 @@ dependencies = [ [[package]] name = "sentry-backtrace" -version = "0.48.5" +version = "0.49.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "448b0981fbde6cdc9eb087ba3dc01035a253fef9a0d9e79aaf198fc26acb2e64" +checksum = "f4f27cf048aa63ccd5bc94c29989133eabb82e9c6bf7441b58e9d4a95837a105" dependencies = [ "backtrace", "regex", @@ -5735,9 +5736,9 @@ dependencies = [ [[package]] name = "sentry-contexts" -version = "0.48.5" +version = "0.49.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5e909d02170ba6d1dc5ebd05bef7999280f5d960e3eaee5d1a18d88d41b334" +checksum = "c5ed680585dbdacdf9859c2b4dc53358ff02bd256766882e22e343836db36b22" dependencies = [ "hostname", "libc", @@ -5749,11 +5750,11 @@ dependencies = [ [[package]] name = "sentry-core" -version = "0.48.5" +version = "0.49.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecf0b1a4a4e9ec88395b52e6fa4868b95564c1fa96b26a0606f5f6288a0f7149" +checksum = "c3ed398494bb8fc412a11a182c1883a10ae147587b8f6314abd222d1d626f31b" dependencies = [ - "rand 0.9.4", + "rand 0.10.3", "sentry-types", "serde", "serde_json", @@ -5762,9 +5763,9 @@ dependencies = [ [[package]] name = "sentry-panic" -version = "0.48.5" +version = "0.49.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7d93d6ecb55d2251c5fc084c55c03a2bc68904918d76117e602c999e92f00f" +checksum = "b7153e68642b761ed3aa62c022795c11b2facc728b2db7484084492373c944f9" dependencies = [ "sentry-backtrace", "sentry-core", @@ -5772,9 +5773,9 @@ dependencies = [ [[package]] name = "sentry-tower" -version = "0.48.5" +version = "0.49.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64a8a0a33239c65f95ff719fcb56655f398f4e4e74a01af8daca725cf7c2b5f" +checksum = "624ee2c60caf72fa2cd6be00334b3a3ce0c6df3b1f01941ea62e3d244492d334" dependencies = [ "axum", "http", @@ -5787,9 +5788,9 @@ dependencies = [ [[package]] name = "sentry-tracing" -version = "0.48.5" +version = "0.49.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58d26379236c4ef97eaf081bca3c7bf0ef6f06b3aa881eca2ee8e8dbc923e5b8" +checksum = "e7e7db1aefdf623f4e48e21ec9e4af535024187aeafb2a4cc7e29d035def5a13" dependencies = [ "bitflags", "sentry-backtrace", @@ -5800,13 +5801,13 @@ dependencies = [ [[package]] name = "sentry-types" -version = "0.48.5" +version = "0.49.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2239099d47e76857b0825a182ecdb90159add7aa1097b60247c6e7ca6bf49c6a" +checksum = "1c18bf7b159bdfc7c8f97816f476b4947a1937fb6bea9d38d3479e58631614ac" dependencies = [ "debugid", "hex", - "rand 0.9.4", + "rand 0.10.3", "serde", "serde_json", "thiserror 2.0.18", @@ -6131,7 +6132,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -6555,7 +6556,7 @@ dependencies = [ "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -6970,9 +6971,9 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.33.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adbc64cba7137545b8044cb1fe9814f7aacf3c6b5f9b45be8bb5db538befdb26" +checksum = "0a904802a1b902f43638b677ff2a650847e3b4404101b6c586d648e8c1e3e8fe" dependencies = [ "js-sys", "opentelemetry", @@ -7740,7 +7741,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 819729192..be6c792f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -402,38 +402,39 @@ version = "0.3.3" # OpenTelemetry [workspace.dependencies.opentelemetry] -version = "0.32.0" +version = "0.33.0" features = ["trace", "metrics"] [workspace.dependencies.opentelemetry-http] -version = "0.32.0" +version = "0.33.0" features = ["reqwest"] [workspace.dependencies.opentelemetry-instrumentation-process] -version = "0.2.0" +version = "0.3.0" [workspace.dependencies.opentelemetry-instrumentation-tokio] -version = "0.2.0" +version = "0.3.0" [workspace.dependencies.opentelemetry-otlp] -version = "0.32.0" +version = "0.33.0" default-features = false features = ["trace", "metrics", "http-proto", "tls-provider-agnostic"] [workspace.dependencies.opentelemetry-prometheus-text-exporter] -version = "0.3.0" +version = "0.4.0" [workspace.dependencies.opentelemetry-resource-detectors] -version = "0.12.0" +version = "0.13.0" [workspace.dependencies.opentelemetry-semantic-conventions] -version = "0.32.0" +version = "0.33.0" features = ["semconv_experimental"] [workspace.dependencies.opentelemetry-stdout] -version = "0.32.0" +version = "0.33.0" features = ["trace", "metrics"] [workspace.dependencies.opentelemetry_sdk] -version = "0.32.1" +version = "0.33.0" features = [ "experimental_trace_batch_span_processor_with_async_runtime", "experimental_metrics_periodicreader_with_async_runtime", + "experimental_metrics_custom_reader", "rt-tokio", ] [workspace.dependencies.tracing-opentelemetry] -version = "0.33.0" +version = "0.34.0" default-features = false # P256 elliptic curve @@ -568,18 +569,18 @@ features = [ # Sentry error tracking [workspace.dependencies.sentry] -version = "0.48.2" +version = "0.49.3" default-features = false features = ["backtrace", "contexts", "panic", "tower", "reqwest", "rustls-no-provider"] # Sentry tower layer [workspace.dependencies.sentry-tower] -version = "0.48.2" +version = "0.49.3" features = ["http", "axum-matched-path"] # Sentry tracing integration [workspace.dependencies.sentry-tracing] -version = "0.48.2" +version = "0.49.3" # Serialization and deserialization [workspace.dependencies.serde] diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 2de45e7b0..126958eb3 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -118,17 +118,19 @@ async fn try_main() -> anyhow::Result { .context("Failed to load telemetry config")?; // Setup Sentry - let sentry = sentry::init(( - telemetry_config.sentry.dsn.as_deref(), - sentry::ClientOptions { - transport: Some(Arc::new(SentryTransportFactory::new())), - environment: telemetry_config.sentry.environment.clone().map(Into::into), - release: Some(VERSION.into()), - sample_rate: telemetry_config.sentry.sample_rate.unwrap_or(1.0), - traces_sample_rate: telemetry_config.sentry.traces_sample_rate.unwrap_or(0.0), - ..Default::default() - }, - )); + // The sample rate setters panic outside of [0.0, 1.0], which + // `TelemetryConfig` validation already rules out. A traces sample rate of + // 0.0 still follows the sampling decision of an incoming `sentry-trace` + // header, which leaving it unset would not. + let mut sentry_options = sentry::ClientOptions::new() + .transport(SentryTransportFactory::new()) + .release(VERSION) + .sample_rate(telemetry_config.sentry.sample_rate.unwrap_or(1.0)) + .traces_sample_rate(telemetry_config.sentry.traces_sample_rate.unwrap_or(0.0)); + if let Some(environment) = telemetry_config.sentry.environment.clone() { + sentry_options = sentry_options.environment(environment); + } + let sentry = sentry::init((telemetry_config.sentry.dsn.as_deref(), sentry_options)); let sentry_layer = sentry.is_enabled().then(|| { sentry_tracing::layer().event_filter(|md| { diff --git a/deny.toml b/deny.toml index 624656d76..1a9416953 100644 --- a/deny.toml +++ b/deny.toml @@ -100,8 +100,8 @@ skip = [ { name = "rand_chacha", version = "0.3.1" }, { name = "rand_core", version = "0.6.4" }, { name = "getrandom", version = "0.2.16" }, - # opa-wasm 0.3 is on rand 0.10, opentelemetry_sdk, sentry and ulid are - # still on rand 0.9 + # opa-wasm 0.3 and sentry are on rand 0.10, opentelemetry_sdk and ulid + # are still on rand 0.9 { name = "rand", version = "0.9.4" }, { name = "rand_core", version = "0.9.3" }, { name = "getrandom", version = "0.3.3" },