@ -39,6 +39,11 @@ async fn main() -> Result<(), ()> {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tokio::spawn(start_pinging_hosts(config.clone()));
 | 
					    tokio::spawn(start_pinging_hosts(config.clone()));
 | 
				
			||||||
    start_serving_metrics(config.clone()).await;
 | 
					    match start_serving_metrics(config.clone()).await {
 | 
				
			||||||
    Ok(())
 | 
					        Ok(_) => Ok(()),
 | 
				
			||||||
 | 
					        Err(error) => {
 | 
				
			||||||
 | 
					            error!("Couldn't serve metrics: {}", error);
 | 
				
			||||||
 | 
					            Err(())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -24,6 +24,7 @@ use hyper::{
 | 
				
			|||||||
    Body, Request, Response, Server,
 | 
					    Body, Request, Response, Server,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use lazy_static::lazy_static;
 | 
					use lazy_static::lazy_static;
 | 
				
			||||||
 | 
					use log::info;
 | 
				
			||||||
use prometheus::*;
 | 
					use prometheus::*;
 | 
				
			||||||
use prometheus::{Counter, Gauge, HistogramVec, TextEncoder};
 | 
					use prometheus::{Counter, Gauge, HistogramVec, TextEncoder};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -70,12 +71,10 @@ async fn serve_req(_req: Request<Body>) -> std::result::Result<Response<Body>, h
 | 
				
			|||||||
    Ok(response)
 | 
					    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 {
 | 
					    let serve_future = Server::bind(&config.listener).serve(make_service_fn(|_| async {
 | 
				
			||||||
        Ok::<_, hyper::Error>(service_fn(serve_req))
 | 
					        Ok::<_, hyper::Error>(service_fn(serve_req))
 | 
				
			||||||
    }));
 | 
					    }));
 | 
				
			||||||
 | 
					    info!("Listening on {}", &config.listener);
 | 
				
			||||||
    if let Err(err) = serve_future.await {
 | 
					    serve_future.await
 | 
				
			||||||
        eprintln!("server error: {}", err);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										19
									
								
								src/ping.rs
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								src/ping.rs
									
									
									
									
									
								
							@ -20,7 +20,7 @@
 | 
				
			|||||||
use crate::config::Config;
 | 
					use crate::config::Config;
 | 
				
			||||||
use futures_util::stream::StreamExt;
 | 
					use futures_util::stream::StreamExt;
 | 
				
			||||||
use lazy_static::lazy_static;
 | 
					use lazy_static::lazy_static;
 | 
				
			||||||
use log::{error, info};
 | 
					use log::{error, info, trace};
 | 
				
			||||||
use prometheus::*;
 | 
					use prometheus::*;
 | 
				
			||||||
use std::time::Duration;
 | 
					use std::time::Duration;
 | 
				
			||||||
use tokio::time::delay_for;
 | 
					use tokio::time::delay_for;
 | 
				
			||||||
@ -42,7 +42,13 @@ lazy_static! {
 | 
				
			|||||||
pub(crate) async fn start_pinging_hosts(
 | 
					pub(crate) async fn start_pinging_hosts(
 | 
				
			||||||
    config: Config,
 | 
					    config: Config,
 | 
				
			||||||
) -> std::result::Result<(), tokio_ping::Error> {
 | 
					) -> 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() {
 | 
					    for (host, interval) in config.hosts.clone() {
 | 
				
			||||||
        info!("Spawn ping task for {}", host);
 | 
					        info!("Spawn ping task for {}", host);
 | 
				
			||||||
        let pingchain = pinger.chain(host).timeout(Duration::from_secs(3));
 | 
					        let pingchain = pinger.chain(host).timeout(Duration::from_secs(3));
 | 
				
			||||||
@ -51,11 +57,16 @@ pub(crate) async fn start_pinging_hosts(
 | 
				
			|||||||
            match ping_result {
 | 
					            match ping_result {
 | 
				
			||||||
                Ok(time) => match time {
 | 
					                Ok(time) => match time {
 | 
				
			||||||
                    Some(time) => {
 | 
					                    Some(time) => {
 | 
				
			||||||
 | 
					                        let ms = time.as_millis();
 | 
				
			||||||
 | 
					                        trace!("Received pong from {} after {} ms", &host, &ms);
 | 
				
			||||||
                        PING_HISTOGRAM
 | 
					                        PING_HISTOGRAM
 | 
				
			||||||
                            .with_label_values(&[&host])
 | 
					                            .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),
 | 
					                Err(error) => error!("Couldn't ping {}: {}", &host, error),
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user