Skip to content

Commit a7e20df

Browse files
committed
Merge #1130: Add more metrics to the UDP tracker stats
6ca82e9 feat: [#1128] add new metric UDP total requests aborted (Jose Celano) 9499fd8 feat: [#1128] add new metric UDP total responses (Jose Celano) 286fe02 feat: [#1128] add new metric UDP total requests (Jose Celano) Pull request description: Add more metrics to the UDP tracker stats. The new values are: - `udp4_requests`: total number of requests received from IPv4 clients. - `udp6_requests`: total number of requests received from IPv6 clients. - `udp4_responses`: total number of responses sent to IPv4 clients. - `udp6_responses`: total number of responses sent to IPv6 clients. - `udp_requests_aborted`: total number of requests aborted to make room in the active requests buffer. ### Notes - Responses sent might differ from requests received because of aborted requests. - When we [merge the IP ban service](#1124), we can add a new metric for the total number of IPs banned. - I want to add these new metrics to the [live demo Grafana dashboard](torrust/torrust-demo#20). ### Subtasks - [x] `udp4_requests` - [x] `udp6_requests` - [x] `udp4_responses` - [x] `udp6_responses` - [x] `udp_requests_aborted` - [x] Benchmarking to check how it affects performance before merging it. ACKs for top commit: josecelano: ACK 6ca82e9 Tree-SHA512: 7fbf75b264b191f5c58fcecde8d5e783bbe54ee1c1799acdddc04a9ef64b7196d8b95d1bcad420b1df269bc7929e44417a1d164c6953b00804b0d1e5f0b36e7d
2 parents 20639e8 + 6ca82e9 commit a7e20df

File tree

8 files changed

+177
-23
lines changed

8 files changed

+177
-23
lines changed

src/core/services/statistics/mod.rs

+7
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,26 @@ pub async fn get_metrics(tracker: Arc<Tracker>) -> TrackerMetrics {
6767
TrackerMetrics {
6868
torrents_metrics,
6969
protocol_metrics: Metrics {
70+
// TCP
7071
tcp4_connections_handled: stats.tcp4_connections_handled,
7172
tcp4_announces_handled: stats.tcp4_announces_handled,
7273
tcp4_scrapes_handled: stats.tcp4_scrapes_handled,
7374
tcp6_connections_handled: stats.tcp6_connections_handled,
7475
tcp6_announces_handled: stats.tcp6_announces_handled,
7576
tcp6_scrapes_handled: stats.tcp6_scrapes_handled,
77+
// UDP
78+
udp_requests_aborted: stats.udp_requests_aborted,
79+
udp4_requests: stats.udp4_requests,
7680
udp4_connections_handled: stats.udp4_connections_handled,
7781
udp4_announces_handled: stats.udp4_announces_handled,
7882
udp4_scrapes_handled: stats.udp4_scrapes_handled,
83+
udp4_responses: stats.udp4_responses,
7984
udp4_errors_handled: stats.udp4_errors_handled,
85+
udp6_requests: stats.udp6_requests,
8086
udp6_connections_handled: stats.udp6_connections_handled,
8187
udp6_announces_handled: stats.udp6_announces_handled,
8288
udp6_scrapes_handled: stats.udp6_scrapes_handled,
89+
udp6_responses: stats.udp6_responses,
8390
udp6_errors_handled: stats.udp6_errors_handled,
8491
},
8592
}

src/core/statistics.rs

+66
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,18 @@ pub enum Event {
4444
Tcp4Scrape,
4545
Tcp6Announce,
4646
Tcp6Scrape,
47+
Udp4RequestAborted,
48+
Udp4Request,
4749
Udp4Connect,
4850
Udp4Announce,
4951
Udp4Scrape,
52+
Udp4Response,
5053
Udp4Error,
54+
Udp6Request,
5155
Udp6Connect,
5256
Udp6Announce,
5357
Udp6Scrape,
58+
Udp6Response,
5459
Udp6Error,
5560
}
5661

@@ -72,26 +77,40 @@ pub struct Metrics {
7277
pub tcp4_announces_handled: u64,
7378
/// Total number of TCP (HTTP tracker) `scrape` requests from IPv4 peers.
7479
pub tcp4_scrapes_handled: u64,
80+
7581
/// Total number of TCP (HTTP tracker) connections from IPv6 peers.
7682
pub tcp6_connections_handled: u64,
7783
/// Total number of TCP (HTTP tracker) `announce` requests from IPv6 peers.
7884
pub tcp6_announces_handled: u64,
7985
/// Total number of TCP (HTTP tracker) `scrape` requests from IPv6 peers.
8086
pub tcp6_scrapes_handled: u64,
87+
88+
/// Total number of UDP (UDP tracker) requests aborted.
89+
pub udp_requests_aborted: u64,
90+
91+
/// Total number of UDP (UDP tracker) requests from IPv4 peers.
92+
pub udp4_requests: u64,
8193
/// Total number of UDP (UDP tracker) connections from IPv4 peers.
8294
pub udp4_connections_handled: u64,
8395
/// Total number of UDP (UDP tracker) `announce` requests from IPv4 peers.
8496
pub udp4_announces_handled: u64,
8597
/// Total number of UDP (UDP tracker) `scrape` requests from IPv4 peers.
8698
pub udp4_scrapes_handled: u64,
99+
/// Total number of UDP (UDP tracker) responses from IPv4 peers.
100+
pub udp4_responses: u64,
87101
/// Total number of UDP (UDP tracker) `error` requests from IPv4 peers.
88102
pub udp4_errors_handled: u64,
103+
104+
/// Total number of UDP (UDP tracker) requests from IPv6 peers.
105+
pub udp6_requests: u64,
89106
/// Total number of UDP (UDP tracker) `connection` requests from IPv6 peers.
90107
pub udp6_connections_handled: u64,
91108
/// Total number of UDP (UDP tracker) `announce` requests from IPv6 peers.
92109
pub udp6_announces_handled: u64,
93110
/// Total number of UDP (UDP tracker) `scrape` requests from IPv6 peers.
94111
pub udp6_scrapes_handled: u64,
112+
/// Total number of UDP (UDP tracker) responses from IPv6 peers.
113+
pub udp6_responses: u64,
95114
/// Total number of UDP (UDP tracker) `error` requests from IPv6 peers.
96115
pub udp6_errors_handled: u64,
97116
}
@@ -164,7 +183,15 @@ async fn event_handler(event: Event, stats_repository: &Repo) {
164183
stats_repository.increase_tcp6_connections().await;
165184
}
166185

186+
// UDP
187+
Event::Udp4RequestAborted => {
188+
stats_repository.increase_udp_requests_aborted().await;
189+
}
190+
167191
// UDP4
192+
Event::Udp4Request => {
193+
stats_repository.increase_udp4_requests().await;
194+
}
168195
Event::Udp4Connect => {
169196
stats_repository.increase_udp4_connections().await;
170197
}
@@ -174,11 +201,17 @@ async fn event_handler(event: Event, stats_repository: &Repo) {
174201
Event::Udp4Scrape => {
175202
stats_repository.increase_udp4_scrapes().await;
176203
}
204+
Event::Udp4Response => {
205+
stats_repository.increase_udp4_responses().await;
206+
}
177207
Event::Udp4Error => {
178208
stats_repository.increase_udp4_errors().await;
179209
}
180210

181211
// UDP6
212+
Event::Udp6Request => {
213+
stats_repository.increase_udp6_requests().await;
214+
}
182215
Event::Udp6Connect => {
183216
stats_repository.increase_udp6_connections().await;
184217
}
@@ -188,6 +221,9 @@ async fn event_handler(event: Event, stats_repository: &Repo) {
188221
Event::Udp6Scrape => {
189222
stats_repository.increase_udp6_scrapes().await;
190223
}
224+
Event::Udp6Response => {
225+
stats_repository.increase_udp6_responses().await;
226+
}
191227
Event::Udp6Error => {
192228
stats_repository.increase_udp6_errors().await;
193229
}
@@ -276,6 +312,18 @@ impl Repo {
276312
drop(stats_lock);
277313
}
278314

315+
pub async fn increase_udp_requests_aborted(&self) {
316+
let mut stats_lock = self.stats.write().await;
317+
stats_lock.udp_requests_aborted += 1;
318+
drop(stats_lock);
319+
}
320+
321+
pub async fn increase_udp4_requests(&self) {
322+
let mut stats_lock = self.stats.write().await;
323+
stats_lock.udp4_requests += 1;
324+
drop(stats_lock);
325+
}
326+
279327
pub async fn increase_udp4_connections(&self) {
280328
let mut stats_lock = self.stats.write().await;
281329
stats_lock.udp4_connections_handled += 1;
@@ -294,12 +342,24 @@ impl Repo {
294342
drop(stats_lock);
295343
}
296344

345+
pub async fn increase_udp4_responses(&self) {
346+
let mut stats_lock = self.stats.write().await;
347+
stats_lock.udp4_responses += 1;
348+
drop(stats_lock);
349+
}
350+
297351
pub async fn increase_udp4_errors(&self) {
298352
let mut stats_lock = self.stats.write().await;
299353
stats_lock.udp4_errors_handled += 1;
300354
drop(stats_lock);
301355
}
302356

357+
pub async fn increase_udp6_requests(&self) {
358+
let mut stats_lock = self.stats.write().await;
359+
stats_lock.udp6_requests += 1;
360+
drop(stats_lock);
361+
}
362+
303363
pub async fn increase_udp6_connections(&self) {
304364
let mut stats_lock = self.stats.write().await;
305365
stats_lock.udp6_connections_handled += 1;
@@ -318,6 +378,12 @@ impl Repo {
318378
drop(stats_lock);
319379
}
320380

381+
pub async fn increase_udp6_responses(&self) {
382+
let mut stats_lock = self.stats.write().await;
383+
stats_lock.udp6_responses += 1;
384+
drop(stats_lock);
385+
}
386+
321387
pub async fn increase_udp6_errors(&self) {
322388
let mut stats_lock = self.stats.write().await;
323389
stats_lock.udp6_errors_handled += 1;

src/servers/apis/v1/context/stats/resources.rs

+51-16
Original file line numberDiff line numberDiff line change
@@ -26,26 +26,40 @@ pub struct Stats {
2626
pub tcp4_announces_handled: u64,
2727
/// Total number of TCP (HTTP tracker) `scrape` requests from IPv4 peers.
2828
pub tcp4_scrapes_handled: u64,
29+
2930
/// Total number of TCP (HTTP tracker) connections from IPv6 peers.
3031
pub tcp6_connections_handled: u64,
3132
/// Total number of TCP (HTTP tracker) `announce` requests from IPv6 peers.
3233
pub tcp6_announces_handled: u64,
3334
/// Total number of TCP (HTTP tracker) `scrape` requests from IPv6 peers.
3435
pub tcp6_scrapes_handled: u64,
36+
37+
/// Total number of UDP (UDP tracker) requests aborted.
38+
pub udp_requests_aborted: u64,
39+
40+
/// Total number of UDP (UDP tracker) requests from IPv4 peers.
41+
pub udp4_requests: u64,
3542
/// Total number of UDP (UDP tracker) connections from IPv4 peers.
3643
pub udp4_connections_handled: u64,
3744
/// Total number of UDP (UDP tracker) `announce` requests from IPv4 peers.
3845
pub udp4_announces_handled: u64,
3946
/// Total number of UDP (UDP tracker) `scrape` requests from IPv4 peers.
4047
pub udp4_scrapes_handled: u64,
48+
/// Total number of UDP (UDP tracker) responses from IPv4 peers.
49+
pub udp4_responses: u64,
4150
/// Total number of UDP (UDP tracker) `scrape` requests from IPv4 peers.
4251
pub udp4_errors_handled: u64,
52+
53+
/// Total number of UDP (UDP tracker) requests from IPv6 peers.
54+
pub udp6_requests: u64,
4355
/// Total number of UDP (UDP tracker) `connection` requests from IPv6 peers.
4456
pub udp6_connections_handled: u64,
4557
/// Total number of UDP (UDP tracker) `announce` requests from IPv6 peers.
4658
pub udp6_announces_handled: u64,
4759
/// Total number of UDP (UDP tracker) `scrape` requests from IPv6 peers.
4860
pub udp6_scrapes_handled: u64,
61+
/// Total number of UDP (UDP tracker) responses from IPv6 peers.
62+
pub udp6_responses: u64,
4963
/// Total number of UDP (UDP tracker) `scrape` requests from IPv6 peers.
5064
pub udp6_errors_handled: u64,
5165
}
@@ -57,19 +71,26 @@ impl From<TrackerMetrics> for Stats {
5771
seeders: metrics.torrents_metrics.complete,
5872
completed: metrics.torrents_metrics.downloaded,
5973
leechers: metrics.torrents_metrics.incomplete,
74+
// TCP
6075
tcp4_connections_handled: metrics.protocol_metrics.tcp4_connections_handled,
6176
tcp4_announces_handled: metrics.protocol_metrics.tcp4_announces_handled,
6277
tcp4_scrapes_handled: metrics.protocol_metrics.tcp4_scrapes_handled,
6378
tcp6_connections_handled: metrics.protocol_metrics.tcp6_connections_handled,
6479
tcp6_announces_handled: metrics.protocol_metrics.tcp6_announces_handled,
6580
tcp6_scrapes_handled: metrics.protocol_metrics.tcp6_scrapes_handled,
81+
// UDP
82+
udp_requests_aborted: metrics.protocol_metrics.udp_requests_aborted,
83+
udp4_requests: metrics.protocol_metrics.udp4_requests,
6684
udp4_connections_handled: metrics.protocol_metrics.udp4_connections_handled,
6785
udp4_announces_handled: metrics.protocol_metrics.udp4_announces_handled,
6886
udp4_scrapes_handled: metrics.protocol_metrics.udp4_scrapes_handled,
87+
udp4_responses: metrics.protocol_metrics.udp4_responses,
6988
udp4_errors_handled: metrics.protocol_metrics.udp4_errors_handled,
89+
udp6_requests: metrics.protocol_metrics.udp6_requests,
7090
udp6_connections_handled: metrics.protocol_metrics.udp6_connections_handled,
7191
udp6_announces_handled: metrics.protocol_metrics.udp6_announces_handled,
7292
udp6_scrapes_handled: metrics.protocol_metrics.udp6_scrapes_handled,
93+
udp6_responses: metrics.protocol_metrics.udp6_responses,
7394
udp6_errors_handled: metrics.protocol_metrics.udp6_errors_handled,
7495
}
7596
}
@@ -94,41 +115,55 @@ mod tests {
94115
torrents: 4
95116
},
96117
protocol_metrics: Metrics {
118+
// TCP
97119
tcp4_connections_handled: 5,
98120
tcp4_announces_handled: 6,
99121
tcp4_scrapes_handled: 7,
100122
tcp6_connections_handled: 8,
101123
tcp6_announces_handled: 9,
102124
tcp6_scrapes_handled: 10,
103-
udp4_connections_handled: 11,
104-
udp4_announces_handled: 12,
105-
udp4_scrapes_handled: 13,
106-
udp4_errors_handled: 14,
107-
udp6_connections_handled: 15,
108-
udp6_announces_handled: 16,
109-
udp6_scrapes_handled: 17,
110-
udp6_errors_handled: 18
125+
// UDP
126+
udp_requests_aborted: 11,
127+
udp4_requests: 12,
128+
udp4_connections_handled: 13,
129+
udp4_announces_handled: 14,
130+
udp4_scrapes_handled: 15,
131+
udp4_responses: 16,
132+
udp4_errors_handled: 17,
133+
udp6_requests: 18,
134+
udp6_connections_handled: 19,
135+
udp6_announces_handled: 20,
136+
udp6_scrapes_handled: 21,
137+
udp6_responses: 22,
138+
udp6_errors_handled: 23
111139
}
112140
}),
113141
Stats {
114142
torrents: 4,
115143
seeders: 1,
116144
completed: 2,
117145
leechers: 3,
146+
// TCP
118147
tcp4_connections_handled: 5,
119148
tcp4_announces_handled: 6,
120149
tcp4_scrapes_handled: 7,
121150
tcp6_connections_handled: 8,
122151
tcp6_announces_handled: 9,
123152
tcp6_scrapes_handled: 10,
124-
udp4_connections_handled: 11,
125-
udp4_announces_handled: 12,
126-
udp4_scrapes_handled: 13,
127-
udp4_errors_handled: 14,
128-
udp6_connections_handled: 15,
129-
udp6_announces_handled: 16,
130-
udp6_scrapes_handled: 17,
131-
udp6_errors_handled: 18
153+
// UDP
154+
udp_requests_aborted: 11,
155+
udp4_requests: 12,
156+
udp4_connections_handled: 13,
157+
udp4_announces_handled: 14,
158+
udp4_scrapes_handled: 15,
159+
udp4_responses: 16,
160+
udp4_errors_handled: 17,
161+
udp6_requests: 18,
162+
udp6_connections_handled: 19,
163+
udp6_announces_handled: 20,
164+
udp6_scrapes_handled: 21,
165+
udp6_responses: 22,
166+
udp6_errors_handled: 23
132167
}
133168
);
134169
}

src/servers/apis/v1/context/stats/responses.rs

+9
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ pub fn metrics_response(tracker_metrics: &TrackerMetrics) -> Response {
4747
tracker_metrics.protocol_metrics.tcp6_scrapes_handled
4848
));
4949

50+
lines.push(format!(
51+
"udp_requests_aborted {}",
52+
tracker_metrics.protocol_metrics.udp_requests_aborted
53+
));
54+
55+
lines.push(format!("udp4_requests {}", tracker_metrics.protocol_metrics.udp4_requests));
5056
lines.push(format!(
5157
"udp4_connections_handled {}",
5258
tracker_metrics.protocol_metrics.udp4_connections_handled
@@ -59,11 +65,13 @@ pub fn metrics_response(tracker_metrics: &TrackerMetrics) -> Response {
5965
"udp4_scrapes_handled {}",
6066
tracker_metrics.protocol_metrics.udp4_scrapes_handled
6167
));
68+
lines.push(format!("udp4_responses {}", tracker_metrics.protocol_metrics.udp4_responses));
6269
lines.push(format!(
6370
"udp4_errors_handled {}",
6471
tracker_metrics.protocol_metrics.udp4_errors_handled
6572
));
6673

74+
lines.push(format!("udp6_requests {}", tracker_metrics.protocol_metrics.udp6_requests));
6775
lines.push(format!(
6876
"udp6_connections_handled {}",
6977
tracker_metrics.protocol_metrics.udp6_connections_handled
@@ -76,6 +84,7 @@ pub fn metrics_response(tracker_metrics: &TrackerMetrics) -> Response {
7684
"udp6_scrapes_handled {}",
7785
tracker_metrics.protocol_metrics.udp6_scrapes_handled
7886
));
87+
lines.push(format!("udp6_responses {}", tracker_metrics.protocol_metrics.udp6_responses));
7988
lines.push(format!(
8089
"udp6_errors_handled {}",
8190
tracker_metrics.protocol_metrics.udp6_errors_handled

0 commit comments

Comments
 (0)