From 243a9eabe185661fa7c35fec59482c215fc8dc4f Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 1 Sep 2024 21:47:18 +0200 Subject: add simple api --- src/api.rs | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/api.rs (limited to 'src/api.rs') diff --git a/src/api.rs b/src/api.rs new file mode 100644 index 0000000..56ee6f0 --- /dev/null +++ b/src/api.rs @@ -0,0 +1,70 @@ +use crate::{Config, Status, STATUS}; +use serde_json::{json, Value}; +use std::{ops::Deref, sync::Arc}; + +pub async fn make_json_response(config: Arc) -> Value { + let status = STATUS.read().await; + let status = status.deref(); + let total_err = status + .values() + .map(|s| s.status.is_err() as usize) + .sum::(); + let total_ok = status + .values() + .map(|s| s.status.is_ok() as usize) + .sum::(); + + let mut titles_failed = Vec::new(); + let services = config + .services + .iter() + .enumerate() + .map(|(i, s)| { + let total_err = status + .range((i, usize::MIN)..(i, usize::MAX)) + .map(|(_, s)| s.status.is_err() as usize) + .sum::(); + let total_ok = status + .range((i, usize::MIN)..(i, usize::MAX)) + .map(|(_, s)| s.status.is_ok() as usize) + .sum::(); + if total_err != 0 { + titles_failed.push(&s.title) + } + json!({ + "status": if total_err == 0 { + "ok" + } else if total_ok == 0 { + "failed" + } else { + "degraded" + }, + "title": &s.title, + }) + }) + .collect::>(); + + json!({ + "status": if total_err == 0 { + "ok" + } else if total_ok == 0 { + "failed" + } else { + "degraded" + }, + "total_ok": total_ok, + "total_err": total_err, + "services": services, + "failed": titles_failed + }) +} + +impl Status { + pub fn json(&self) -> Value { + json!({ + "ok": self.status.is_ok(), + "message": match &self.status { Ok(m) => m, Err(m) => m }, + "time": self.time.timestamp() + }) + } +} -- cgit v1.2.3-70-g09d2