|
|
|
@ -18,13 +18,12 @@
|
|
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
|
|
|
|
|
********************************************************************************/
|
|
|
|
|
use crate::config::Config;
|
|
|
|
|
use futures_util::stream::StreamExt;
|
|
|
|
|
use lazy_static::lazy_static;
|
|
|
|
|
use log::{error, info, trace};
|
|
|
|
|
use prometheus::*;
|
|
|
|
|
use std::net::IpAddr;
|
|
|
|
|
use std::time::Duration;
|
|
|
|
|
use tokio_ping::Pinger;
|
|
|
|
|
use tokio_ping::{PingFuture, Pinger};
|
|
|
|
|
|
|
|
|
|
lazy_static! {
|
|
|
|
|
static ref PING_HISTOGRAM: HistogramVec = register_histogram_vec!(
|
|
|
|
@ -58,21 +57,17 @@ pub(crate) async fn start_pinging_hosts(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async fn ping_host(pinger: Pinger, host: IpAddr, interval: u64) {
|
|
|
|
|
let pingchain = pinger.chain(host).timeout(Duration::from_secs(3));
|
|
|
|
|
let host = host.to_string();
|
|
|
|
|
let mut stream = pingchain.stream();
|
|
|
|
|
let mut pingchain = pinger.chain(host).timeout(Duration::from_secs(3));
|
|
|
|
|
let mut interval = tokio::time::interval(Duration::from_millis(interval));
|
|
|
|
|
let host_string = host.to_string();
|
|
|
|
|
loop {
|
|
|
|
|
interval.tick().await;
|
|
|
|
|
handle_ping_result(stream.next().await.unwrap(), &host).await;
|
|
|
|
|
tokio::spawn(handle_ping_result(pingchain.send(), host_string.clone()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async fn handle_ping_result(
|
|
|
|
|
result: std::result::Result<Option<Duration>, tokio_ping::Error>,
|
|
|
|
|
host: &str,
|
|
|
|
|
) {
|
|
|
|
|
let pong = match result {
|
|
|
|
|
async fn handle_ping_result(result: PingFuture, host: String) {
|
|
|
|
|
let pong = match result.await {
|
|
|
|
|
Ok(pong) => pong,
|
|
|
|
|
Err(error) => {
|
|
|
|
|
error!("Couldn't ping {}: {}", &host, error);
|
|
|
|
|