diff --git a/src/baseliner.rs b/src/baseliner.rs index b16ea63..4908c43 100644 --- a/src/baseliner.rs +++ b/src/baseliner.rs @@ -84,6 +84,7 @@ pub struct Baseliner { pub selection_tx: Option>, pub baseline_metrics: MetricsSender, pub event_metrics: MetricsSender, + pub ping_metrics: MetricsSender, } fn ewma_factor(tick: f64, dur: f64) -> f64 { @@ -201,6 +202,20 @@ impl Baseliner { let _ = self.reselect_trigger.try_send(true); } + self.ping_metrics.send(Metric::Ping { + reflector, + measurement_type: reply.stream.source, + rtt: reply.rtt_ms(), + up_time: reply + .one_way + .map(|o| o.uplink.as_nanos() as f64 / 1000000.0) + .unwrap_or(reply.rtt_ms() / 2.0), + down_time: reply + .one_way + .map(|o| o.downlink.as_nanos() as f64 / 1000000.0) + .unwrap_or(reply.rtt_ms() / 2.0), + }); + self.baseline_metrics.send(Metric::Baseline { reflector, baseline_up_ewma: state.baseline.up, diff --git a/src/main.rs b/src/main.rs index 1059ae8..19bbabf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -266,7 +266,7 @@ fn run(settings: &Settings) -> anyhow::Result<()> { .unwrap_or_else(MetricsSender::disabled) }; - let _ping_metrics = make_sender(settings.observability.export_ping_metrics); + let ping_metrics = make_sender(settings.observability.export_ping_metrics); let baseline_metrics = make_sender(settings.observability.export_baseline_metrics); let event_metrics = make_sender(settings.observability.export_events); let rate_metrics = make_sender(settings.observability.export_rate_metrics); @@ -291,6 +291,7 @@ fn run(settings: &Settings) -> anyhow::Result<()> { selection_tx: selection_snapshot_tx, baseline_metrics, event_metrics: event_metrics.clone(), + ping_metrics, }; let mut main_traffic_control = traffic_control_backend(); diff --git a/src/measurement/model.rs b/src/measurement/model.rs index a835c63..12b7bf5 100644 --- a/src/measurement/model.rs +++ b/src/measurement/model.rs @@ -1,3 +1,4 @@ +use std::fmt::{self, Display}; use std::{ net::IpAddr, time::{Duration, Instant}, @@ -16,6 +17,18 @@ pub enum MeasurementSource { TcpTimestamp, } +impl Display for MeasurementSource { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + MeasurementSource::IcmpEcho => write!(f, "icmp"), + MeasurementSource::IcmpTimestamp => write!(f, "icmp-timestamps"), + MeasurementSource::Irtt => write!(f, "irtt"), + MeasurementSource::TcpSeqAck => write!(f, "tcp-seqack"), + MeasurementSource::TcpTimestamp => write!(f, "tcp-timestamp"), + } + } +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct MeasurementStream { pub id: MeasurementStreamId, diff --git a/src/metrics.rs b/src/metrics.rs index a989161..fac27c9 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -2,8 +2,9 @@ // // SPDX-License-Identifier: MPL-2.0 +use crate::measurement::model::MeasurementSource; +use crate::settings::ObservabilityProtocol; use crate::settings::Settings; -use crate::settings::{MeasurementType, ObservabilityProtocol}; use crate::time::{ClockSample, Realtime}; use flume::{Receiver, RecvTimeoutError, Sender}; use log::{error, info, warn}; @@ -93,7 +94,7 @@ impl Transport { pub enum Metric { Ping { reflector: IpAddr, - measurement_type: MeasurementType, + measurement_type: MeasurementSource, rtt: f64, up_time: f64, down_time: f64,