Skip to content

Commit 6c8b8b5

Browse files
committed
Merge #1572: Overhaul stats: Add new metric to the metrics endpoint with the current number of banned IPs
f7b80ed feat: [#1570] add new metric for banned IPs total (Jose Celano) Pull request description: Add a new metric to the `metrics` endpoint with the current number of banned IPs. ACKs for top commit: josecelano: ACK f7b80ed Tree-SHA512: 3b55ac366acc8b2cbe4e3fa136573c22a97187a4ed6adf30af7907bf20fa750552948a432c1f6f755217a77f61b0db8fc4bf9aea10bbb06e0dcd42c7e68fdc0f
2 parents 04de1df + f7b80ed commit 6c8b8b5

File tree

5 files changed

+48
-5
lines changed

5 files changed

+48
-5
lines changed

packages/udp-tracker-server/src/banning/event/handler.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,46 @@ use std::sync::Arc;
22

33
use bittorrent_udp_tracker_core::services::banning::BanService;
44
use tokio::sync::RwLock;
5+
use torrust_tracker_metrics::label::LabelSet;
6+
use torrust_tracker_metrics::metric_name;
57
use torrust_tracker_primitives::DurationSinceUnixEpoch;
68

79
use crate::event::{ErrorKind, Event};
10+
use crate::statistics::repository::Repository;
11+
use crate::statistics::UDP_TRACKER_SERVER_IPS_BANNED_TOTAL;
812

9-
pub async fn handle_event(event: Event, ban_service: &Arc<RwLock<BanService>>, _now: DurationSinceUnixEpoch) {
13+
pub async fn handle_event(
14+
event: Event,
15+
ban_service: &Arc<RwLock<BanService>>,
16+
repository: &Repository,
17+
now: DurationSinceUnixEpoch,
18+
) {
1019
if let Event::UdpError {
1120
context,
1221
kind: _,
1322
error: ErrorKind::ConnectionCookie(_msg),
1423
} = event
1524
{
1625
let mut ban_service = ban_service.write().await;
26+
1727
ban_service.increase_counter(&context.client_socket_addr().ip());
28+
29+
update_metric_for_banned_ips_total(repository, ban_service.get_banned_ips_total(), now).await;
30+
}
31+
}
32+
33+
#[allow(clippy::cast_precision_loss)]
34+
async fn update_metric_for_banned_ips_total(repository: &Repository, ips_banned_total: usize, now: DurationSinceUnixEpoch) {
35+
match repository
36+
.set_gauge(
37+
&metric_name!(UDP_TRACKER_SERVER_IPS_BANNED_TOTAL),
38+
&LabelSet::default(),
39+
ips_banned_total as f64,
40+
now,
41+
)
42+
.await
43+
{
44+
Ok(()) => {}
45+
Err(err) => tracing::error!("Failed to increase the counter: {}", err),
1846
}
1947
}

packages/udp-tracker-server/src/banning/event/listener.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,28 @@ use torrust_tracker_events::receiver::RecvError;
99

1010
use super::handler::handle_event;
1111
use crate::event::receiver::Receiver;
12+
use crate::statistics::repository::Repository;
1213
use crate::CurrentClock;
1314

1415
#[must_use]
15-
pub fn run_event_listener(receiver: Receiver, ban_service: &Arc<RwLock<BanService>>) -> JoinHandle<()> {
16+
pub fn run_event_listener(
17+
receiver: Receiver,
18+
ban_service: &Arc<RwLock<BanService>>,
19+
repository: &Arc<Repository>,
20+
) -> JoinHandle<()> {
1621
let ban_service_clone = ban_service.clone();
22+
let repository_clone = repository.clone();
1723

1824
tracing::info!(target: UDP_TRACKER_LOG_TARGET, "Starting UDP tracker server event listener (banning)");
1925

2026
tokio::spawn(async move {
21-
dispatch_events(receiver, ban_service_clone).await;
27+
dispatch_events(receiver, ban_service_clone, repository_clone).await;
2228

2329
tracing::info!(target: UDP_TRACKER_LOG_TARGET, "UDP tracker server event listener (banning) finished");
2430
})
2531
}
2632

27-
async fn dispatch_events(mut receiver: Receiver, ban_service: Arc<RwLock<BanService>>) {
33+
async fn dispatch_events(mut receiver: Receiver, ban_service: Arc<RwLock<BanService>>, repository: Arc<Repository>) {
2834
let shutdown_signal = tokio::signal::ctrl_c();
2935
tokio::pin!(shutdown_signal);
3036

@@ -39,7 +45,7 @@ async fn dispatch_events(mut receiver: Receiver, ban_service: Arc<RwLock<BanServ
3945

4046
result = receiver.recv() => {
4147
match result {
42-
Ok(event) => handle_event(event, &ban_service, CurrentClock::now()).await,
48+
Ok(event) => handle_event(event, &ban_service, &repository, CurrentClock::now()).await,
4349
Err(e) => {
4450
match e {
4551
RecvError::Closed => {

packages/udp-tracker-server/src/environment.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ impl Environment<Stopped> {
7373
let udp_server_banning_event_listener_job = Some(crate::banning::event::listener::run_event_listener(
7474
self.container.udp_tracker_server_container.event_bus.receiver(),
7575
&self.container.udp_tracker_core_container.ban_service,
76+
&self.container.udp_tracker_server_container.stats_repository,
7677
));
7778

7879
// Start the UDP tracker server

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use torrust_tracker_metrics::unit::Unit;
1010

1111
const UDP_TRACKER_SERVER_REQUESTS_ABORTED_TOTAL: &str = "udp_tracker_server_requests_aborted_total";
1212
const UDP_TRACKER_SERVER_REQUESTS_BANNED_TOTAL: &str = "udp_tracker_server_requests_banned_total";
13+
pub(crate) const UDP_TRACKER_SERVER_IPS_BANNED_TOTAL: &str = "udp_tracker_server_ips_banned_total";
1314
const UDP_TRACKER_SERVER_CONNECTION_ID_ERRORS_TOTAL: &str = "udp_tracker_server_connection_id_errors_total";
1415
const UDP_TRACKER_SERVER_REQUESTS_RECEIVED_TOTAL: &str = "udp_tracker_server_requests_received_total";
1516
const UDP_TRACKER_SERVER_REQUESTS_ACCEPTED_TOTAL: &str = "udp_tracker_server_requests_accepted_total";
@@ -33,6 +34,12 @@ pub fn describe_metrics() -> Metrics {
3334
Some(MetricDescription::new("Total number of UDP requests banned")),
3435
);
3536

37+
metrics.metric_collection.describe_gauge(
38+
&metric_name!(UDP_TRACKER_SERVER_IPS_BANNED_TOTAL),
39+
Some(Unit::Count),
40+
Some(MetricDescription::new("Total number of IPs banned from UDP requests")),
41+
);
42+
3643
metrics.metric_collection.describe_counter(
3744
&metric_name!(UDP_TRACKER_SERVER_CONNECTION_ID_ERRORS_TOTAL),
3845
Some(Unit::Count),

src/bootstrap/jobs/udp_tracker_server.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ pub fn start_banning_event_listener(app_container: &Arc<AppContainer>) -> JoinHa
2323
torrust_udp_tracker_server::banning::event::listener::run_event_listener(
2424
app_container.udp_tracker_server_container.event_bus.receiver(),
2525
&app_container.udp_tracker_core_services.ban_service,
26+
&app_container.udp_tracker_server_container.stats_repository,
2627
)
2728
}

0 commit comments

Comments
 (0)