Add user agent to request log

This commit is contained in:
Lennart
2025-06-09 19:55:39 +02:00
parent e000165555
commit 0feaaaaca1
3 changed files with 14 additions and 3 deletions

3
Cargo.lock generated
View File

@@ -2644,8 +2644,11 @@ dependencies = [
"argon2", "argon2",
"async-trait", "async-trait",
"axum", "axum",
"axum-extra",
"clap", "clap",
"figment", "figment",
"headers",
"http",
"opentelemetry", "opentelemetry",
"opentelemetry-otlp", "opentelemetry-otlp",
"opentelemetry-semantic-conventions", "opentelemetry-semantic-conventions",

View File

@@ -173,3 +173,6 @@ rustical_dav_push.workspace = true
rustical_oidc.workspace = true rustical_oidc.workspace = true
quick-xml.workspace = true quick-xml.workspace = true
tower-http.workspace = true tower-http.workspace = true
axum-extra.workspace = true
headers.workspace = true
http.workspace = true

View File

@@ -1,7 +1,8 @@
use axum::Router; use axum::Router;
use axum::extract::Request; use axum::extract::Request;
use axum::response::Response; use axum::response::Response;
use reqwest::StatusCode; use headers::{HeaderMapExt, UserAgent};
use http::StatusCode;
use rustical_caldav::caldav_router; use rustical_caldav::caldav_router;
use rustical_carddav::carddav_router; use rustical_carddav::carddav_router;
use rustical_frontend::nextcloud_login::{NextcloudFlows, nextcloud_login_router}; use rustical_frontend::nextcloud_login::{NextcloudFlows, nextcloud_login_router};
@@ -80,20 +81,24 @@ pub fn make_app<AS: AddressbookStore, CS: CalendarStore, S: SubscriptionStore>(
.make_span_with(|request: &Request| { .make_span_with(|request: &Request| {
tracing::info_span!( tracing::info_span!(
"http-request", "http-request",
status_code = tracing::field::Empty, status = tracing::field::Empty,
otel.name = tracing::field::display(format!( otel.name = tracing::field::display(format!(
"{} {}", "{} {}",
request.method(), request.method(),
request.uri() request.uri()
)), )),
ua = tracing::field::Empty,
) )
}) })
.on_request(|req: &Request, span: &Span| { .on_request(|req: &Request, span: &Span| {
span.record("method", display(req.method())); span.record("method", display(req.method()));
span.record("path", display(req.uri())); span.record("path", display(req.uri()));
if let Some(ua) = req.headers().typed_get::<UserAgent>() {
span.record("ua", display(ua));
}
}) })
.on_response(|response: &Response, _latency: Duration, span: &Span| { .on_response(|response: &Response, _latency: Duration, span: &Span| {
span.record("status_code", display(response.status())); span.record("status", display(response.status()));
if response.status().is_server_error() { if response.status().is_server_error() {
tracing::error!("server error"); tracing::error!("server error");
} else if response.status().is_client_error() { } else if response.status().is_client_error() {