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",
|
"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]]
|
[[package]]
|
||||||
name = "pear"
|
name = "pear"
|
||||||
version = "0.2.8"
|
version = "0.2.8"
|
||||||
@ -1739,6 +1745,28 @@ dependencies = [
|
|||||||
"windows-sys 0.48.0",
|
"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]]
|
[[package]]
|
||||||
name = "rocket"
|
name = "rocket"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
@ -1762,9 +1790,11 @@ dependencies = [
|
|||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"rand",
|
"rand",
|
||||||
"ref-cast",
|
"ref-cast",
|
||||||
|
"rmp-serde",
|
||||||
"rocket_codegen",
|
"rocket_codegen",
|
||||||
"rocket_http",
|
"rocket_http",
|
||||||
"serde",
|
"serde",
|
||||||
|
"serde_json",
|
||||||
"state",
|
"state",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"time",
|
"time",
|
||||||
|
|||||||
@ -19,7 +19,7 @@ duplicate = "0.2"
|
|||||||
handlebars = "3"
|
handlebars = "3"
|
||||||
http = "0.2"
|
http = "0.2"
|
||||||
ron = "0.6.4"
|
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"] }
|
rocket_dyn_templates = { version = "0.1.0", features = ["handlebars"] }
|
||||||
tokio = { version = "1", features = ["fs"] }
|
tokio = { version = "1", features = ["fs"] }
|
||||||
reqwest = { version = "0.11", default-features = false, features = ["rustls-tls"] }
|
reqwest = { version = "0.11", default-features = false, features = ["rustls-tls"] }
|
||||||
|
|||||||
@ -7,7 +7,7 @@ use std::collections::HashMap;
|
|||||||
|
|
||||||
pub type ServiceId = String;
|
pub type ServiceId = String;
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone, Serialize)]
|
||||||
pub enum HealthStatus {
|
pub enum HealthStatus {
|
||||||
/// The service is up and running
|
/// The service is up and running
|
||||||
Up,
|
Up,
|
||||||
|
|||||||
@ -36,7 +36,10 @@ async fn main() -> eyre::Result<()> {
|
|||||||
.attach(Template::fairing())
|
.attach(Template::fairing())
|
||||||
.manage(Arc::clone(&state))
|
.manage(Arc::clone(&state))
|
||||||
.mount("/static", FileServer::from("static"))
|
.mount("/static", FileServer::from("static"))
|
||||||
.mount("/", rocket::routes![routes::pages::dashboard]);
|
.mount(
|
||||||
|
"/",
|
||||||
|
rocket::routes![routes::pages::dashboard, routes::api::status],
|
||||||
|
);
|
||||||
|
|
||||||
start_poller(state);
|
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