From 4658e2c481c1e5bc0061eaa377f5b6dfc2fbff51 Mon Sep 17 00:00:00 2001 From: postscriptum Date: Sun, 22 Mar 2026 22:49:10 +0200 Subject: [PATCH] reorganize snapshot stats, implement detailed summary --- src/main.rs | 6 +++--- src/stats.rs | 30 +++++++++--------------------- src/stats/snap.rs | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 src/stats/snap.rs diff --git a/src/main.rs b/src/main.rs index 83c0efd..f336782 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,14 +11,14 @@ use list::List; use log::*; use opt::{AuthMode, Opt}; use rocket::{State, http::Status, serde::json::Json}; -use stats::{Snapshot, Total}; +use stats::{Snap, Total}; use std::{future::Future, sync::Arc}; use structopt::StructOpt; use tokio::{net::TcpListener, task}; #[rocket::get("/")] -async fn index(totals: &State>) -> Json { - Json(totals.inner().snapshot()) +async fn index(totals: &State>) -> Json { + Json(totals.inner().snap()) } #[rocket::get("/allow/")] diff --git a/src/stats.rs b/src/stats.rs index 581b6ee..49c7a31 100644 --- a/src/stats.rs +++ b/src/stats.rs @@ -1,13 +1,8 @@ -use rocket::serde::Serialize; +mod snap; + use std::sync::atomic::{AtomicU64, Ordering}; -#[derive(Serialize)] -pub struct Snapshot { - pub request: u64, - pub blocked: u64, - pub entries: u64, - pub percent: f32, -} +pub use snap::Snap; #[derive(Default)] pub struct Total { @@ -23,19 +18,12 @@ impl Total { ..Self::default() } } - pub fn snapshot(&self) -> Snapshot { - let request = self.request.load(Ordering::Relaxed); - let blocked = self.blocked.load(Ordering::Relaxed); - Snapshot { - request, - blocked, - entries: self.entries.load(Ordering::Relaxed), - percent: if request > 0 { - blocked as f32 * 100.0 / request as f32 - } else { - 0.0 - }, - } + pub fn snap(&self) -> Snap { + Snap::shot( + self.entries.load(Ordering::Relaxed), + self.request.load(Ordering::Relaxed), + self.blocked.load(Ordering::Relaxed), + ) } pub fn set_entries(&self, value: u64) { self.entries.store(value, Ordering::Relaxed); diff --git a/src/stats/snap.rs b/src/stats/snap.rs new file mode 100644 index 0000000..ea2c877 --- /dev/null +++ b/src/stats/snap.rs @@ -0,0 +1,35 @@ +use rocket::serde::Serialize; + +#[derive(Serialize)] +pub struct Sum { + total: u64, + percent: f32, +} + +#[derive(Serialize)] +pub struct Snap { + rules: u64, + request: Sum, + blocked: Sum, +} + +impl Snap { + pub fn shot(rules: u64, request: u64, blocked: u64) -> Self { + let blocked_percent = if request > 0 { + blocked as f32 * 100.0 / request as f32 + } else { + 0.0 + }; + Self { + rules, + request: Sum { + total: request, + percent: 100.0 - blocked_percent, + }, + blocked: Sum { + total: blocked, + percent: blocked_percent, + }, + } + } +}