From 50d15bc4e75f056afd97ff8d59c507ff8867ec9d Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Sat, 3 Feb 2024 21:39:37 +0100 Subject: [PATCH] correctly calculate percentegates --- src/db.rs | 13 +++++++++---- src/web.rs | 17 ++++++++++------- templates/index.html | 3 +-- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/db.rs b/src/db.rs index 6793c08..81aacad 100644 --- a/src/db.rs +++ b/src/db.rs @@ -197,25 +197,30 @@ pub async fn migrate_checks(db: &Pool, interval_seconds: u64) -> Result< } info!("Inserting checks"); - let mut db = db.begin().await.wrap_err("starting transaction")?; + let mut db_trans = db.begin().await.wrap_err("starting transaction")?; for check in table.iter() { sqlx::query("INSERT INTO checks_series (request_time_range_start, request_time_range_end, website, result) VALUES (?, ?, ?, ?);") .bind(check.request_time_range_start) .bind(check.request_time_range_end) .bind(&check.website) .bind(&check.result) - .execute(&mut *db) + .execute(&mut *db_trans) .await .wrap_err_with(|| format!("inserting new series record for {}", check.website))?; } info!("Dropping old table"); sqlx::query("DROP TABLE checks") - .execute(&mut *db) + .execute(&mut *db_trans) .await .wrap_err("dropping table checks")?; - db.commit().await.wrap_err("committing transaction")?; + db_trans.commit().await.wrap_err("committing transaction")?; + + sqlx::query("VACUUM") + .execute(db) + .await + .wrap_err("running vacuum")?; Ok(()) } diff --git a/src/web.rs b/src/web.rs index 3613ade..2424ead 100644 --- a/src/web.rs +++ b/src/web.rs @@ -81,15 +81,22 @@ fn compute_status(checks: Vec) -> Vec { const BAR_ELEMS: usize = 100; let bar_info = checks_to_classes(&checks, BAR_ELEMS); - let len = checks.len(); + let total_duration_millis = checks + .first() + .map(|first| { + checks.last().unwrap().0.end.timestamp_millis() + - first.0.start.timestamp_millis() + }) + .unwrap_or_default(); + checks.into_iter().for_each(|(time, result)| { if let CheckState::Ok = result { last_ok = std::cmp::max(last_ok, Some(time.end)); - count_ok += 1; + count_ok += time.end.timestamp_millis() - time.start.timestamp_millis(); } }); - let ok_ratio = (count_ok as f32) / (len as f32); + let ok_ratio = (count_ok as f32) / (total_duration_millis as f32); let ok_ratio = format!("{:.2}%", ok_ratio * 100.0); let last_ok = last_ok.map(|utc| utc.render_nicely()); @@ -97,8 +104,6 @@ fn compute_status(checks: Vec) -> Vec { website, last_ok, ok_ratio, - count_ok, - total_requests: len, bar_info, } }) @@ -221,8 +226,6 @@ struct WebsiteStatus { website: String, last_ok: Option, ok_ratio: String, - total_requests: usize, - count_ok: usize, bar_info: BarInfo, } diff --git a/templates/index.html b/templates/index.html index 48a8566..392c69e 100644 --- a/templates/index.html +++ b/templates/index.html @@ -68,8 +68,7 @@

{{ check.website }}

- Uptime: {{ check.ok_ratio }} ({{ check.count_ok }}/{{ - check.total_requests }}) + Uptime: {{ check.ok_ratio }}

{% if check.last_ok.is_some() %}