Skip to content

Commit 64039e5

Browse files
committed
Merge #1153: Fix missing logs for HTTP requests
97233f5 fix: missing logs for HTTP requests (Jose Celano) Pull request description: Relates to: - #1150 - #1152 Some log lines (tracing spans) were missing. In addition to that, we were using new spans to log requests and responses instead of using the span provided by the `TraceLayer`. That enables you to join all the log events related to the same request. This fix is needed to continue with this issue: #1150 Because it allows the use of a "request-id" header to identify logs. We can write log assertions by matching lines with the `request-id` used in the request. For example, if you make this request: ```console curl -H "x-request-id: YOUR_REQUEST_ID" http://0.0.0.0:1212/api/v1/stats?token=InvalidToken ``` This is the new output (which was missing before this change): ```output 2024-12-23T17:53:06.530704Z INFO request{method=GET uri=/api/v1/stats?token=InvalidToken version=HTTP/1.1}: API: request method=GET uri=/api/v1/stats?token=InvalidToken request_id=YOUR_REQUEST_ID 2024-12-23T17:53:06.530777Z ERROR request{method=GET uri=/api/v1/stats?token=InvalidToken version=HTTP/1.1}: API: response latency_ms=0 status_code=500 Internal Server Error request_id=YOUR_REQUEST_ID 2024-12-23T17:53:06.530785Z ERROR request{method=GET uri=/api/v1/stats?token=InvalidToken version=HTTP/1.1}: API: response failed failure_classification=Status code: 500 Internal Server Error latency=0 ms ``` As you can see, now we have the "request_id=YOUR_REQUEST_ID" field, which can be used to identify the test that made the request and write a log assertion for that concrete expected line. ACKs for top commit: josecelano: ACK 97233f5 Tree-SHA512: 075a3cdeafa735d4a263c942b34594049adc9d42ed5e8a1bef043ffea394bfdae7cf109928f1311d4589f40804c72ebe71c66d6ec5380f5ce472ba9ba5304ad5
2 parents 0f40030 + 97233f5 commit 64039e5

File tree

3 files changed

+82
-46
lines changed

3 files changed

+82
-46
lines changed

src/servers/apis/routes.rs

+27-15
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub fn router(tracker: Arc<Tracker>, access_tokens: Arc<AccessTokens>) -> Router
5353
.layer(
5454
TraceLayer::new_for_http()
5555
.make_span_with(DefaultMakeSpan::new().level(Level::INFO))
56-
.on_request(|request: &Request<axum::body::Body>, _span: &Span| {
56+
.on_request(|request: &Request<axum::body::Body>, span: &Span| {
5757
let method = request.method().to_string();
5858
let uri = request.uri().to_string();
5959
let request_id = request
@@ -62,30 +62,42 @@ pub fn router(tracker: Arc<Tracker>, access_tokens: Arc<AccessTokens>) -> Router
6262
.map(|v| v.to_str().unwrap_or_default())
6363
.unwrap_or_default();
6464

65-
tracing::span!(
65+
span.record("request_id", request_id);
66+
67+
tracing::event!(
6668
target: API_LOG_TARGET,
67-
tracing::Level::INFO, "request", method = %method, uri = %uri, request_id = %request_id);
69+
tracing::Level::INFO, %method, %uri, %request_id, "request");
6870
})
69-
.on_response(|response: &Response, latency: Duration, _span: &Span| {
71+
.on_response(|response: &Response, latency: Duration, span: &Span| {
72+
let latency_ms = latency.as_millis();
7073
let status_code = response.status();
7174
let request_id = response
7275
.headers()
7376
.get("x-request-id")
7477
.map(|v| v.to_str().unwrap_or_default())
7578
.unwrap_or_default();
76-
let latency_ms = latency.as_millis();
7779

78-
tracing::span!(
79-
target: API_LOG_TARGET,
80-
tracing::Level::INFO, "response", latency = %latency_ms, status = %status_code, request_id = %request_id);
81-
})
82-
.on_failure(|failure_classification: ServerErrorsFailureClass, latency: Duration, _span: &Span| {
83-
let latency = Latency::new(
84-
LatencyUnit::Millis,
85-
latency,
86-
);
87-
tracing::error!(target: API_LOG_TARGET, "response failed classification={failure_classification} latency={latency}");
80+
span.record("request_id", request_id);
81+
82+
if status_code.is_server_error() {
83+
tracing::event!(
84+
target: API_LOG_TARGET,
85+
tracing::Level::ERROR, %latency_ms, %status_code, %request_id, "response");
86+
} else {
87+
tracing::event!(
88+
target: API_LOG_TARGET,
89+
tracing::Level::INFO, %latency_ms, %status_code, %request_id, "response");
90+
}
8891
})
92+
.on_failure(
93+
|failure_classification: ServerErrorsFailureClass, latency: Duration, _span: &Span| {
94+
let latency = Latency::new(LatencyUnit::Millis, latency);
95+
96+
tracing::event!(
97+
target: API_LOG_TARGET,
98+
tracing::Level::ERROR, %failure_classification, %latency, "response failed");
99+
},
100+
),
89101
)
90102
.layer(SetRequestIdLayer::x_request_id(MakeRequestUuid))
91103
.layer(

src/servers/health_check_api/server.rs

+27-15
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ pub fn start(
5151
.layer(
5252
TraceLayer::new_for_http()
5353
.make_span_with(DefaultMakeSpan::new().level(Level::INFO))
54-
.on_request(|request: &Request<axum::body::Body>, _span: &Span| {
54+
.on_request(|request: &Request<axum::body::Body>, span: &Span| {
5555
let method = request.method().to_string();
5656
let uri = request.uri().to_string();
5757
let request_id = request
@@ -60,30 +60,42 @@ pub fn start(
6060
.map(|v| v.to_str().unwrap_or_default())
6161
.unwrap_or_default();
6262

63-
tracing::span!(
63+
span.record("request_id", request_id);
64+
65+
tracing::event!(
6466
target: HEALTH_CHECK_API_LOG_TARGET,
65-
tracing::Level::INFO, "request", method = %method, uri = %uri, request_id = %request_id);
67+
tracing::Level::INFO, %method, %uri, %request_id, "request");
6668
})
67-
.on_response(|response: &Response, latency: Duration, _span: &Span| {
69+
.on_response(|response: &Response, latency: Duration, span: &Span| {
70+
let latency_ms = latency.as_millis();
6871
let status_code = response.status();
6972
let request_id = response
7073
.headers()
7174
.get("x-request-id")
7275
.map(|v| v.to_str().unwrap_or_default())
7376
.unwrap_or_default();
74-
let latency_ms = latency.as_millis();
7577

76-
tracing::span!(
77-
target: HEALTH_CHECK_API_LOG_TARGET,
78-
tracing::Level::INFO, "response", latency = %latency_ms, status = %status_code, request_id = %request_id);
79-
})
80-
.on_failure(|failure_classification: ServerErrorsFailureClass, latency: Duration, _span: &Span| {
81-
let latency = Latency::new(
82-
LatencyUnit::Millis,
83-
latency,
84-
);
85-
tracing::error!(target: HEALTH_CHECK_API_LOG_TARGET, "response failed classification={failure_classification} latency={latency}");
78+
span.record("request_id", request_id);
79+
80+
if status_code.is_server_error() {
81+
tracing::event!(
82+
target: HEALTH_CHECK_API_LOG_TARGET,
83+
tracing::Level::ERROR, %latency_ms, %status_code, %request_id, "response");
84+
} else {
85+
tracing::event!(
86+
target: HEALTH_CHECK_API_LOG_TARGET,
87+
tracing::Level::INFO, %latency_ms, %status_code, %request_id, "response");
88+
}
8689
})
90+
.on_failure(
91+
|failure_classification: ServerErrorsFailureClass, latency: Duration, _span: &Span| {
92+
let latency = Latency::new(LatencyUnit::Millis, latency);
93+
94+
tracing::event!(
95+
target: HEALTH_CHECK_API_LOG_TARGET,
96+
tracing::Level::ERROR, %failure_classification, %latency, "response failed");
97+
},
98+
),
8799
)
88100
.layer(SetRequestIdLayer::x_request_id(MakeRequestUuid));
89101

src/servers/http/v1/routes.rs

+28-16
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ pub fn router(tracker: Arc<Tracker>, server_socket_addr: SocketAddr) -> Router {
5050
.layer(
5151
TraceLayer::new_for_http()
5252
.make_span_with(DefaultMakeSpan::new().level(Level::INFO))
53-
.on_request(move |request: &Request<axum::body::Body>, _span: &Span| {
53+
.on_request(move |request: &Request<axum::body::Body>, span: &Span| {
5454
let method = request.method().to_string();
5555
let uri = request.uri().to_string();
5656
let request_id = request
@@ -59,33 +59,45 @@ pub fn router(tracker: Arc<Tracker>, server_socket_addr: SocketAddr) -> Router {
5959
.map(|v| v.to_str().unwrap_or_default())
6060
.unwrap_or_default();
6161

62-
tracing::span!(
62+
span.record("request_id", request_id);
63+
64+
tracing::event!(
6365
target: HTTP_TRACKER_LOG_TARGET,
64-
tracing::Level::INFO, "request", server_socket_addr= %server_socket_addr, method = %method, uri = %uri, request_id = %request_id);
66+
tracing::Level::INFO, %server_socket_addr, %method, %uri, %request_id, "request");
6567
})
66-
.on_response(move |response: &Response, latency: Duration, _span: &Span| {
68+
.on_response(move |response: &Response, latency: Duration, span: &Span| {
69+
let latency_ms = latency.as_millis();
6770
let status_code = response.status();
6871
let request_id = response
6972
.headers()
7073
.get("x-request-id")
7174
.map(|v| v.to_str().unwrap_or_default())
7275
.unwrap_or_default();
73-
let latency_ms = latency.as_millis();
7476

75-
tracing::span!(
76-
target: HTTP_TRACKER_LOG_TARGET,
77-
tracing::Level::INFO, "response", server_socket_addr= %server_socket_addr, latency = %latency_ms, status = %status_code, request_id = %request_id);
78-
})
79-
.on_failure(|failure_classification: ServerErrorsFailureClass, latency: Duration, _span: &Span| {
80-
let latency = Latency::new(
81-
LatencyUnit::Millis,
82-
latency,
83-
);
84-
tracing::error!(target: HTTP_TRACKER_LOG_TARGET, "response failed classification={failure_classification} latency={latency}");
77+
span.record("request_id", request_id);
78+
79+
if status_code.is_server_error() {
80+
tracing::event!(
81+
target: HTTP_TRACKER_LOG_TARGET,
82+
tracing::Level::ERROR, %server_socket_addr, %latency_ms, %status_code, %request_id, "response");
83+
} else {
84+
tracing::event!(
85+
target: HTTP_TRACKER_LOG_TARGET,
86+
tracing::Level::INFO, %server_socket_addr, %latency_ms, %status_code, %request_id, "response");
87+
}
8588
})
89+
.on_failure(
90+
|failure_classification: ServerErrorsFailureClass, latency: Duration, _span: &Span| {
91+
let latency = Latency::new(LatencyUnit::Millis, latency);
92+
93+
tracing::event!(
94+
target: HTTP_TRACKER_LOG_TARGET,
95+
tracing::Level::ERROR, %failure_classification, %latency, "response failed");
96+
},
97+
),
8698
)
8799
.layer(SetRequestIdLayer::x_request_id(MakeRequestUuid))
88-
.layer(
100+
.layer(
89101
ServiceBuilder::new()
90102
// this middleware goes above `TimeoutLayer` because it will receive
91103
// errors returned by `TimeoutLayer`

0 commit comments

Comments
 (0)