Skip to content

Commit e4ebb50

Browse files
committed
fix: [#1589] use average aggregation for UDP processing time metrics
When calculating aggregated values for processing time metrics across multiple servers, we need to use the average (.avg()) instead of sum (.sum()) because the metric samples are already averages per server. Using sum() on pre-averaged values would produce incorrect results, as it would add up the averages rather than computing the true average across all servers. Changes: - Add new *_averaged() methods that use .avg() for proper aggregation - Update services.rs to use the corrected averaging methods - Import Avg trait for metric collection averaging functionality Fixes incorrect metric aggregation for: - udp_avg_connect_processing_time_ns - udp_avg_announce_processing_time_ns - udp_avg_scrape_processing_time_ns"
1 parent ba3d8a9 commit e4ebb50

2 files changed

Lines changed: 46 additions & 3 deletions

File tree

packages/rest-tracker-api-core/src/statistics/services.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ async fn get_protocol_metrics(
7474
let udp_requests_aborted = udp_server_stats.udp_requests_aborted();
7575
let udp_requests_banned = udp_server_stats.udp_requests_banned();
7676
let udp_banned_ips_total = udp_server_stats.udp_banned_ips_total();
77-
let udp_avg_connect_processing_time_ns = udp_server_stats.udp_avg_connect_processing_time_ns();
78-
let udp_avg_announce_processing_time_ns = udp_server_stats.udp_avg_announce_processing_time_ns();
79-
let udp_avg_scrape_processing_time_ns = udp_server_stats.udp_avg_scrape_processing_time_ns();
77+
let udp_avg_connect_processing_time_ns = udp_server_stats.udp_avg_connect_processing_time_ns_averaged();
78+
let udp_avg_announce_processing_time_ns = udp_server_stats.udp_avg_announce_processing_time_ns_averaged();
79+
let udp_avg_scrape_processing_time_ns = udp_server_stats.udp_avg_scrape_processing_time_ns_averaged();
8080

8181
// UDPv4
8282

packages/udp-tracker-server/src/statistics/metrics.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::time::Duration;
33
use serde::Serialize;
44
use torrust_tracker_metrics::label::LabelSet;
55
use torrust_tracker_metrics::metric::MetricName;
6+
use torrust_tracker_metrics::metric_collection::aggregate::avg::Avg;
67
use torrust_tracker_metrics::metric_collection::aggregate::sum::Sum;
78
use torrust_tracker_metrics::metric_collection::{Error, MetricCollection};
89
use torrust_tracker_metrics::metric_name;
@@ -215,6 +216,48 @@ impl Metrics {
215216
.unwrap_or_default() as u64
216217
}
217218

219+
/// Average processing time for UDP connect requests across all servers (in nanoseconds).
220+
/// This calculates the average of all gauge samples for connect requests.
221+
#[must_use]
222+
#[allow(clippy::cast_sign_loss)]
223+
#[allow(clippy::cast_possible_truncation)]
224+
pub fn udp_avg_connect_processing_time_ns_averaged(&self) -> u64 {
225+
self.metric_collection
226+
.avg(
227+
&metric_name!(UDP_TRACKER_SERVER_PERFORMANCE_AVG_PROCESSING_TIME_NS),
228+
&[("request_kind", "connect")].into(),
229+
)
230+
.unwrap_or(0.0) as u64
231+
}
232+
233+
/// Average processing time for UDP announce requests across all servers (in nanoseconds).
234+
/// This calculates the average of all gauge samples for announce requests.
235+
#[must_use]
236+
#[allow(clippy::cast_sign_loss)]
237+
#[allow(clippy::cast_possible_truncation)]
238+
pub fn udp_avg_announce_processing_time_ns_averaged(&self) -> u64 {
239+
self.metric_collection
240+
.avg(
241+
&metric_name!(UDP_TRACKER_SERVER_PERFORMANCE_AVG_PROCESSING_TIME_NS),
242+
&[("request_kind", "announce")].into(),
243+
)
244+
.unwrap_or(0.0) as u64
245+
}
246+
247+
/// Average processing time for UDP scrape requests across all servers (in nanoseconds).
248+
/// This calculates the average of all gauge samples for scrape requests.
249+
#[must_use]
250+
#[allow(clippy::cast_sign_loss)]
251+
#[allow(clippy::cast_possible_truncation)]
252+
pub fn udp_avg_scrape_processing_time_ns_averaged(&self) -> u64 {
253+
self.metric_collection
254+
.avg(
255+
&metric_name!(UDP_TRACKER_SERVER_PERFORMANCE_AVG_PROCESSING_TIME_NS),
256+
&[("request_kind", "scrape")].into(),
257+
)
258+
.unwrap_or(0.0) as u64
259+
}
260+
218261
// UDPv4
219262
/// Total number of UDP (UDP tracker) requests from IPv4 peers.
220263
#[must_use]

0 commit comments

Comments
 (0)