From e9ac30898baaad4d2c199ce34028fcac28430e1e Mon Sep 17 00:00:00 2001 From: Joakim Hulthe Date: Wed, 31 Jan 2024 22:14:50 +0100 Subject: [PATCH] Add json api --- Cargo.lock | 30 ++++++++++++++++++++++++++++++ Cargo.toml | 2 +- src/health/mod.rs | 2 +- src/main.rs | 5 ++++- src/routes/api/mod.rs | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a0abf77..3fad79f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1402,6 +1402,12 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pear" version = "0.2.8" @@ -1739,6 +1745,28 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "rmp" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + [[package]] name = "rocket" version = "0.5.0" @@ -1762,9 +1790,11 @@ dependencies = [ "pin-project-lite", "rand", "ref-cast", + "rmp-serde", "rocket_codegen", "rocket_http", "serde", + "serde_json", "state", "tempfile", "time", diff --git a/Cargo.toml b/Cargo.toml index f766804..3ce1b2c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ duplicate = "0.2" handlebars = "3" http = "0.2" ron = "0.6.4" -rocket = { version = "0.5", features = ["secrets"] } +rocket = { version = "0.5", features = ["secrets", "msgpack", "json"] } rocket_dyn_templates = { version = "0.1.0", features = ["handlebars"] } tokio = { version = "1", features = ["fs"] } reqwest = { version = "0.11", default-features = false, features = ["rustls-tls"] } diff --git a/src/health/mod.rs b/src/health/mod.rs index e6a9604..bb2a9b8 100644 --- a/src/health/mod.rs +++ b/src/health/mod.rs @@ -7,7 +7,7 @@ use std::collections::HashMap; pub type ServiceId = String; -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Copy, Clone, Serialize)] pub enum HealthStatus { /// The service is up and running Up, diff --git a/src/main.rs b/src/main.rs index 74982c0..6a3aa73 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,7 +36,10 @@ async fn main() -> eyre::Result<()> { .attach(Template::fairing()) .manage(Arc::clone(&state)) .mount("/static", FileServer::from("static")) - .mount("/", rocket::routes![routes::pages::dashboard]); + .mount( + "/", + rocket::routes![routes::pages::dashboard, routes::api::status], + ); start_poller(state); diff --git a/src/routes/api/mod.rs b/src/routes/api/mod.rs index e69de29..cd05eae 100644 --- a/src/routes/api/mod.rs +++ b/src/routes/api/mod.rs @@ -0,0 +1,33 @@ +use crate::health::HealthState; +use crate::health::HealthStatus; +use chrono::DateTime; +use chrono::Utc; +use rocket::serde::json::Json; +use rocket::{get, State}; +use serde::Serialize; +use std::collections::BTreeMap; +use std::sync::Arc; + +#[derive(Serialize)] +pub struct Status { + last_update: Option>, + services: BTreeMap, +} + +#[get("/status")] +pub async fn status(state: &State>) -> Json { + let last_update = *state.last_update.lock().await; + let mut services = BTreeMap::new(); + + for (id, status) in &state.health { + let Some(status) = *status.lock().await else { + continue; + }; + services.insert(id.clone(), status); + } + + Json(Status { + last_update, + services, + }) +}