Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tracker API: log request and responses #699

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,16 @@ torrust-tracker-configuration = { version = "3.0.0-alpha.12-develop", path = "pa
torrust-tracker-contrib-bencode = { version = "3.0.0-alpha.12-develop", path = "contrib/bencode" }
torrust-tracker-located-error = { version = "3.0.0-alpha.12-develop", path = "packages/located-error" }
torrust-tracker-primitives = { version = "3.0.0-alpha.12-develop", path = "packages/primitives" }
tower-http = { version = "0", features = ["compression-full"] }
tower-http = { version = "0", features = ["compression-full", "cors", "trace", "propagate-header", "request-id"] }
uuid = { version = "1", features = ["v4"] }
colored = "2.1.0"
url = "2.5.0"
tempfile = "3.9.0"
clap = { version = "4.4.18", features = ["derive", "env"]}
anyhow = "1.0.79"
hex-literal = "0.4.1"
trace = "0.1.7"
tracing = "0.1.40"

[dev-dependencies]
criterion = { version = "0.5.1", features = ["async_tokio"] }
Expand Down
1 change: 1 addition & 0 deletions cSpell.json
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@
"Swatinem",
"Swiftbit",
"taiki",
"tdyne",
"tempfile",
"thiserror",
"tlsv",
Expand Down
2 changes: 0 additions & 2 deletions contrib/bencode/src/mutable/encode.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
use std::iter::Extend;

use crate::access::bencode::{BRefAccess, RefKind};
use crate::access::dict::BDictAccess;
use crate::access::list::BListAccess;
Expand Down
2 changes: 0 additions & 2 deletions contrib/bencode/src/reference/bencode_ref.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,6 @@ impl<'a> BRefAccessExt<'a> for BencodeRef<'a> {

#[cfg(test)]
mod tests {
use std::default::Default;

use crate::access::bencode::BRefAccess;
use crate::reference::bencode_ref::BencodeRef;
use crate::reference::decode_opt::BDecodeOpt;
Expand Down
2 changes: 0 additions & 2 deletions contrib/bencode/src/reference/decode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,6 @@ fn peek_byte(bytes: &[u8], pos: usize) -> BencodeParseResult<u8> {

#[cfg(test)]
mod tests {
use std::default::Default;

use crate::access::bencode::BRefAccess;
use crate::reference::bencode_ref::BencodeRef;
use crate::reference::decode_opt::BDecodeOpt;
Expand Down
2 changes: 0 additions & 2 deletions contrib/bencode/src/reference/decode_opt.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
use std::default::Default;

const DEFAULT_MAX_RECURSION: usize = 50;
const DEFAULT_CHECK_KEY_SORT: bool = false;
const DEFAULT_ENFORCE_FULL_DECODE: bool = true;
Expand Down
3 changes: 1 addition & 2 deletions src/console/clients/checker/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ use std::net::SocketAddr;

use reqwest::Url as ServiceUrl;
use serde::Deserialize;
use url;

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

#[cfg(test)]
mod tests {
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use std::net::{IpAddr, Ipv4Addr};

use super::*;

Expand Down
1 change: 0 additions & 1 deletion src/core/peer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ use std::net::{IpAddr, SocketAddr};
use std::panic::Location;

use aquatic_udp_protocol::{AnnounceEvent, NumberOfBytes};
use serde;
use serde::Serialize;
use thiserror::Error;

Expand Down
52 changes: 52 additions & 0 deletions src/servers/apis/routes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,20 @@
//! All the API routes have the `/api` prefix and the version number as the
//! first path segment. For example: `/api/v1/torrents`.
use std::sync::Arc;
use std::time::Duration;

use axum::http::{HeaderName, HeaderValue};
use axum::response::Response;
use axum::routing::get;
use axum::{middleware, Router};
use hyper::Request;
use torrust_tracker_configuration::AccessTokens;
use tower_http::compression::CompressionLayer;
use tower_http::propagate_header::PropagateHeaderLayer;
use tower_http::request_id::{MakeRequestId, RequestId, SetRequestIdLayer};
use tower_http::trace::{DefaultMakeSpan, TraceLayer};
use tracing::{Level, Span};
use uuid::Uuid;

use super::v1;
use super::v1::context::health_check::handlers::health_check_handler;
Expand All @@ -32,4 +41,47 @@ pub fn router(tracker: Arc<Tracker>, access_tokens: Arc<AccessTokens>) -> Router
.layer(middleware::from_fn_with_state(state, v1::middlewares::auth::auth))
.route(&format!("{api_url_prefix}/health_check"), get(health_check_handler))
.layer(CompressionLayer::new())
.layer(SetRequestIdLayer::x_request_id(RequestIdGenerator))
.layer(PropagateHeaderLayer::new(HeaderName::from_static("x-request-id")))
.layer(
TraceLayer::new_for_http()
.make_span_with(DefaultMakeSpan::new().level(Level::INFO))
.on_request(|request: &Request<axum::body::Body>, _span: &Span| {
let method = request.method().to_string();
let uri = request.uri().to_string();
let request_id = request
.headers()
.get("x-request-id")
.map(|v| v.to_str().unwrap_or_default())
.unwrap_or_default();

tracing::span!(
target: "API",
tracing::Level::INFO, "request", method = %method, uri = %uri, request_id = %request_id);
})
.on_response(|response: &Response, latency: Duration, _span: &Span| {
let status_code = response.status();
let request_id = response
.headers()
.get("x-request-id")
.map(|v| v.to_str().unwrap_or_default())
.unwrap_or_default();
let latency_ms = latency.as_millis();

tracing::span!(
target: "API",
tracing::Level::INFO, "response", latency = %latency_ms, status = %status_code, request_id = %request_id);
}),
)
.layer(SetRequestIdLayer::x_request_id(RequestIdGenerator))
}

#[derive(Clone, Default)]
struct RequestIdGenerator;

impl MakeRequestId for RequestIdGenerator {
fn make_request_id<B>(&mut self, _request: &Request<B>) -> Option<RequestId> {
let id = HeaderValue::from_str(&Uuid::new_v4().to_string()).expect("UUID is a valid HTTP header value");
Some(RequestId::new(id))
}
}
1 change: 0 additions & 1 deletion src/servers/apis/v1/context/auth_key/resources.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
//! API resources for the [`auth_key`](crate::servers::apis::v1::context::auth_key) API context.
use std::convert::From;

use serde::{Deserialize, Serialize};

Expand Down
2 changes: 1 addition & 1 deletion src/servers/http/v1/responses/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
//! code.
use axum::http::StatusCode;
use axum::response::{IntoResponse, Response};
use serde::{self, Serialize};
use serde::Serialize;

/// `Error` response for the [`HTTP tracker`](crate::servers::http).
#[derive(Serialize, Debug, PartialEq)]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use std::convert::TryFrom;
use std::error::Error;
use std::fmt::{self};
use std::str::FromStr;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::net::{IpAddr, Ipv4Addr, SocketAddr};

use serde::{self, Deserialize, Serialize};
use serde::{Deserialize, Serialize};

use crate::core::peer::Peer;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use serde::{self, Deserialize, Serialize};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct Error {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::fmt::Write;
use std::str;

use serde::ser::SerializeMap;
use serde::{self, Deserialize, Serialize, Serializer};
use serde::{Deserialize, Serialize, Serializer};
use serde_bencode::value::Value;

use crate::shared::bit_torrent::tracker::http::{ByteArray20, InfoHash};
Expand Down
2 changes: 0 additions & 2 deletions src/shared/crypto/keys.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,6 @@ pub mod seeds {

#[cfg(test)]
mod tests {
use std::convert::TryInto;

use crate::shared::crypto::ephemeral_instance_keys::RANDOM_SEED;
use crate::shared::crypto::keys::seeds::detail::ZEROED_TEST_SEED;
use crate::shared::crypto::keys::seeds::CURRENT_SEED;
Expand Down
2 changes: 1 addition & 1 deletion tests/servers/http/responses/announce.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::net::{IpAddr, Ipv4Addr, SocketAddr};

use serde::{self, Deserialize, Serialize};
use serde::{Deserialize, Serialize};
use torrust_tracker::core::peer::Peer;

#[derive(Serialize, Deserialize, Debug, PartialEq)]
Expand Down
2 changes: 1 addition & 1 deletion tests/servers/http/responses/error.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use serde::{self, Deserialize, Serialize};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct Error {
Expand Down
2 changes: 1 addition & 1 deletion tests/servers/http/responses/scrape.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::collections::HashMap;
use std::str;

use serde::{self, Deserialize, Serialize};
use serde::{Deserialize, Serialize};
use serde_bencode::value::Value;

use crate::servers::http::{ByteArray20, InfoHash};
Expand Down
Loading