From 91f818e57d2271769c9832db5e026b2a33a30c3a Mon Sep 17 00:00:00 2001 From: Jose Celano Date: Mon, 12 Feb 2024 18:20:58 +0000 Subject: [PATCH] feat: [#468] add request id to response log ``` 2024-02-12T18:20:13.114426999+00:00 [API][INFO] finished processing request; latency=0 status=200 OK request_id=a5030c7a-5302-49d4-8e66-f0f0ab0e3ce3 ``:Wq --- src/web/api/server/v1/routes.rs | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/web/api/server/v1/routes.rs b/src/web/api/server/v1/routes.rs index b9150870..9ac6459a 100644 --- a/src/web/api/server/v1/routes.rs +++ b/src/web/api/server/v1/routes.rs @@ -1,10 +1,11 @@ //! Route initialization for the v1 API. use std::env; use std::sync::Arc; +use std::time::Duration; use axum::extract::DefaultBodyLimit; use axum::http::{HeaderName, HeaderValue}; -use axum::response::Redirect; +use axum::response::{Redirect, Response}; use axum::routing::get; use axum::{Json, Router}; use hyper::Request; @@ -13,8 +14,8 @@ use tower_http::compression::CompressionLayer; use tower_http::cors::CorsLayer; use tower_http::propagate_header::PropagateHeaderLayer; use tower_http::request_id::{MakeRequestId, RequestId, SetRequestIdLayer}; -use tower_http::trace::{DefaultMakeSpan, DefaultOnRequest, DefaultOnResponse, TraceLayer}; -use tracing::Level; +use tower_http::trace::{DefaultMakeSpan, DefaultOnRequest, TraceLayer}; +use tracing::{Level, Span}; use uuid::Uuid; use super::contexts::{about, category, proxy, settings, tag, torrent, user}; @@ -56,14 +57,26 @@ pub fn router(app_data: Arc) -> Router { router .layer(DefaultBodyLimit::max(10_485_760)) .layer(CompressionLayer::new()) + .layer(PropagateHeaderLayer::new(HeaderName::from_static("x-request-id"))) + .layer(SetRequestIdLayer::x_request_id(RequestIdGenerator)) .layer( TraceLayer::new_for_http() .make_span_with(DefaultMakeSpan::new().level(Level::INFO)) .on_request(DefaultOnRequest::new().level(Level::INFO)) - .on_response(DefaultOnResponse::new().level(Level::INFO)), + .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, "finished processing request", latency = %latency_ms, status = %status_code, request_id = %request_id); + }), ) - .layer(PropagateHeaderLayer::new(HeaderName::from_static("x-request-id"))) - .layer(SetRequestIdLayer::x_request_id(RequestIdGenerator)) } /// Endpoint for container health check.