From c4d25790a4a1e400bb927ecc724ae042c0ff850f Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Sat, 21 Jun 2025 13:05:57 +0300 Subject: [PATCH] feat: add telemetry --- Cargo.lock | 191 +++++++++++++++++++++++++++++++++++++--- Cargo.toml | 2 +- server/Cargo.toml | 6 +- server/src/fileserv.rs | 2 +- server/src/main.rs | 9 +- server/src/telemetry.rs | 37 ++++++++ 6 files changed, 226 insertions(+), 21 deletions(-) create mode 100644 server/src/telemetry.rs diff --git a/Cargo.lock b/Cargo.lock index a265df4..71caf62 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,19 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.3", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -1390,6 +1403,15 @@ dependencies = [ "quote", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matchit" version = "0.8.4" @@ -1461,6 +1483,16 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60993920e071b0c9b66f14e2b32740a4e27ffc82854dcd72035887f336a09a28" +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -1526,6 +1558,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c04f5d74368e4d0dfe06c45c8627c81bd7c317d52762d118fb9b3076f6420fd" +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking" version = "2.2.1" @@ -1865,8 +1903,17 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -1877,9 +1924,15 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.5", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.5" @@ -2051,6 +2104,10 @@ dependencies = [ "tokio", "tower", "tower-http", + "tracing", + "tracing-bunyan-formatter", + "tracing-log 0.2.0", + "tracing-subscriber", ] [[package]] @@ -2130,21 +2187,21 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signal-hook-registry" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" -dependencies = [ - "libc", -] - [[package]] name = "simple_logger" version = "5.0.0" @@ -2315,6 +2372,15 @@ dependencies = [ "syn", ] +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + [[package]] name = "throw_error" version = "0.3.0" @@ -2377,11 +2443,10 @@ dependencies = [ "bytes", "libc", "mio", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "socket2", "tokio-macros", + "tracing", "windows-sys 0.52.0", ] @@ -2526,9 +2591,38 @@ checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-bunyan-formatter" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d637245a0d8774bd48df6482e086c59a8b5348a910c3b0579354045a9d82411" +dependencies = [ + "ahash", + "log", + "serde", + "serde_json", + "time", + "tracing", + "tracing-core", + "tracing-log 0.1.4", + "tracing-subscriber", +] + [[package]] name = "tracing-core" version = "0.1.34" @@ -2536,6 +2630,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log 0.2.0", ] [[package]] @@ -2645,6 +2780,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "version_check" version = "0.9.5" @@ -2770,6 +2911,22 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + [[package]] name = "winapi-util" version = "0.1.9" @@ -2779,6 +2936,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/Cargo.toml b/Cargo.toml index bbc21f3..aa3a8e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ http = "1.3.1" log = "0.4.27" simple_logger = "5.0.0" thiserror = "2.0.12" -tokio = { version = "1.45.0", features = ["full"] } +tokio = { version = "1.45", features = ["rt", "macros", "rt-multi-thread"] } tower = { version = "0.5.2", features = ["full"] } tower-http = { version = "0.6.4", features = ["full"] } wasm-bindgen = "=0.2.100" diff --git a/server/Cargo.toml b/server/Cargo.toml index c5129be..09349f5 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -12,7 +12,11 @@ leptos_axum.workspace = true axum.workspace = true simple_logger.workspace = true -tokio.workspace = true +tokio = { workspace = true, features = ["tracing"] } tower.workspace = true tower-http.workspace = true log.workspace = true +tracing-bunyan-formatter = { version = "0.3", default-features = false } +tracing = { version = "0.1", features = ["log"] } +tracing-log = "0.2.0" +tracing-subscriber = { version = "0.3", features = ["registry", "env-filter"] } diff --git a/server/src/fileserv.rs b/server/src/fileserv.rs index d4343ce..e2020c2 100644 --- a/server/src/fileserv.rs +++ b/server/src/fileserv.rs @@ -22,7 +22,7 @@ pub async fn file_and_error_handler( res.into_response() } else { let handler = - leptos_axum::render_app_to_stream(options.to_owned(), move || view! { }); + leptos_axum::render_app_to_stream(options.to_owned(), move || view! { }); handler(req).await.into_response() } } diff --git a/server/src/main.rs b/server/src/main.rs index af5edaf..86867b7 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,12 +1,13 @@ -use axum::Router; -use leptos::prelude::*; -use leptos_axum::{generate_route_list, LeptosRoutes}; +mod telemetry; + use app::*; +use axum::Router; use leptos::logging::log; +use leptos::prelude::*; +use leptos_axum::{LeptosRoutes, generate_route_list}; #[tokio::main] async fn main() { - let conf = get_configuration(None).unwrap(); let addr = conf.leptos_options.site_addr; let leptos_options = conf.leptos_options; diff --git a/server/src/telemetry.rs b/server/src/telemetry.rs new file mode 100644 index 0000000..30e1a68 --- /dev/null +++ b/server/src/telemetry.rs @@ -0,0 +1,37 @@ +use tracing::{Subscriber, subscriber::set_global_default}; +use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer}; +use tracing_log::LogTracer; +use tracing_subscriber::{EnvFilter, Registry, fmt::MakeWriter, layer::SubscriberExt}; + +/// Creates a `tracing` subscriber with Bunyan-style JSON formatting. +/// +/// - `name`: The name of the application (used in logs). +/// - `env_filter`: The log level filter (e.g., "info", "debug"). +/// - `sink`: The log sink (e.g., stdout, file). +/// +/// Returns a `Subscriber` that can be used for structured logging. +pub fn get_subscriber( + name: Name, + env_filter: Filter, + sink: Sink, +) -> impl Subscriber + Send + Sync +where + Sink: for<'a> MakeWriter<'a> + Send + Sync + 'static, + Name: AsRef, + Filter: AsRef, +{ + let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| env_filter.into()); + let formatting_layer = BunyanFormattingLayer::new(name.as_ref().to_string(), sink); + Registry::default() + .with(env_filter) + .with(JsonStorageLayer) + .with(formatting_layer) +} + +/// Initializes the global tracing subscriber. +/// +/// - `subscriber`: The subscriber to set as the global default. +pub fn init_subscriber(subscriber: impl Subscriber + Send + Sync) { + LogTracer::init().expect("Failed to set logger"); + set_global_default(subscriber).expect("Failed to set subscriber."); +}