From 0e8f270742270b0cc695182ebd488574e2351f15 Mon Sep 17 00:00:00 2001 From: Jan Christian Gr??nhage Date: Mon, 6 Apr 2020 13:57:06 +0200 Subject: [PATCH] improve logging and error handling fixes #2 --- src/main.rs | 9 +++++++-- src/metrics.rs | 9 ++++----- src/ping.rs | 19 +++++++++++++++---- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index ccfffa3..f97aec0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -39,6 +39,11 @@ async fn main() -> Result<(), ()> { }; tokio::spawn(start_pinging_hosts(config.clone())); - start_serving_metrics(config.clone()).await; - Ok(()) + match start_serving_metrics(config.clone()).await { + Ok(_) => Ok(()), + Err(error) => { + error!("Couldn't serve metrics: {}", error); + Err(()) + } + } } diff --git a/src/metrics.rs b/src/metrics.rs index d38aa7b..14a31fd 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -24,6 +24,7 @@ use hyper::{ Body, Request, Response, Server, }; use lazy_static::lazy_static; +use log::info; use prometheus::*; use prometheus::{Counter, Gauge, HistogramVec, TextEncoder}; @@ -70,12 +71,10 @@ async fn serve_req(_req: Request) -> std::result::Result, h Ok(response) } -pub(crate) async fn start_serving_metrics(config: Config) { +pub(crate) async fn start_serving_metrics(config: Config) -> std::result::Result<(), hyper::Error> { let serve_future = Server::bind(&config.listener).serve(make_service_fn(|_| async { Ok::<_, hyper::Error>(service_fn(serve_req)) })); - - if let Err(err) = serve_future.await { - eprintln!("server error: {}", err); - } + info!("Listening on {}", &config.listener); + serve_future.await } diff --git a/src/ping.rs b/src/ping.rs index a704e86..8d67009 100644 --- a/src/ping.rs +++ b/src/ping.rs @@ -20,7 +20,7 @@ use crate::config::Config; use futures_util::stream::StreamExt; use lazy_static::lazy_static; -use log::{error, info}; +use log::{error, info, trace}; use prometheus::*; use std::time::Duration; use tokio::time::delay_for; @@ -42,7 +42,13 @@ lazy_static! { pub(crate) async fn start_pinging_hosts( config: Config, ) -> std::result::Result<(), tokio_ping::Error> { - let pinger = tokio_ping::Pinger::new().await?; + let pinger = match tokio_ping::Pinger::new().await { + Ok(pinger) => pinger, + Err(error) => { + error!("Couldn't create pinger: {}", error); + std::process::exit(1); + } + }; for (host, interval) in config.hosts.clone() { info!("Spawn ping task for {}", host); let pingchain = pinger.chain(host).timeout(Duration::from_secs(3)); @@ -51,11 +57,16 @@ pub(crate) async fn start_pinging_hosts( match ping_result { Ok(time) => match time { Some(time) => { + let ms = time.as_millis(); + trace!("Received pong from {} after {} ms", &host, &ms); PING_HISTOGRAM .with_label_values(&[&host]) - .observe(time.as_millis() as f64); + .observe(ms as f64); + } + None => { + trace!("Received no response from {} within timeout", &host); + PING_HISTOGRAM.with_label_values(&[&host]).observe(3000.0); } - None => PING_HISTOGRAM.with_label_values(&[&host]).observe(3000.0), }, Err(error) => error!("Couldn't ping {}: {}", &host, error), }