correctly calculate percentegates

This commit is contained in:
nora 2024-02-03 21:39:37 +01:00
parent 8b2ec568c3
commit 50d15bc4e7
3 changed files with 20 additions and 13 deletions

View file

@ -197,25 +197,30 @@ pub async fn migrate_checks(db: &Pool<Sqlite>, interval_seconds: u64) -> Result<
} }
info!("Inserting checks"); 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() { for check in table.iter() {
sqlx::query("INSERT INTO checks_series (request_time_range_start, request_time_range_end, website, result) VALUES (?, ?, ?, ?);") 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_start)
.bind(check.request_time_range_end) .bind(check.request_time_range_end)
.bind(&check.website) .bind(&check.website)
.bind(&check.result) .bind(&check.result)
.execute(&mut *db) .execute(&mut *db_trans)
.await .await
.wrap_err_with(|| format!("inserting new series record for {}", check.website))?; .wrap_err_with(|| format!("inserting new series record for {}", check.website))?;
} }
info!("Dropping old table"); info!("Dropping old table");
sqlx::query("DROP TABLE checks") sqlx::query("DROP TABLE checks")
.execute(&mut *db) .execute(&mut *db_trans)
.await .await
.wrap_err("dropping table checks")?; .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(()) Ok(())
} }

View file

@ -81,15 +81,22 @@ fn compute_status(checks: Vec<CheckSeries>) -> Vec<WebsiteStatus> {
const BAR_ELEMS: usize = 100; const BAR_ELEMS: usize = 100;
let bar_info = checks_to_classes(&checks, BAR_ELEMS); 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)| { checks.into_iter().for_each(|(time, result)| {
if let CheckState::Ok = result { if let CheckState::Ok = result {
last_ok = std::cmp::max(last_ok, Some(time.end)); 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 ok_ratio = format!("{:.2}%", ok_ratio * 100.0);
let last_ok = last_ok.map(|utc| utc.render_nicely()); let last_ok = last_ok.map(|utc| utc.render_nicely());
@ -97,8 +104,6 @@ fn compute_status(checks: Vec<CheckSeries>) -> Vec<WebsiteStatus> {
website, website,
last_ok, last_ok,
ok_ratio, ok_ratio,
count_ok,
total_requests: len,
bar_info, bar_info,
} }
}) })
@ -221,8 +226,6 @@ struct WebsiteStatus {
website: String, website: String,
last_ok: Option<String>, last_ok: Option<String>,
ok_ratio: String, ok_ratio: String,
total_requests: usize,
count_ok: usize,
bar_info: BarInfo, bar_info: BarInfo,
} }

View file

@ -68,8 +68,7 @@
<h2>{{ check.website }}</h2> <h2>{{ check.website }}</h2>
<p> <p>
Uptime: {{ check.ok_ratio }} ({{ check.count_ok }}/{{ Uptime: {{ check.ok_ratio }}
check.total_requests }})
</p> </p>
{% if check.last_ok.is_some() %} {% if check.last_ok.is_some() %}
<p> <p>