Skip to content

Commit 8e25d43

Browse files
committedFeb 19, 2024
feat: [torrust#697] add logs to HTTP tracker
Sample logs: ``` 2024-02-19T13:00:12.631712627+00:00 [HTTP TRACKER][INFO] request; method=GET uri=/health_check request_id=24a3f4a2-99e5-4db1-890f-f7196a294c2a 2024-02-19T13:00:12.631765246+00:00 [HTTP TRACKER][INFO] response; latency=0 status=200 OK request_id=24a3f4a2-99e5-4db1-890f-f7196a294c2a ```
1 parent d3344da commit 8e25d43

File tree

3 files changed

+58
-6
lines changed

3 files changed

+58
-6
lines changed
 

‎src/console/ci/e2e/logs_parser.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use serde::{Deserialize, Serialize};
33

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

88
#[derive(Serialize, Deserialize, Debug, Default)]
@@ -22,8 +22,8 @@ impl RunningServices {
2222
/// 2024-01-24T16:36:14.614898789+00:00 [torrust_tracker::bootstrap::logging][INFO] logging initialized.
2323
/// 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
25-
/// 2024-01-24T16:36:14.615694484+00:00 [HTTP Tracker][INFO] Starting on: http://0.0.0.0:7070
26-
/// 2024-01-24T16:36:14.615710534+00:00 [HTTP Tracker][INFO] Started on: http://0.0.0.0:7070
25+
/// 2024-01-24T16:36:14.615694484+00:00 [HTTP TRACKER][INFO] Starting on: http://0.0.0.0:7070
26+
/// 2024-01-24T16:36:14.615710534+00:00 [HTTP TRACKER][INFO] Started on: http://0.0.0.0:7070
2727
/// 2024-01-24T16:36:14.615716574+00:00 [torrust_tracker::bootstrap::jobs][INFO] TLS not enabled
2828
/// 2024-01-24T16:36:14.615764904+00:00 [API][INFO] Starting on http://127.0.0.1:1212
2929
/// 2024-01-24T16:36:14.615767264+00:00 [API][INFO] Started on http://127.0.0.1:1212
@@ -87,7 +87,7 @@ mod tests {
8787
fn it_should_parse_from_logs_with_valid_logs() {
8888
let logs = "\
8989
[UDP Tracker][INFO] Starting on: udp://0.0.0.0:8080\n\
90-
[HTTP Tracker][INFO] Starting on: 0.0.0.0:9090\n\
90+
[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);
9393

‎src/servers/http/server.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ impl Launcher {
5555
let tls = self.tls.clone();
5656
let protocol = if tls.is_some() { "https" } else { "http" };
5757

58-
info!(target: "HTTP Tracker", "Starting on: {protocol}://{}", address);
58+
info!(target: "HTTP TRACKER", "Starting on: {protocol}://{}", address);
5959

6060
let running = Box::pin(async {
6161
match tls {
@@ -72,7 +72,7 @@ impl Launcher {
7272
}
7373
});
7474

75-
info!(target: "HTTP Tracker", "Started on: {protocol}://{}", address);
75+
info!(target: "HTTP TRACKER", "Started on: {protocol}://{}", address);
7676

7777
tx_start
7878
.send(Started { address })

‎src/servers/http/v1/routes.rs

+52
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
//! HTTP server routes for version `v1`.
22
use std::sync::Arc;
3+
use std::time::Duration;
34

5+
use axum::http::{HeaderName, HeaderValue};
6+
use axum::response::Response;
47
use axum::routing::get;
58
use axum::Router;
69
use axum_client_ip::SecureClientIpSource;
10+
use hyper::Request;
711
use tower_http::compression::CompressionLayer;
12+
use tower_http::propagate_header::PropagateHeaderLayer;
13+
use tower_http::request_id::{MakeRequestId, RequestId, SetRequestIdLayer};
14+
use tower_http::trace::{DefaultMakeSpan, TraceLayer};
15+
use tracing::{Level, Span};
16+
use uuid::Uuid;
817

918
use super::handlers::{announce, health_check, scrape};
1019
use crate::core::Tracker;
@@ -27,4 +36,47 @@ pub fn router(tracker: Arc<Tracker>) -> Router {
2736
// Add extension to get the client IP from the connection info
2837
.layer(SecureClientIpSource::ConnectInfo.into_extension())
2938
.layer(CompressionLayer::new())
39+
.layer(SetRequestIdLayer::x_request_id(RequestIdGenerator))
40+
.layer(PropagateHeaderLayer::new(HeaderName::from_static("x-request-id")))
41+
.layer(
42+
TraceLayer::new_for_http()
43+
.make_span_with(DefaultMakeSpan::new().level(Level::INFO))
44+
.on_request(|request: &Request<axum::body::Body>, _span: &Span| {
45+
let method = request.method().to_string();
46+
let uri = request.uri().to_string();
47+
let request_id = request
48+
.headers()
49+
.get("x-request-id")
50+
.map(|v| v.to_str().unwrap_or_default())
51+
.unwrap_or_default();
52+
53+
tracing::span!(
54+
target: "HTTP TRACKER",
55+
tracing::Level::INFO, "request", method = %method, uri = %uri, request_id = %request_id);
56+
})
57+
.on_response(|response: &Response, latency: Duration, _span: &Span| {
58+
let status_code = response.status();
59+
let request_id = response
60+
.headers()
61+
.get("x-request-id")
62+
.map(|v| v.to_str().unwrap_or_default())
63+
.unwrap_or_default();
64+
let latency_ms = latency.as_millis();
65+
66+
tracing::span!(
67+
target: "HTTP TRACKER",
68+
tracing::Level::INFO, "response", latency = %latency_ms, status = %status_code, request_id = %request_id);
69+
}),
70+
)
71+
.layer(SetRequestIdLayer::x_request_id(RequestIdGenerator))
72+
}
73+
74+
#[derive(Clone, Default)]
75+
struct RequestIdGenerator;
76+
77+
impl MakeRequestId for RequestIdGenerator {
78+
fn make_request_id<B>(&mut self, _request: &Request<B>) -> Option<RequestId> {
79+
let id = HeaderValue::from_str(&Uuid::new_v4().to_string()).expect("UUID is a valid HTTP header value");
80+
Some(RequestId::new(id))
81+
}
3082
}

0 commit comments

Comments
 (0)