From ff29540d56362beb5928a32d5381a4e079f7b58a Mon Sep 17 00:00:00 2001 From: Maciej Hirsz <1096222+maciejhirsz@users.noreply.github.com> Date: Tue, 18 Feb 2020 13:59:12 +0100 Subject: [PATCH] feat: Added a /health endpoint (#230) --- backend/src/aggregator.rs | 15 +++++++++++++++ backend/src/main.rs | 21 ++++++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/backend/src/aggregator.rs b/backend/src/aggregator.rs index 56a7b45..ab3a5a9 100644 --- a/backend/src/aggregator.rs +++ b/backend/src/aggregator.rs @@ -131,10 +131,17 @@ pub struct NodeCount(pub ChainId, pub usize); /// Message sent to the Aggregator to get the network state of a particular node pub struct GetNetworkState(pub Box, pub NodeId); +/// Message sent to the Aggregator to get a health check +pub struct GetHealth; + impl Message for GetNetworkState { type Result = Option>; } +impl Message for GetHealth { + type Result = usize; +} + impl Handler for Aggregator { type Result = (); @@ -264,3 +271,11 @@ impl Handler for Aggregator { Some(self.get_chain(&*chain)?.addr.send(GetNodeNetworkState(nid))) } } + +impl Handler for Aggregator { + type Result = usize; + + fn handle(&mut self, _: GetHealth, _: &mut Self::Context) -> Self::Result { + self.chains.len() + } +} diff --git a/backend/src/main.rs b/backend/src/main.rs index 3a31f3a..e35b411 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -17,7 +17,7 @@ mod util; use node::connector::NodeConnector; use feed::connector::FeedConnector; -use aggregator::{Aggregator, GetNetworkState}; +use aggregator::{Aggregator, GetNetworkState, GetHealth}; use util::{Locator, LocatorFactory}; use types::NodeId; @@ -77,6 +77,19 @@ fn state_route( }) } +fn health( + aggregator: web::Data> +) -> impl Future { + aggregator + .send(GetHealth) + .from_err() + .and_then(|count| { + let body = format!("Connected chains: {}", count); + + HttpResponse::Ok().body(body) + }) +} + fn main() -> std::io::Result<()> { use web::{resource, get}; @@ -86,9 +99,9 @@ fn main() -> std::io::Result<()> { let aggregator = Aggregator::new().start(); let factory = LocatorFactory::new(); let locator = SyncArbiter::start(4, move || factory.create()); - + let port = std::env::var("PORT").ok().and_then(|v| v.parse().ok()).unwrap_or(8000u16); - + HttpServer::new(move || { App::new() .data(aggregator.clone()) @@ -99,6 +112,8 @@ fn main() -> std::io::Result<()> { .service(resource("/feed/").route(get().to(feed_route))) .service(resource("/network_state/{chain}/{nid}").route(get().to_async(state_route))) .service(resource("/network_state/{chain}/{nid}/").route(get().to_async(state_route))) + .service(resource("/health").route(get().to_async(health))) + .service(resource("/health/").route(get().to_async(health))) }) .bind(format!("0.0.0.0:{}", port))? .start();