Skip to content

Commit db71f2a

Browse files
committed
Merge #699: Tracker API: log request and responses
5ccdf10 fix: build errors `imported redundantly` (Jose Celano) 32727ca feat: [#696] API, log request and responses (Jose Celano) 945e91f chore: [#696] add cargo dependencies for logging (Jose Celano) Pull request description: Tracker API: log request and responses. Log example: ``` 2024-02-19T10:26:32.338162254+00:00 [API][INFO] request; method=GET uri=/api/v1/stats?token=MyAccessToken request_id=e3d2d819-fb36-4e56-89e5-64deae95f372 2024-02-19T10:26:32.338218836+00:00 [API][INFO] response; latency=0 status=200 OK request_id=e3d2d819-fb36-4e56-89e5-64deae95f372 ``` ACKs for top commit: josecelano: ACK 5ccdf10 Tree-SHA512: 3b182ae2c19ce46451fc370bd05c4e5a3311526562ca396424f046d4087e7fba51ec6101019fe2a8d7fe8f18752a4fce6662871108a7c252d17c5b248b38569b
2 parents a61b1f3 + 5ccdf10 commit db71f2a

File tree

20 files changed

+91
-23
lines changed

20 files changed

+91
-23
lines changed

Cargo.lock

+27
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+3-1
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,16 @@ torrust-tracker-configuration = { version = "3.0.0-alpha.12-develop", path = "pa
6767
torrust-tracker-contrib-bencode = { version = "3.0.0-alpha.12-develop", path = "contrib/bencode" }
6868
torrust-tracker-located-error = { version = "3.0.0-alpha.12-develop", path = "packages/located-error" }
6969
torrust-tracker-primitives = { version = "3.0.0-alpha.12-develop", path = "packages/primitives" }
70-
tower-http = { version = "0", features = ["compression-full"] }
70+
tower-http = { version = "0", features = ["compression-full", "cors", "trace", "propagate-header", "request-id"] }
7171
uuid = { version = "1", features = ["v4"] }
7272
colored = "2.1.0"
7373
url = "2.5.0"
7474
tempfile = "3.9.0"
7575
clap = { version = "4.4.18", features = ["derive", "env"]}
7676
anyhow = "1.0.79"
7777
hex-literal = "0.4.1"
78+
trace = "0.1.7"
79+
tracing = "0.1.40"
7880

7981
[dev-dependencies]
8082
criterion = { version = "0.5.1", features = ["async_tokio"] }

cSpell.json

+1
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@
117117
"Swatinem",
118118
"Swiftbit",
119119
"taiki",
120+
"tdyne",
120121
"tempfile",
121122
"thiserror",
122123
"tlsv",

contrib/bencode/src/mutable/encode.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::iter::Extend;
2-
31
use crate::access::bencode::{BRefAccess, RefKind};
42
use crate::access::dict::BDictAccess;
53
use crate::access::list::BListAccess;

contrib/bencode/src/reference/bencode_ref.rs

-2
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,6 @@ impl<'a> BRefAccessExt<'a> for BencodeRef<'a> {
125125

126126
#[cfg(test)]
127127
mod tests {
128-
use std::default::Default;
129-
130128
use crate::access::bencode::BRefAccess;
131129
use crate::reference::bencode_ref::BencodeRef;
132130
use crate::reference::decode_opt::BDecodeOpt;

contrib/bencode/src/reference/decode.rs

-2
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,6 @@ fn peek_byte(bytes: &[u8], pos: usize) -> BencodeParseResult<u8> {
177177

178178
#[cfg(test)]
179179
mod tests {
180-
use std::default::Default;
181-
182180
use crate::access::bencode::BRefAccess;
183181
use crate::reference::bencode_ref::BencodeRef;
184182
use crate::reference::decode_opt::BDecodeOpt;

contrib/bencode/src/reference/decode_opt.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::default::Default;
2-
31
const DEFAULT_MAX_RECURSION: usize = 50;
42
const DEFAULT_CHECK_KEY_SORT: bool = false;
53
const DEFAULT_ENFORCE_FULL_DECODE: bool = true;

src/console/clients/checker/config.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use std::net::SocketAddr;
44

55
use reqwest::Url as ServiceUrl;
66
use serde::Deserialize;
7-
use url;
87

98
/// It parses the configuration from a JSON format.
109
///
@@ -88,7 +87,7 @@ impl TryFrom<PlainConfiguration> for Configuration {
8887

8988
#[cfg(test)]
9089
mod tests {
91-
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
90+
use std::net::{IpAddr, Ipv4Addr};
9291

9392
use super::*;
9493

src/core/peer.rs

-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ use std::net::{IpAddr, SocketAddr};
2424
use std::panic::Location;
2525

2626
use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes};
27-
use serde;
2827
use serde::Serialize;
2928
use thiserror::Error;
3029

src/servers/apis/routes.rs

+52
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,20 @@
66
//! All the API routes have the `/api` prefix and the version number as the
77
//! first path segment. For example: `/api/v1/torrents`.
88
use std::sync::Arc;
9+
use std::time::Duration;
910

11+
use axum::http::{HeaderName, HeaderValue};
12+
use axum::response::Response;
1013
use axum::routing::get;
1114
use axum::{middleware, Router};
15+
use hyper::Request;
1216
use torrust_tracker_configuration::AccessTokens;
1317
use tower_http::compression::CompressionLayer;
18+
use tower_http::propagate_header::PropagateHeaderLayer;
19+
use tower_http::request_id::{MakeRequestId, RequestId, SetRequestIdLayer};
20+
use tower_http::trace::{DefaultMakeSpan, TraceLayer};
21+
use tracing::{Level, Span};
22+
use uuid::Uuid;
1423

1524
use super::v1;
1625
use super::v1::context::health_check::handlers::health_check_handler;
@@ -32,4 +41,47 @@ pub fn router(tracker: Arc<Tracker>, access_tokens: Arc<AccessTokens>) -> Router
3241
.layer(middleware::from_fn_with_state(state, v1::middlewares::auth::auth))
3342
.route(&format!("{api_url_prefix}/health_check"), get(health_check_handler))
3443
.layer(CompressionLayer::new())
44+
.layer(SetRequestIdLayer::x_request_id(RequestIdGenerator))
45+
.layer(PropagateHeaderLayer::new(HeaderName::from_static("x-request-id")))
46+
.layer(
47+
TraceLayer::new_for_http()
48+
.make_span_with(DefaultMakeSpan::new().level(Level::INFO))
49+
.on_request(|request: &Request<axum::body::Body>, _span: &Span| {
50+
let method = request.method().to_string();
51+
let uri = request.uri().to_string();
52+
let request_id = request
53+
.headers()
54+
.get("x-request-id")
55+
.map(|v| v.to_str().unwrap_or_default())
56+
.unwrap_or_default();
57+
58+
tracing::span!(
59+
target: "API",
60+
tracing::Level::INFO, "request", method = %method, uri = %uri, request_id = %request_id);
61+
})
62+
.on_response(|response: &Response, latency: Duration, _span: &Span| {
63+
let status_code = response.status();
64+
let request_id = response
65+
.headers()
66+
.get("x-request-id")
67+
.map(|v| v.to_str().unwrap_or_default())
68+
.unwrap_or_default();
69+
let latency_ms = latency.as_millis();
70+
71+
tracing::span!(
72+
target: "API",
73+
tracing::Level::INFO, "response", latency = %latency_ms, status = %status_code, request_id = %request_id);
74+
}),
75+
)
76+
.layer(SetRequestIdLayer::x_request_id(RequestIdGenerator))
77+
}
78+
79+
#[derive(Clone, Default)]
80+
struct RequestIdGenerator;
81+
82+
impl MakeRequestId for RequestIdGenerator {
83+
fn make_request_id<B>(&mut self, _request: &Request<B>) -> Option<RequestId> {
84+
let id = HeaderValue::from_str(&Uuid::new_v4().to_string()).expect("UUID is a valid HTTP header value");
85+
Some(RequestId::new(id))
86+
}
3587
}

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

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
//! API resources for the [`auth_key`](crate::servers::apis::v1::context::auth_key) API context.
2-
use std::convert::From;
32
43
use serde::{Deserialize, Serialize};
54

src/servers/http/v1/responses/error.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
//! code.
1414
use axum::http::StatusCode;
1515
use axum::response::{IntoResponse, Response};
16-
use serde::{self, Serialize};
16+
use serde::Serialize;
1717

1818
/// `Error` response for the [`HTTP tracker`](crate::servers::http).
1919
#[derive(Serialize, Debug, PartialEq)]

src/shared/bit_torrent/tracker/http/client/requests/scrape.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use std::convert::TryFrom;
21
use std::error::Error;
32
use std::fmt::{self};
43
use std::str::FromStr;

src/shared/bit_torrent/tracker/http/client/responses/announce.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
22

3-
use serde::{self, Deserialize, Serialize};
3+
use serde::{Deserialize, Serialize};
44

55
use crate::core::peer::Peer;
66

src/shared/bit_torrent/tracker/http/client/responses/error.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use serde::{self, Deserialize, Serialize};
1+
use serde::{Deserialize, Serialize};
22

33
#[derive(Serialize, Deserialize, Debug, PartialEq)]
44
pub struct Error {

src/shared/bit_torrent/tracker/http/client/responses/scrape.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::fmt::Write;
33
use std::str;
44

55
use serde::ser::SerializeMap;
6-
use serde::{self, Deserialize, Serialize, Serializer};
6+
use serde::{Deserialize, Serialize, Serializer};
77
use serde_bencode::value::Value;
88

99
use crate::shared::bit_torrent::tracker::http::{ByteArray20, InfoHash};

src/shared/crypto/keys.rs

-2
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,6 @@ pub mod seeds {
8686

8787
#[cfg(test)]
8888
mod tests {
89-
use std::convert::TryInto;
90-
9189
use crate::shared::crypto::ephemeral_instance_keys::RANDOM_SEED;
9290
use crate::shared::crypto::keys::seeds::detail::ZEROED_TEST_SEED;
9391
use crate::shared::crypto::keys::seeds::CURRENT_SEED;

tests/servers/http/responses/announce.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
22

3-
use serde::{self, Deserialize, Serialize};
3+
use serde::{Deserialize, Serialize};
44
use torrust_tracker::core::peer::Peer;
55

66
#[derive(Serialize, Deserialize, Debug, PartialEq)]

tests/servers/http/responses/error.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use serde::{self, Deserialize, Serialize};
1+
use serde::{Deserialize, Serialize};
22

33
#[derive(Serialize, Deserialize, Debug, PartialEq)]
44
pub struct Error {

tests/servers/http/responses/scrape.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::collections::HashMap;
22
use std::str;
33

4-
use serde::{self, Deserialize, Serialize};
4+
use serde::{Deserialize, Serialize};
55
use serde_bencode::value::Value;
66

77
use crate::servers::http::{ByteArray20, InfoHash};

0 commit comments

Comments
 (0)