diff --git a/Cargo.lock b/Cargo.lock index c78d7b5..2e4caf7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1135,6 +1135,12 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "libc" version = "0.2.155" @@ -1200,6 +1206,15 @@ dependencies = [ "tendril", ] +[[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 = "memchr" version = "2.7.4" @@ -1225,6 +1240,8 @@ dependencies = [ "serde_json", "strum", "tokio", + "tracing", + "tracing-subscriber", ] [[package]] @@ -1289,6 +1306,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" +[[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" @@ -1373,6 +1400,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking_lot" version = "0.12.3" @@ -1639,8 +1672,17 @@ checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", +] + +[[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]] @@ -1651,7 +1693,7 @@ checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.4", ] [[package]] @@ -1660,6 +1702,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" +[[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.4" @@ -1946,6 +1994,15 @@ 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 = "signal-hook-registry" version = "1.4.2" @@ -2133,6 +2190,16 @@ dependencies = [ "utf-8", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "time" version = "0.3.36" @@ -2278,9 +2345,21 @@ checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "tracing-core" version = "0.1.32" @@ -2288,6 +2367,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", + "valuable", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", ] [[package]] @@ -2358,6 +2467,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/Cargo.toml b/Cargo.toml index 32dd67e..fb9ca13 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,3 +20,5 @@ serde = { version = "1.0.203", features = ["derive"] } serde_json = "1.0.120" strum = { version = "0.26.3", features = ["derive"] } tokio = { version = "1.38.0", features = ["full"] } +tracing = "0.1.40" +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } diff --git a/src/cache.rs b/src/cache.rs index 4af910d..635b0aa 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -4,6 +4,7 @@ use chrono::{NaiveDate, Utc}; use futures::StreamExt; use itertools::Itertools; use tokio::sync::RwLock; +use tracing::{debug, instrument}; use crate::{Canteen, Menu}; @@ -21,6 +22,7 @@ impl MenuCache { .await } + #[instrument(skip(self))] pub async fn get(&self, canteen: Canteen, date: NaiveDate) -> Option { let query = (date, canteen); let (is_in_cache, is_cache_too_large) = { @@ -34,6 +36,8 @@ impl MenuCache { let cache = self.cache.read().await; Some(cache.get(&query)?.clone()) } else { + debug!("Not in cache, fetching from network"); + let menu = Menu::new(date, canteen).await.ok()?; self.cache.write().await.insert(query, menu.clone()); diff --git a/src/main.rs b/src/main.rs index 5ad9c38..5f5d437 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,12 +9,21 @@ use mensa_upb_api::{Canteen, MenuCache}; use serde::{Deserialize, Serialize}; use serde_json::json; use strum::IntoEnumIterator; +use tracing::{debug, error, info, level_filters::LevelFilter}; +use tracing_subscriber::EnvFilter; -#[actix_web::main] +#[tokio::main] async fn main() -> io::Result<()> { + let env_filter = EnvFilter::builder() + .with_default_directive(LevelFilter::WARN.into()) + .from_env() + .expect("Invalid filter") + .add_directive("mensa_upb_api=debug".parse().unwrap()); + tracing_subscriber::fmt().with_env_filter(env_filter).init(); + match dotenvy::dotenv() { - Ok(_) => println!("Loaded .env file"), - Err(dotenvy::Error::LineParse(..)) => eprintln!("Malformed .env file"), + Ok(_) => debug!("Loaded .env file"), + Err(dotenvy::Error::LineParse(..)) => error!("Malformed .env file"), Err(_) => {} } @@ -49,7 +58,7 @@ async fn main() -> io::Result<()> { let menu_cache = MenuCache::default(); - println!("Starting server on {}:{}", interface, port); + info!("Starting server on {}:{}", interface, port); HttpServer::new(move || { let cors = allowed_cors