diff --git a/Cargo.lock b/Cargo.lock index a65165d..f11a600 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,6 +29,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.21" @@ -91,6 +100,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + [[package]] name = "base64" version = "0.22.1" @@ -103,6 +118,12 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + [[package]] name = "bytes" version = "1.11.0" @@ -125,6 +146,19 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "chrono" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "chunked_transfer" version = "1.5.0" @@ -177,6 +211,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "crc32fast" version = "1.5.0" @@ -327,6 +367,30 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "2.1.1" @@ -460,6 +524,16 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +[[package]] +name = "js-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "libc" version = "0.2.180" @@ -516,6 +590,15 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -756,6 +839,12 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "serde" version = "1.0.228" @@ -917,6 +1006,7 @@ dependencies = [ name = "towerops-agent" version = "0.1.0" dependencies = [ + "chrono", "clap", "log", "prost", @@ -1012,6 +1102,51 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +dependencies = [ + "unicode-ident", +] + [[package]] name = "webpki-roots" version = "0.26.11" @@ -1030,12 +1165,65 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/Cargo.toml b/Cargo.toml index 8df4e5e..5b8a601 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ clap = { version = "4.0", features = ["derive", "env"] } prost = "0.13" prost-types = "0.13" tiny_http = "0.12" +chrono = "0.4" [build-dependencies] prost-build = "0.13" diff --git a/src/main.rs b/src/main.rs index b703099..a432ad6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,12 +8,13 @@ mod proto; mod snmp; mod version; +use chrono::Local; use clap::Parser; use log::{info, LevelFilter, Metadata, Record}; use poller::Scheduler; use std::env; -/// Minimal logger that writes to stderr +/// Minimal logger that writes to stderr with timestamps struct SimpleLogger { level: LevelFilter, } @@ -25,7 +26,8 @@ impl log::Log for SimpleLogger { fn log(&self, record: &Record) { if self.enabled(record.metadata()) { - eprintln!("[{}] {}", record.level(), record.args()); + let timestamp = Local::now().format("%Y-%m-%d %H:%M:%S%.3f"); + eprintln!("[{}] [{}] {}", timestamp, record.level(), record.args()); } } diff --git a/src/poller/executor.rs b/src/poller/executor.rs index 6d8f910..1f8c906 100644 --- a/src/poller/executor.rs +++ b/src/poller/executor.rs @@ -68,16 +68,16 @@ impl Executor { equipment.name ); + // Pre-extract SNMP credentials to avoid repeated field access in loop + let ip = &equipment.ip_address; + let community = &equipment.snmp.community; + let version = &equipment.snmp.version; + let port = equipment.snmp.port; + for sensor in &equipment.sensors { match self .snmp_client - .get( - &equipment.ip_address, - &equipment.snmp.community, - &equipment.snmp.version, - equipment.snmp.port, - &sensor.oid, - ) + .get(ip, community, version, port, &sensor.oid) .await { Ok(value) => { @@ -138,6 +138,12 @@ impl Executor { equipment.name ); + // Pre-extract SNMP credentials to avoid repeated field access in loop + let ip = &equipment.ip_address; + let community = &equipment.snmp.community; + let version = &equipment.snmp.version; + let port = equipment.snmp.port; + for interface in &equipment.interfaces { // OIDs for interface statistics (from IF-MIB) let if_in_octets_oid = format!("1.3.6.1.2.1.2.2.1.10.{}", interface.if_index); @@ -156,48 +162,12 @@ impl Executor { in_discards_result, out_discards_result, ) = tokio::join!( - self.get_counter( - &equipment.ip_address, - &equipment.snmp.community, - &equipment.snmp.version, - equipment.snmp.port, - &if_in_octets_oid - ), - self.get_counter( - &equipment.ip_address, - &equipment.snmp.community, - &equipment.snmp.version, - equipment.snmp.port, - &if_out_octets_oid - ), - self.get_counter( - &equipment.ip_address, - &equipment.snmp.community, - &equipment.snmp.version, - equipment.snmp.port, - &if_in_errors_oid - ), - self.get_counter( - &equipment.ip_address, - &equipment.snmp.community, - &equipment.snmp.version, - equipment.snmp.port, - &if_out_errors_oid - ), - self.get_counter( - &equipment.ip_address, - &equipment.snmp.community, - &equipment.snmp.version, - equipment.snmp.port, - &if_in_discards_oid - ), - self.get_counter( - &equipment.ip_address, - &equipment.snmp.community, - &equipment.snmp.version, - equipment.snmp.port, - &if_out_discards_oid - ), + self.get_counter(ip, community, version, port, &if_in_octets_oid), + self.get_counter(ip, community, version, port, &if_out_octets_oid), + self.get_counter(ip, community, version, port, &if_in_errors_oid), + self.get_counter(ip, community, version, port, &if_out_errors_oid), + self.get_counter(ip, community, version, port, &if_in_discards_oid), + self.get_counter(ip, community, version, port, &if_out_discards_oid), ); let in_octets = in_octets_result.unwrap_or(0);