From bc562d05fca81836ede669367336bf35f20f6e37 Mon Sep 17 00:00:00 2001 From: Nikhil Sinha Date: Wed, 19 Aug 2026 20:36:04 +0530 Subject: [PATCH 1/5] add details to invalid api key error in middleware add user agent, src ip and dataset name to the error --- src/handlers/http/middleware.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/handlers/http/middleware.rs b/src/handlers/http/middleware.rs index 5d99a0d6a..42d37c367 100644 --- a/src/handlers/http/middleware.rs +++ b/src/handlers/http/middleware.rs @@ -198,7 +198,31 @@ where Some(session_id) } None => { - return Box::pin(async { Err(ErrorUnauthorized("Invalid API key")) }); + let connection_info = req.connection_info(); + let source_ip = connection_info.realip_remote_addr().unwrap_or("unknown"); + let user_agent = req + .headers() + .get(header::USER_AGENT) + .and_then(|value| value.to_str().ok()) + .unwrap_or_default(); + let dataset = req + .match_info() + .get("logstream") + .or_else(|| { + req.headers() + .get(STREAM_NAME_HEADER_KEY) + .and_then(|value| value.to_str().ok()) + }) + .unwrap_or("unknown"); + + let error_message = format!( + "Invalid API key (source IP: {source_ip}, user agent: {user_agent}, dataset: {dataset})" + ); + tracing::warn!( + tenant = tenant_id.as_deref().unwrap_or(DEFAULT_TENANT), + "{error_message}" + ); + return Box::pin(async move { Err(ErrorUnauthorized(error_message)) }); } } } else { From 216b173e27da780f0d957d7b729d49676bc7d12d Mon Sep 17 00:00:00 2001 From: Nikhil Sinha Date: Wed, 19 Aug 2026 20:46:25 +0530 Subject: [PATCH 2/5] fix coderabbit comments --- src/handlers/http/middleware.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/handlers/http/middleware.rs b/src/handlers/http/middleware.rs index 42d37c367..8e8bf3d6e 100644 --- a/src/handlers/http/middleware.rs +++ b/src/handlers/http/middleware.rs @@ -215,14 +215,14 @@ where }) .unwrap_or("unknown"); - let error_message = format!( - "Invalid API key (source IP: {source_ip}, user agent: {user_agent}, dataset: {dataset})" - ); tracing::warn!( - tenant = tenant_id.as_deref().unwrap_or(DEFAULT_TENANT), - "{error_message}" + source_ip, + user_agent, + dataset, + requested_tenant = tenant_id.as_deref().unwrap_or("unknown"), + "Invalid API key" ); - return Box::pin(async move { Err(ErrorUnauthorized(error_message)) }); + return Box::pin(async { Err(ErrorUnauthorized("Invalid API key")) }); } } } else { From 988846d8186fac23989595392de65709a6643ae1 Mon Sep 17 00:00:00 2001 From: Nikhil Sinha Date: Thu, 20 Aug 2026 06:55:34 +0530 Subject: [PATCH 3/5] add endpoint --- src/handlers/http/middleware.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/handlers/http/middleware.rs b/src/handlers/http/middleware.rs index 8e8bf3d6e..db28be415 100644 --- a/src/handlers/http/middleware.rs +++ b/src/handlers/http/middleware.rs @@ -200,6 +200,7 @@ where None => { let connection_info = req.connection_info(); let source_ip = connection_info.realip_remote_addr().unwrap_or("unknown"); + let endpoint = req.path(); let user_agent = req .headers() .get(header::USER_AGENT) @@ -217,6 +218,7 @@ where tracing::warn!( source_ip, + endpoint, user_agent, dataset, requested_tenant = tenant_id.as_deref().unwrap_or("unknown"), From 5759622f4926bca8e8fc3c9853da0912f87c8738 Mon Sep 17 00:00:00 2001 From: Nikhil Sinha Date: Thu, 20 Aug 2026 07:27:45 +0530 Subject: [PATCH 4/5] use peer_addr instead of remote_addr --- src/handlers/http/middleware.rs | 6 ++++-- src/handlers/http/modal/utils/ingest_utils.rs | 9 +++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/handlers/http/middleware.rs b/src/handlers/http/middleware.rs index db28be415..212b0f263 100644 --- a/src/handlers/http/middleware.rs +++ b/src/handlers/http/middleware.rs @@ -198,8 +198,10 @@ where Some(session_id) } None => { - let connection_info = req.connection_info(); - let source_ip = connection_info.realip_remote_addr().unwrap_or("unknown"); + let source_ip = req + .peer_addr() + .map(|address| address.ip().to_string()) + .unwrap_or_else(|| "unknown".to_string()); let endpoint = req.path(); let user_agent = req .headers() diff --git a/src/handlers/http/modal/utils/ingest_utils.rs b/src/handlers/http/modal/utils/ingest_utils.rs index e8e1ca74a..7f75f729a 100644 --- a/src/handlers/http/modal/utils/ingest_utils.rs +++ b/src/handlers/http/modal/utils/ingest_utils.rs @@ -412,12 +412,13 @@ pub fn get_custom_fields_from_header(req: &HttpRequest) -> HashMap Date: Thu, 20 Aug 2026 07:35:35 +0530 Subject: [PATCH 5/5] update test --- src/handlers/http/modal/utils/ingest_utils.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/handlers/http/modal/utils/ingest_utils.rs b/src/handlers/http/modal/utils/ingest_utils.rs index 7f75f729a..d3fcba7ac 100644 --- a/src/handlers/http/modal/utils/ingest_utils.rs +++ b/src/handlers/http/modal/utils/ingest_utils.rs @@ -593,6 +593,17 @@ mod tests { assert_eq!(custom_fields.len(), 2); assert_eq!(custom_fields.get(USER_AGENT_KEY).unwrap(), ""); - assert_eq!(custom_fields.get(SOURCE_IP_KEY).unwrap(), ""); + assert_eq!(custom_fields.get(SOURCE_IP_KEY).unwrap(), "unknown"); + } + + #[test] + fn test_get_custom_fields_from_header_with_peer_address() { + let req = TestRequest::default() + .peer_addr("192.0.2.1:8080".parse().unwrap()) + .to_http_request(); + + let custom_fields = get_custom_fields_from_header(&req); + + assert_eq!(custom_fields.get(SOURCE_IP_KEY).unwrap(), "192.0.2.1"); } }