Add json api
This commit is contained in:
30
Cargo.lock
generated
30
Cargo.lock
generated
@ -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",
|
||||
|
||||
@ -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"] }
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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<DateTime<Utc>>,
|
||||
services: BTreeMap<String, HealthStatus>,
|
||||
}
|
||||
|
||||
#[get("/status")]
|
||||
pub async fn status(state: &State<Arc<HealthState>>) -> Json<Status> {
|
||||
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,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user