From 450bbe60f35997f3f65cd19f025c3413f528e0b7 Mon Sep 17 00:00:00 2001 From: yggverse Date: Sat, 28 Jun 2025 17:38:17 +0300 Subject: [PATCH] reorganize stats collector --- src/server/connection.rs | 6 +++--- src/session.rs | 12 +++++------ .../{stats/connections.rs => request.rs} | 21 ++++++++++++------- src/session/request/query.rs | 15 +++++++++++++ src/session/stats.rs | 15 ------------- 5 files changed, 38 insertions(+), 31 deletions(-) rename src/session/{stats/connections.rs => request.rs} (59%) create mode 100644 src/session/request/query.rs delete mode 100644 src/session/stats.rs diff --git a/src/server/connection.rs b/src/server/connection.rs index d12b0ef..874c6c7 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -32,7 +32,6 @@ impl Connection { } pub fn handle(mut self) { - self.session.stats.connections.add(&self.address.client); let mut t = 0; // total bytes match self.request() { Ok(q) => { @@ -40,6 +39,7 @@ impl Connection { "[{}] < [{}] request `{q}`...", self.address.server, self.address.client )); + self.session.request.add(&self.address.client, &q); self.session .clone() .public @@ -74,8 +74,8 @@ impl Connection { &if is_root { self.session.template.welcome( Some(s), - Some(self.session.stats.connections.count()), - Some(self.session.stats.connections.total()), + Some(self.session.request.count()), + Some(self.session.request.total()), ) } else { self.session.template.index(Some(s)) diff --git a/src/session.rs b/src/session.rs index e6b054c..3091b73 100644 --- a/src/session.rs +++ b/src/session.rs @@ -1,17 +1,17 @@ mod access_log; mod debug; mod public; -mod stats; +mod request; mod template; -use {access_log::AccessLog, debug::Debug, public::Public, stats::Stats, template::Template}; +use {access_log::AccessLog, debug::Debug, public::Public, request::Request, template::Template}; /// Shared, multi-thread features for the current server session pub struct Session { pub access_log: AccessLog, pub debug: Debug, - pub stats: Stats, pub public: Public, + pub request: Request, pub template: Template, } @@ -21,11 +21,11 @@ impl Session { Ok(Self { access_log: AccessLog::init(config)?, debug: Debug::init(config)?, - stats: Stats::init( + public: Public::init(config)?, + request: Request::init( // do not init `Connection` event if its features not in use template.welcome.contains("{hosts}") || template.welcome.contains("{hits}"), - )?, - public: Public::init(config)?, + ), template, }) } diff --git a/src/session/stats/connections.rs b/src/session/request.rs similarity index 59% rename from src/session/stats/connections.rs rename to src/session/request.rs index f9dbc05..0606f2c 100644 --- a/src/session/stats/connections.rs +++ b/src/session/request.rs @@ -1,13 +1,16 @@ +mod query; + +use query::Query; use std::{ collections::HashMap, net::{IpAddr, SocketAddr}, sync::RwLock, }; -/// Count peer connections (for the current server session) -pub struct Connections(Option>>); +/// Collect peer requests to print stats and visitors count +pub struct Request(Option>>>); -impl Connections { +impl Request { pub fn init(is_enabled: bool) -> Self { if is_enabled { Self(Some(RwLock::new(HashMap::with_capacity(100)))) @@ -16,13 +19,13 @@ impl Connections { } } - pub fn add(&self, peer: &SocketAddr) { + pub fn add(&self, peer: &SocketAddr, query: &str) { if let Some(ref this) = self.0 { this.write() .unwrap() .entry(peer.ip()) - .and_modify(|c| *c += 1) - .or_insert(1); + .and_modify(|c| c.push(Query::new(query))) + .or_insert(vec![Query::new(query)]); } } @@ -36,7 +39,11 @@ impl Connections { pub fn total(&self) -> usize { if let Some(ref this) = self.0 { - this.read().unwrap().values().sum() + let mut t = 0; + for c in this.read().unwrap().values() { + t += c.len() + } + t } else { 0 } diff --git a/src/session/request/query.rs b/src/session/request/query.rs new file mode 100644 index 0000000..0d4d0f3 --- /dev/null +++ b/src/session/request/query.rs @@ -0,0 +1,15 @@ +use std::time::SystemTime; + +pub struct Query { + pub time: SystemTime, + pub value: String, +} + +impl Query { + pub fn new(value: &str) -> Self { + Self { + time: SystemTime::now(), + value: value.to_string(), + } + } +} diff --git a/src/session/stats.rs b/src/session/stats.rs deleted file mode 100644 index 50674d7..0000000 --- a/src/session/stats.rs +++ /dev/null @@ -1,15 +0,0 @@ -mod connections; -use connections::Connections; - -pub struct Stats { - pub connections: Connections, - // another features... -} - -impl Stats { - pub fn init(is_connection_enabled: bool) -> anyhow::Result { - Ok(Self { - connections: Connections::init(is_connection_enabled), - }) - } -}