Skip to content

Commit e6c05b6

Browse files
committed
refactor(udp-tracker-server): [torrust#1589] move average processing time calculation from Repository to Metrics
1 parent 6d96650 commit e6c05b6

File tree

2 files changed

+70
-55
lines changed

2 files changed

+70
-55
lines changed

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

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::time::Duration;
2+
13
use serde::Serialize;
24
use torrust_tracker_metrics::label::LabelSet;
35
use torrust_tracker_metrics::metric::MetricName;
@@ -48,6 +50,71 @@ impl Metrics {
4850
}
4951

5052
impl Metrics {
53+
#[allow(clippy::cast_precision_loss)]
54+
pub fn recalculate_udp_avg_connect_processing_time_ns(&self, req_processing_time: Duration) -> f64 {
55+
let req_processing_time = req_processing_time.as_nanos() as f64;
56+
let udp_connections_handled = (self.udp4_connections_handled() + self.udp6_connections_handled()) as f64;
57+
58+
let previous_avg = self.udp_avg_connect_processing_time_ns();
59+
60+
// Moving average: https://en.wikipedia.org/wiki/Moving_average
61+
let new_avg = previous_avg as f64 + (req_processing_time - previous_avg as f64) / udp_connections_handled;
62+
63+
tracing::debug!(
64+
"Recalculated UDP average connect processing time: {} ns (previous: {} ns, req_processing_time: {} ns, udp_connections_handled: {})",
65+
new_avg,
66+
previous_avg,
67+
req_processing_time,
68+
udp_connections_handled
69+
);
70+
71+
new_avg
72+
}
73+
74+
#[allow(clippy::cast_precision_loss)]
75+
pub fn recalculate_udp_avg_announce_processing_time_ns(&self, req_processing_time: Duration) -> f64 {
76+
let req_processing_time = req_processing_time.as_nanos() as f64;
77+
78+
let udp_announces_handled = (self.udp4_announces_handled() + self.udp6_announces_handled()) as f64;
79+
80+
let previous_avg = self.udp_avg_announce_processing_time_ns();
81+
82+
// Moving average: https://en.wikipedia.org/wiki/Moving_average
83+
let new_avg = previous_avg as f64 + (req_processing_time - previous_avg as f64) / udp_announces_handled;
84+
85+
tracing::debug!(
86+
"Recalculated UDP average announce processing time: {} ns (previous: {} ns, req_processing_time: {} ns, udp_announces_handled: {})",
87+
new_avg,
88+
previous_avg,
89+
req_processing_time,
90+
udp_announces_handled
91+
);
92+
93+
new_avg
94+
}
95+
96+
#[allow(clippy::cast_precision_loss)]
97+
pub fn recalculate_udp_avg_scrape_processing_time_ns(&self, req_processing_time: Duration) -> f64 {
98+
let req_processing_time = req_processing_time.as_nanos() as f64;
99+
100+
let udp_scrapes_handled = (self.udp4_scrapes_handled() + self.udp6_scrapes_handled()) as f64;
101+
102+
let previous_avg = self.udp_avg_scrape_processing_time_ns();
103+
104+
// Moving average: https://en.wikipedia.org/wiki/Moving_average
105+
let new_avg = previous_avg as f64 + (req_processing_time - previous_avg as f64) / udp_scrapes_handled;
106+
107+
tracing::debug!(
108+
"Recalculated UDP average scrape processing time: {} ns (previous: {} ns, req_processing_time: {} ns, udp_scrapes_handled: {})",
109+
new_avg,
110+
previous_avg,
111+
req_processing_time,
112+
udp_scrapes_handled
113+
);
114+
115+
new_avg
116+
}
117+
51118
// UDP
52119
/// Total number of UDP (UDP tracker) requests aborted.
53120
#[must_use]

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

Lines changed: 3 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -73,85 +73,33 @@ impl Repository {
7373
result
7474
}
7575

76-
#[allow(clippy::cast_precision_loss)]
77-
#[allow(clippy::cast_possible_truncation)]
78-
#[allow(clippy::cast_sign_loss)]
7976
pub async fn recalculate_udp_avg_connect_processing_time_ns(&self, req_processing_time: Duration) -> f64 {
8077
let stats_lock = self.stats.write().await;
8178

82-
let req_processing_time = req_processing_time.as_nanos() as f64;
83-
let udp_connections_handled = (stats_lock.udp4_connections_handled() + stats_lock.udp6_connections_handled()) as f64;
84-
85-
let previous_avg = stats_lock.udp_avg_connect_processing_time_ns();
86-
87-
// Moving average: https://en.wikipedia.org/wiki/Moving_average
88-
let new_avg = previous_avg as f64 + (req_processing_time - previous_avg as f64) / udp_connections_handled;
79+
let new_avg = stats_lock.recalculate_udp_avg_connect_processing_time_ns(req_processing_time);
8980

9081
drop(stats_lock);
9182

92-
tracing::debug!(
93-
"Recalculated UDP average connect processing time: {} ns (previous: {} ns, req_processing_time: {} ns, udp_connections_handled: {})",
94-
new_avg,
95-
previous_avg,
96-
req_processing_time,
97-
udp_connections_handled
98-
);
99-
10083
new_avg
10184
}
10285

103-
#[allow(clippy::cast_precision_loss)]
104-
#[allow(clippy::cast_possible_truncation)]
105-
#[allow(clippy::cast_sign_loss)]
10686
pub async fn recalculate_udp_avg_announce_processing_time_ns(&self, req_processing_time: Duration) -> f64 {
10787
let stats_lock = self.stats.write().await;
10888

109-
let req_processing_time = req_processing_time.as_nanos() as f64;
110-
111-
let udp_announces_handled = (stats_lock.udp4_announces_handled() + stats_lock.udp6_announces_handled()) as f64;
112-
113-
let previous_avg = stats_lock.udp_avg_announce_processing_time_ns();
114-
115-
// Moving average: https://en.wikipedia.org/wiki/Moving_average
116-
let new_avg = previous_avg as f64 + (req_processing_time - previous_avg as f64) / udp_announces_handled;
89+
let new_avg = stats_lock.recalculate_udp_avg_announce_processing_time_ns(req_processing_time);
11790

11891
drop(stats_lock);
11992

120-
tracing::debug!(
121-
"Recalculated UDP average announce processing time: {} ns (previous: {} ns, req_processing_time: {} ns, udp_announces_handled: {})",
122-
new_avg,
123-
previous_avg,
124-
req_processing_time,
125-
udp_announces_handled
126-
);
127-
12893
new_avg
12994
}
13095

131-
#[allow(clippy::cast_precision_loss)]
132-
#[allow(clippy::cast_possible_truncation)]
133-
#[allow(clippy::cast_sign_loss)]
13496
pub async fn recalculate_udp_avg_scrape_processing_time_ns(&self, req_processing_time: Duration) -> f64 {
13597
let stats_lock = self.stats.write().await;
13698

137-
let req_processing_time = req_processing_time.as_nanos() as f64;
138-
let udp_scrapes_handled = (stats_lock.udp4_scrapes_handled() + stats_lock.udp6_scrapes_handled()) as f64;
139-
140-
let previous_avg = stats_lock.udp_avg_scrape_processing_time_ns();
141-
142-
// Moving average: https://en.wikipedia.org/wiki/Moving_average
143-
let new_avg = previous_avg as f64 + (req_processing_time - previous_avg as f64) / udp_scrapes_handled;
99+
let new_avg = stats_lock.recalculate_udp_avg_scrape_processing_time_ns(req_processing_time);
144100

145101
drop(stats_lock);
146102

147-
tracing::debug!(
148-
"Recalculated UDP average scrape processing time: {} ns (previous: {} ns, req_processing_time: {} ns, udp_scrapes_handled: {})",
149-
new_avg,
150-
previous_avg,
151-
req_processing_time,
152-
udp_scrapes_handled
153-
);
154-
155103
new_avg
156104
}
157105
}

0 commit comments

Comments
 (0)