Skip to content

Commit 4a2d902

Browse files
committed
feat: [torrust#698] refactor UDP logs
Use `tracing` crate format: ``` 2024-02-19T17:10:05.243973520+00:00 [UDP TRACKER][INFO] request; server_socket_addr=0.0.0.0:6969 action=CONNECT transaction_id=-888840697 request_id=03b92de0-c9f8-4c40-a808-5d706ce770f4 2024-02-19T17:10:05.244016141+00:00 [UDP TRACKER][INFO] response; server_socket_addr=0.0.0.0:6969 transaction_id=-888840697 request_id=03b92de0-c9f8-4c40-a808-5d706ce770f4 2024-02-19T17:10:05.244042841+00:00 [UDP TRACKER][INFO] request; server_socket_addr=0.0.0.0:6969 action=ANNOUNCE transaction_id=-888840697 request_id=2113eb8c-61f4-476b-b3d5-02892f0a2fdb connection_id=-7190270103145546231 info_hash=9c38422213e30bff212b30c360d26f9a02136422 2024-02-19T17:10:05.244052082+00:00 [UDP TRACKER][INFO] response; server_socket_addr=0.0.0.0:6969 transaction_id=-888840697 request_id=2113eb8c-61f4-476b-b3d5-02892f0a2fdb ```
1 parent af2e0f9 commit 4a2d902

File tree

6 files changed

+134
-27
lines changed

6 files changed

+134
-27
lines changed

src/bootstrap/jobs/udp_tracker.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ pub async fn start_job(config: &UdpTracker, tracker: Arc<core::Tracker>, form: S
3838
.expect("it should be able to start the udp tracker");
3939

4040
tokio::spawn(async move {
41-
debug!(target: "UDP Tracker", "Wait for launcher (UDP service) to finish ...");
42-
debug!(target: "UDP Tracker", "Is halt channel closed before waiting?: {}", server.state.halt_task.is_closed());
41+
debug!(target: "UDP TRACKER", "Wait for launcher (UDP service) to finish ...");
42+
debug!(target: "UDP TRACKER", "Is halt channel closed before waiting?: {}", server.state.halt_task.is_closed());
4343

4444
assert!(
4545
!server.state.halt_task.is_closed(),
@@ -52,6 +52,6 @@ pub async fn start_job(config: &UdpTracker, tracker: Arc<core::Tracker>, form: S
5252
.await
5353
.expect("it should be able to join to the udp tracker task");
5454

55-
debug!(target: "UDP Tracker", "Is halt channel closed after finishing the server?: {}", server.state.halt_task.is_closed());
55+
debug!(target: "UDP TRACKER", "Is halt channel closed after finishing the server?: {}", server.state.halt_task.is_closed());
5656
})
5757
}

src/console/ci/e2e/logs_parser.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Utilities to parse Torrust Tracker logs.
22
use serde::{Deserialize, Serialize};
33

4-
const UDP_TRACKER_PATTERN: &str = "[UDP Tracker][INFO] Starting on: udp://";
4+
const UDP_TRACKER_PATTERN: &str = "[UDP TRACKER][INFO] Starting on: udp://";
55
const HTTP_TRACKER_PATTERN: &str = "[HTTP TRACKER][INFO] Starting on: ";
66
const HEALTH_CHECK_PATTERN: &str = "[HEALTH CHECK API][INFO] Starting on: ";
77

@@ -20,7 +20,7 @@ impl RunningServices {
2020
/// ```text
2121
/// Loading default configuration file: `./share/default/config/tracker.development.sqlite3.toml` ...
2222
/// 2024-01-24T16:36:14.614898789+00:00 [torrust_tracker::bootstrap::logging][INFO] logging initialized.
23-
/// 2024-01-24T16:36:14.615586025+00:00 [UDP Tracker][INFO] Starting on: udp://0.0.0.0:6969
23+
/// 2024-01-24T16:36:14.615586025+00:00 [UDP TRACKER][INFO] Starting on: udp://0.0.0.0:6969
2424
/// 2024-01-24T16:36:14.615623705+00:00 [torrust_tracker::bootstrap::jobs][INFO] TLS not enabled
2525
/// 2024-01-24T16:36:14.615694484+00:00 [HTTP TRACKER][INFO] Starting on: http://0.0.0.0:7070
2626
/// 2024-01-24T16:36:14.615710534+00:00 [HTTP TRACKER][INFO] Started on: http://0.0.0.0:7070
@@ -86,7 +86,7 @@ mod tests {
8686
#[test]
8787
fn it_should_parse_from_logs_with_valid_logs() {
8888
let logs = "\
89-
[UDP Tracker][INFO] Starting on: udp://0.0.0.0:8080\n\
89+
[UDP TRACKER][INFO] Starting on: udp://0.0.0.0:8080\n\
9090
[HTTP TRACKER][INFO] Starting on: 0.0.0.0:9090\n\
9191
[HEALTH CHECK API][INFO] Starting on: 0.0.0.0:10010";
9292
let running_services = RunningServices::parse_from_logs(logs);

src/servers/udp/handlers.rs

+48-15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
//! Handlers for the UDP server.
2+
use std::fmt;
23
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
34
use std::panic::Location;
45
use std::sync::Arc;
@@ -7,13 +8,16 @@ use aquatic_udp_protocol::{
78
AnnounceInterval, AnnounceRequest, AnnounceResponse, ConnectRequest, ConnectResponse, ErrorResponse, NumberOfDownloads,
89
NumberOfPeers, Port, Request, Response, ResponsePeer, ScrapeRequest, ScrapeResponse, TorrentScrapeStatistics, TransactionId,
910
};
10-
use log::{debug, info};
11+
use log::debug;
12+
use tokio::net::UdpSocket;
1113
use torrust_tracker_located_error::DynError;
14+
use uuid::Uuid;
1215

1316
use super::connection_cookie::{check, from_connection_id, into_connection_id, make};
1417
use super::UdpRequest;
1518
use crate::core::{statistics, ScrapeData, Tracker};
1619
use crate::servers::udp::error::Error;
20+
use crate::servers::udp::logging::{log_bad_request, log_error_response, log_request, log_response};
1721
use crate::servers::udp::peer_builder;
1822
use crate::servers::udp::request::AnnounceWrapper;
1923
use crate::shared::bit_torrent::common::MAX_SCRAPE_TORRENTS;
@@ -28,33 +32,50 @@ use crate::shared::bit_torrent::info_hash::InfoHash;
2832
/// type.
2933
///
3034
/// It will return an `Error` response if the request is invalid.
31-
pub(crate) async fn handle_packet(udp_request: UdpRequest, tracker: &Arc<Tracker>) -> Response {
35+
pub(crate) async fn handle_packet(udp_request: UdpRequest, tracker: &Arc<Tracker>, socket: Arc<UdpSocket>) -> Response {
3236
debug!("Handling Packets: {udp_request:?}");
37+
38+
let request_id = RequestId::make(&udp_request);
39+
let server_socket_addr = socket.local_addr().expect("Could not get local_addr for socket.");
40+
3341
match Request::from_bytes(&udp_request.payload[..udp_request.payload.len()], MAX_SCRAPE_TORRENTS).map_err(|e| {
3442
Error::InternalServer {
3543
message: format!("{e:?}"),
3644
location: Location::caller(),
3745
}
3846
}) {
3947
Ok(request) => {
48+
log_request(&request, &request_id, &server_socket_addr);
49+
4050
let transaction_id = match &request {
4151
Request::Connect(connect_request) => connect_request.transaction_id,
4252
Request::Announce(announce_request) => announce_request.transaction_id,
4353
Request::Scrape(scrape_request) => scrape_request.transaction_id,
4454
};
4555

46-
match handle_request(request, udp_request.from, tracker).await {
56+
let response = match handle_request(request, udp_request.from, tracker).await {
4757
Ok(response) => response,
4858
Err(e) => handle_error(&e, transaction_id),
49-
}
59+
};
60+
61+
log_response(&response, &transaction_id, &request_id, &server_socket_addr);
62+
63+
response
64+
}
65+
Err(e) => {
66+
log_bad_request(&request_id);
67+
68+
let response = handle_error(
69+
&Error::BadRequest {
70+
source: (Arc::new(e) as DynError).into(),
71+
},
72+
TransactionId(0),
73+
);
74+
75+
log_error_response(&request_id);
76+
77+
response
5078
}
51-
// bad request
52-
Err(e) => handle_error(
53-
&Error::BadRequest {
54-
source: (Arc::new(e) as DynError).into(),
55-
},
56-
TransactionId(0),
57-
),
5879
}
5980
}
6081

@@ -80,7 +101,6 @@ pub async fn handle_request(request: Request, remote_addr: SocketAddr, tracker:
80101
///
81102
/// This function does not ever return an error.
82103
pub async fn handle_connect(remote_addr: SocketAddr, request: &ConnectRequest, tracker: &Tracker) -> Result<Response, Error> {
83-
info!(target: "UDP", "\"CONNECT TxID {}\"", request.transaction_id.0);
84104
debug!("udp connect request: {:#?}", request);
85105

86106
let connection_cookie = make(&remote_addr);
@@ -138,8 +158,6 @@ pub async fn handle_announce(
138158
source: (Arc::new(e) as Arc<dyn std::error::Error + Send + Sync>).into(),
139159
})?;
140160

141-
info!(target: "UDP", "\"ANNOUNCE TxID {} IH {}\"", announce_request.transaction_id.0, info_hash.to_hex_string());
142-
143161
let mut peer = peer_builder::from_request(&wrapped_announce_request, &remote_client_ip);
144162

145163
let response = tracker.announce(&info_hash, &mut peer, &remote_client_ip).await;
@@ -214,7 +232,6 @@ pub async fn handle_announce(
214232
///
215233
/// This function does not ever return an error.
216234
pub async fn handle_scrape(remote_addr: SocketAddr, request: &ScrapeRequest, tracker: &Tracker) -> Result<Response, Error> {
217-
info!(target: "UDP", "\"SCRAPE TxID {}\"", request.transaction_id.0);
218235
debug!("udp scrape request: {:#?}", request);
219236

220237
// Convert from aquatic infohashes
@@ -274,6 +291,22 @@ fn handle_error(e: &Error, transaction_id: TransactionId) -> Response {
274291
})
275292
}
276293

294+
/// An identifier for a request.
295+
#[derive(Debug, Clone)]
296+
pub struct RequestId(Uuid);
297+
298+
impl RequestId {
299+
fn make(_request: &UdpRequest) -> RequestId {
300+
RequestId(Uuid::new_v4())
301+
}
302+
}
303+
304+
impl fmt::Display for RequestId {
305+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
306+
write!(f, "{}", self.0)
307+
}
308+
}
309+
277310
#[cfg(test)]
278311
mod tests {
279312

src/servers/udp/logging.rs

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
//! Logging for UDP Tracker requests and responses.
2+
3+
use std::net::SocketAddr;
4+
5+
use aquatic_udp_protocol::{Request, Response, TransactionId};
6+
7+
use super::handlers::RequestId;
8+
use crate::shared::bit_torrent::info_hash::InfoHash;
9+
10+
pub fn log_request(request: &Request, request_id: &RequestId, server_socket_addr: &SocketAddr) {
11+
let action = map_action_name(request);
12+
13+
match &request {
14+
Request::Connect(connect_request) => {
15+
let transaction_id = connect_request.transaction_id;
16+
let transaction_id_str = transaction_id.0.to_string();
17+
18+
tracing::span!(
19+
target: "UDP TRACKER",
20+
tracing::Level::INFO, "request", server_socket_addr = %server_socket_addr, action = %action, transaction_id = %transaction_id_str, request_id = %request_id);
21+
}
22+
Request::Announce(announce_request) => {
23+
let transaction_id = announce_request.transaction_id;
24+
let transaction_id_str = transaction_id.0.to_string();
25+
let connection_id_str = announce_request.connection_id.0.to_string();
26+
let info_hash_str = InfoHash::from_bytes(&announce_request.info_hash.0).to_hex_string();
27+
28+
tracing::span!(
29+
target: "UDP TRACKER",
30+
tracing::Level::INFO, "request", server_socket_addr = %server_socket_addr, action = %action, transaction_id = %transaction_id_str, request_id = %request_id, connection_id = %connection_id_str, info_hash = %info_hash_str);
31+
}
32+
Request::Scrape(scrape_request) => {
33+
let transaction_id = scrape_request.transaction_id;
34+
let transaction_id_str = transaction_id.0.to_string();
35+
let connection_id_str = scrape_request.connection_id.0.to_string();
36+
37+
tracing::span!(
38+
target: "UDP TRACKER",
39+
tracing::Level::INFO, "request", server_socket_addr = %server_socket_addr, action = %action, transaction_id = %transaction_id_str, request_id = %request_id, connection_id = %connection_id_str);
40+
}
41+
};
42+
}
43+
44+
fn map_action_name(udp_request: &Request) -> String {
45+
match udp_request {
46+
Request::Connect(_connect_request) => "CONNECT".to_owned(),
47+
Request::Announce(_announce_request) => "ANNOUNCE".to_owned(),
48+
Request::Scrape(_scrape_request) => "SCRAPE".to_owned(),
49+
}
50+
}
51+
52+
pub fn log_response(
53+
_response: &Response,
54+
transaction_id: &TransactionId,
55+
request_id: &RequestId,
56+
server_socket_addr: &SocketAddr,
57+
) {
58+
tracing::span!(
59+
target: "UDP TRACKER",
60+
tracing::Level::INFO, "response", server_socket_addr = %server_socket_addr, transaction_id = %transaction_id.0.to_string(), request_id = %request_id);
61+
}
62+
63+
pub fn log_bad_request(request_id: &RequestId) {
64+
tracing::span!(
65+
target: "UDP TRACKER",
66+
tracing::Level::INFO, "bad request", request_id = %request_id);
67+
}
68+
69+
pub fn log_error_response(request_id: &RequestId) {
70+
tracing::span!(
71+
target: "UDP TRACKER",
72+
tracing::Level::INFO, "response", request_id = %request_id);
73+
}

src/servers/udp/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,7 @@ use std::net::SocketAddr;
644644
pub mod connection_cookie;
645645
pub mod error;
646646
pub mod handlers;
647+
pub mod logging;
647648
pub mod peer_builder;
648649
pub mod request;
649650
pub mod server;

src/servers/udp/server.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -247,10 +247,10 @@ impl Udp {
247247
let address = socket.local_addr().expect("Could not get local_addr from {binding}.");
248248
let halt = shutdown_signal_with_message(rx_halt, format!("Halting Http Service Bound to Socket: {address}"));
249249

250-
info!(target: "UDP Tracker", "Starting on: udp://{}", address);
250+
info!(target: "UDP TRACKER", "Starting on: udp://{}", address);
251251

252252
let running = tokio::task::spawn(async move {
253-
debug!(target: "UDP Tracker", "Started: Waiting for packets on socket address: udp://{address} ...");
253+
debug!(target: "UDP TRACKER", "Started: Waiting for packets on socket address: udp://{address} ...");
254254

255255
let tracker = tracker.clone();
256256
let socket = socket.clone();
@@ -275,13 +275,13 @@ impl Udp {
275275
.send(Started { address })
276276
.expect("the UDP Tracker service should not be dropped");
277277

278-
debug!(target: "UDP Tracker", "Started on: udp://{}", address);
278+
debug!(target: "UDP TRACKER", "Started on: udp://{}", address);
279279

280280
let stop = running.abort_handle();
281281

282282
select! {
283-
_ = running => { debug!(target: "UDP Tracker", "Socket listener stopped on address: udp://{address}"); },
284-
() = halt => { debug!(target: "UDP Tracker", "Halt signal spawned task stopped on address: udp://{address}"); }
283+
_ = running => { debug!(target: "UDP TRACKER", "Socket listener stopped on address: udp://{address}"); },
284+
() = halt => { debug!(target: "UDP TRACKER", "Halt signal spawned task stopped on address: udp://{address}"); }
285285
}
286286
stop.abort();
287287

@@ -327,7 +327,7 @@ impl Udp {
327327
async fn make_response(tracker: Arc<Tracker>, socket: Arc<UdpSocket>, udp_request: UdpRequest) {
328328
trace!("Making Response to {udp_request:?}");
329329
let from = udp_request.from;
330-
let response = handlers::handle_packet(udp_request, &tracker.clone()).await;
330+
let response = handlers::handle_packet(udp_request, &tracker.clone(), socket.clone()).await;
331331
Self::send_response(&socket.clone(), from, response).await;
332332
}
333333

0 commit comments

Comments
 (0)