Skip to content

Commit 0724ae6

Browse files
gnmytcode-inflation
authored andcommitted
Add detailed latency measurements to output and logging
1 parent 1cf3632 commit 0724ae6

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

src/measurements.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ pub struct Measurement {
2424
pub mbit: f64,
2525
}
2626

27+
#[derive(Serialize)]
28+
pub struct LatencyMeasurement {
29+
pub avg_latency_ms: f64,
30+
pub min_latency_ms: f64,
31+
pub max_latency_ms: f64,
32+
pub latency_measurements: Vec<f64>,
33+
}
34+
2735
impl Display for Measurement {
2836
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2937
write!(
@@ -38,6 +46,7 @@ impl Display for Measurement {
3846

3947
pub(crate) fn log_measurements(
4048
measurements: &[Measurement],
49+
latency_measurement: Option<&LatencyMeasurement>,
4150
payload_sizes: Vec<usize>,
4251
verbose: bool,
4352
output_format: OutputFormat,
@@ -70,12 +79,21 @@ pub(crate) fn log_measurements(
7079
wtr.flush().unwrap();
7180
}
7281
OutputFormat::Json => {
73-
serde_json::to_writer(io::stdout(), &stat_measurements).unwrap();
82+
let mut output = serde_json::Map::new();
83+
output.insert("speed_measurements".to_string(), serde_json::to_value(&stat_measurements).unwrap());
84+
if let Some(latency) = latency_measurement {
85+
output.insert("latency_measurement".to_string(), serde_json::to_value(latency).unwrap());
86+
}
87+
serde_json::to_writer(io::stdout(), &output).unwrap();
7488
println!();
7589
}
7690
OutputFormat::JsonPretty => {
77-
// json_pretty output test
78-
serde_json::to_writer_pretty(io::stdout(), &stat_measurements).unwrap();
91+
let mut output = serde_json::Map::new();
92+
output.insert("speed_measurements".to_string(), serde_json::to_value(&stat_measurements).unwrap());
93+
if let Some(latency) = latency_measurement {
94+
output.insert("latency_measurement".to_string(), serde_json::to_value(latency).unwrap());
95+
}
96+
serde_json::to_writer_pretty(io::stdout(), &output).unwrap();
7997
println!();
8098
}
8199
OutputFormat::StdOut => {}

src/speedtest.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::measurements::format_bytes;
22
use crate::measurements::log_measurements;
33
use crate::measurements::Measurement;
4+
use crate::measurements::LatencyMeasurement;
45
use crate::progress::print_progress;
56
use crate::OutputFormat;
67
use crate::SpeedTestCLIOptions;
@@ -93,7 +94,18 @@ pub fn speed_test(client: Client, options: SpeedTestCLIOptions) -> Vec<Measureme
9394
if options.output_format == OutputFormat::StdOut {
9495
println!("{metadata}");
9596
}
96-
run_latency_test(&client, options.nr_latency_tests, options.output_format);
97+
let (latency_measurements, avg_latency) = run_latency_test(&client, options.nr_latency_tests, options.output_format);
98+
let latency_measurement = if !latency_measurements.is_empty() {
99+
Some(LatencyMeasurement {
100+
avg_latency_ms: avg_latency,
101+
min_latency_ms: latency_measurements.iter().copied().fold(f64::INFINITY, f64::min),
102+
max_latency_ms: latency_measurements.iter().copied().fold(f64::NEG_INFINITY, f64::max),
103+
latency_measurements,
104+
})
105+
} else {
106+
None
107+
};
108+
97109
let payload_sizes = PayloadSize::sizes_from_max(options.max_payload_size.clone());
98110
let mut measurements = Vec::new();
99111

@@ -123,6 +135,7 @@ pub fn speed_test(client: Client, options: SpeedTestCLIOptions) -> Vec<Measureme
123135

124136
log_measurements(
125137
&measurements,
138+
latency_measurement.as_ref(),
126139
payload_sizes,
127140
options.verbose,
128141
options.output_format,

0 commit comments

Comments
 (0)