From 07ce53ccc32bda0db1ebcc565434aeb2e1ab17c8 Mon Sep 17 00:00:00 2001 From: Marten Wijnja Date: Fri, 13 Feb 2026 11:59:34 +0100 Subject: [PATCH] Improve Sentry & tracing attributes - Improve attributes forwarded to Sentry or other Tracing outputs - Use the modern OTel resource detectors to get info about the host and invoked process args --- Cargo.lock | 369 ++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 2 +- opsqueue/Cargo.toml | 3 +- opsqueue/app/main.rs | 23 ++- 4 files changed, 385 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1ff95c6..cf7514a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "ahash" version = "0.8.12" @@ -266,6 +281,21 @@ dependencies = [ "tokio", ] +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + [[package]] name = "base64" version = "0.22.1" @@ -296,6 +326,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + [[package]] name = "bumpalo" version = "3.19.1" @@ -663,6 +702,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags", + "objc2", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -943,6 +992,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + [[package]] name = "gloo-timers" version = "0.3.0" @@ -1059,6 +1114,17 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "hostname" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd" +dependencies = [ + "cfg-if", + "libc", + "windows-link", +] + [[package]] name = "http" version = "1.4.0" @@ -1575,6 +1641,15 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + [[package]] name = "mio" version = "1.1.1" @@ -1614,6 +1689,18 @@ dependencies = [ "pin-project", ] +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -1675,6 +1762,174 @@ dependencies = [ "libm", ] +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "object_store" version = "0.13.1" @@ -1794,6 +2049,17 @@ dependencies = [ "tonic-prost", ] +[[package]] +name = "opentelemetry-resource-detectors" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e82845106cf72d47c141cee7f0d95e0650d8f28c6222a1f1ae727a8883899c19" +dependencies = [ + "opentelemetry", + "opentelemetry-semantic-conventions", + "opentelemetry_sdk", +] + [[package]] name = "opentelemetry-semantic-conventions" version = "0.31.0" @@ -1819,7 +2085,7 @@ dependencies = [ [[package]] name = "opsqueue" -version = "0.33.0" +version = "0.33.1" dependencies = [ "anyhow", "arc-swap", @@ -1845,6 +2111,7 @@ dependencies = [ "opentelemetry", "opentelemetry-http", "opentelemetry-otlp", + "opentelemetry-resource-detectors", "opentelemetry-semantic-conventions", "opentelemetry_sdk", "rand 0.9.2", @@ -1872,7 +2139,7 @@ dependencies = [ [[package]] name = "opsqueue_python" -version = "0.33.0" +version = "0.33.1" dependencies = [ "anyhow", "chrono", @@ -1889,6 +2156,22 @@ dependencies = [ "ux", ] +[[package]] +name = "os_info" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4022a17595a00d6a369236fdae483f0de7f0a339960a53118b818238e132224" +dependencies = [ + "android_system_properties", + "log", + "nix", + "objc2", + "objc2-foundation", + "objc2-ui-kit", + "serde", + "windows-sys 0.61.2", +] + [[package]] name = "page_size" version = "0.6.0" @@ -2529,12 +2812,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + [[package]] name = "rustc-hash" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "1.1.3" @@ -2661,6 +2959,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + [[package]] name = "sentry" version = "0.46.1" @@ -2670,11 +2974,52 @@ dependencies = [ "httpdate", "reqwest 0.12.28", "rustls", + "sentry-anyhow", + "sentry-backtrace", + "sentry-contexts", "sentry-core", + "sentry-panic", + "sentry-tracing", "tokio", "ureq", ] +[[package]] +name = "sentry-anyhow" +version = "0.46.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e45993dc8981e7fb5d9b7f701f65ca5c9fb0390263e47f612f30bea3d35fac" +dependencies = [ + "anyhow", + "sentry-backtrace", + "sentry-core", +] + +[[package]] +name = "sentry-backtrace" +version = "0.46.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb1ef7534f583af20452b1b1bf610a60ed9c8dd2d8485e7bd064efc556a78fb" +dependencies = [ + "backtrace", + "regex", + "sentry-core", +] + +[[package]] +name = "sentry-contexts" +version = "0.46.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd6be899d9938390b6d1ec71e2f53bd9e57b6a9d8b1d5b049e5c364e7da9078" +dependencies = [ + "hostname", + "libc", + "os_info", + "rustc_version", + "sentry-core", + "uname", +] + [[package]] name = "sentry-core" version = "0.46.1" @@ -2688,6 +3033,16 @@ dependencies = [ "url", ] +[[package]] +name = "sentry-panic" +version = "0.46.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f02c7162f7b69b8de872b439d4696dc1d65f80b13ddd3c3831723def4756b63" +dependencies = [ + "sentry-backtrace", + "sentry-core", +] + [[package]] name = "sentry-tracing" version = "0.46.1" @@ -2695,6 +3050,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1dd47df349a80025819f3d25c3d2f751df705d49c65a4cdc0f130f700972a48" dependencies = [ "bitflags", + "sentry-backtrace", "sentry-core", "tracing-core", "tracing-subscriber", @@ -3576,6 +3932,15 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +[[package]] +name = "uname" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b72f89f0ca32e4db1c04e2a72f5345d59796d4866a1ee0609084569f73683dc8" +dependencies = [ + "libc", +] + [[package]] name = "unicode-bidi" version = "0.3.18" diff --git a/Cargo.toml b/Cargo.toml index 4f16a23..c161678 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ members = [ ] [workspace.package] -version = "0.33.0" +version = "0.33.1" [workspace.lints.clippy] diff --git a/opsqueue/Cargo.toml b/opsqueue/Cargo.toml index ebeca36..dd23ab1 100644 --- a/opsqueue/Cargo.toml +++ b/opsqueue/Cargo.toml @@ -51,11 +51,12 @@ tower-http = { version = "0.6.8", features = ["trace", "catch-panic"], optional # Logging and tracing: tracing = {version = "0.1", features = ["log"] } tracing-subscriber = {version = "0.3", features = ["std", "env-filter"] } -sentry = {version = "0.46", optional = true, default-features=false, features=["rustls", "reqwest"]} +sentry = {version = "0.46", optional = true, default-features=false, features=["rustls", "reqwest", "anyhow", "backtrace", "contexts", "tracing", "panic"]} sentry-tracing = {version = "0.46", optional = true} # Exporting traces to Opentelemetry: opentelemetry = { version = "0.31", default-features = false, features = ["trace"] } opentelemetry_sdk = { version = "0.31", default-features = false, features = ["trace", "rt-tokio"] } +opentelemetry-resource-detectors = "0.10.0" opentelemetry-http = { version = "0.31" } opentelemetry-otlp = { version = "0.31", optional = true, features = ["grpc-tonic"] } tracing-opentelemetry = {version = "0.32.1" } diff --git a/opsqueue/app/main.rs b/opsqueue/app/main.rs index 6092a32..641c813 100644 --- a/opsqueue/app/main.rs +++ b/opsqueue/app/main.rs @@ -1,6 +1,8 @@ use clap::Parser; use opentelemetry::trace::TracerProvider; use opentelemetry_otlp::SpanExporter; +use opentelemetry_resource_detectors::HostResourceDetector; +use opentelemetry_resource_detectors::{OsResourceDetector, ProcessResourceDetector}; use opentelemetry_sdk::trace::{RandomIdGenerator, Sampler, SdkTracerProvider}; use opsqueue::{common::submission::db::periodically_cleanup_old, config::Config, prometheus}; use std::{ @@ -23,11 +25,11 @@ fn main() { #[tokio::main] pub async fn async_main() { + let config = Box::leak(Box::new(Config::parse())); + let _tracing_guard = setup_tracing(); tracing::info!("Finished setting up tracing subscriber"); - let config = Box::leak(Box::new(Config::parse())); - let server_addr = Box::from(format!("0.0.0.0:{}", config.port)); let app_healthy_flag = Arc::new(AtomicBool::new(false)); @@ -106,6 +108,8 @@ fn init_sentry() -> sentry::ClientInitGuard { let options = sentry::ClientOptions { // We want to send traces to whatever is configured for OpenTelemetry, *not* sentry: traces_sample_rate: 0.0, + send_default_pii: true, + release: sentry::release_name!(), ..Default::default() }; sentry::init(options) @@ -178,22 +182,25 @@ fn otel_tracer_provider() -> SdkTracerProvider { .with_batch_exporter(exporter) .with_sampler(sampler) .with_id_generator(RandomIdGenerator::default()) - .with_resource(opentelemetry_resource()) + .with_resource(otel_resource()) .build(); opentelemetry::global::set_tracer_provider(provider.clone()); provider } -fn opentelemetry_resource() -> opentelemetry_sdk::Resource { - use opentelemetry_semantic_conventions::attribute::{ - DEPLOYMENT_ENVIRONMENT_NAME, SERVICE_NAME, SERVICE_VERSION, - }; + +fn otel_resource() -> opentelemetry_sdk::Resource { + use opentelemetry_semantic_conventions::attribute::{SERVICE_NAME, SERVICE_VERSION}; opentelemetry_sdk::Resource::builder() + .with_detectors(&[ + Box::new(OsResourceDetector), + Box::new(ProcessResourceDetector), + Box::new(HostResourceDetector::default()), + ]) .with_attributes([ opentelemetry::KeyValue::new(SERVICE_NAME, env!("CARGO_PKG_NAME")), opentelemetry::KeyValue::new(SERVICE_VERSION, env!("CARGO_PKG_VERSION")), - opentelemetry::KeyValue::new(DEPLOYMENT_ENVIRONMENT_NAME, "develop"), ]) .build() }