From 6870759b55d1dc75b0958761141badbf66ce950c Mon Sep 17 00:00:00 2001 From: Mike Del Tito Date: Tue, 30 Apr 2024 15:33:49 -0400 Subject: [PATCH] fix(user_trace): log http error responses as captured_data For the http sink, the generic error message only indicates the status code of the response. Now that we have a mechanism for bubbling up structured data from `user_log`, we can include and expose that error response alongside the message. Ref: LOG-19789 --- src/mezmo/user_trace.rs | 30 +++++++++++++++++++++++++++++- src/sinks/util/http.rs | 6 ++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/mezmo/user_trace.rs b/src/mezmo/user_trace.rs index 5cb0916f4..2bcbd1255 100644 --- a/src/mezmo/user_trace.rs +++ b/src/mezmo/user_trace.rs @@ -287,6 +287,10 @@ pub trait UserLoggingResponse { fn log_msg(&self) -> Option { None } + + fn log_captured_data(&self) -> Option { + None + } } pub trait UserLoggingError { @@ -330,7 +334,14 @@ where match &res { Ok(response) => { if let Some(msg) = response.log_msg() { - user_log_error!(ctx, msg); + match response.log_captured_data() { + Some(captured_data) => { + user_log_error!(ctx, msg, captured_data: captured_data); + } + None => { + user_log_error!(ctx, msg); + } + } } } Err(err) => { @@ -748,6 +759,12 @@ mod tests { fn log_msg(&self) -> Option { Some("log_msg(): response".into()) } + + fn log_captured_data(&self) -> Option { + Some(Value::Object(btreemap! { + "response" => r#"{"error": "badness"}"# + })) + } } struct MockWrapperService { @@ -828,5 +845,16 @@ mod tests { let msg = log_res.get(".message").unwrap().as_str().unwrap(); assert_eq!(msg, "log_msg(): response"); + + let captured_data = log_res + .get(".meta.mezmo.captured_data") + .expect("captured data should exist"); + + assert_eq!( + captured_data, + &Value::Object(btreemap! { + "response" => r#"{"error": "badness"}"# + }) + ); } } diff --git a/src/sinks/util/http.rs b/src/sinks/util/http.rs index ef658ab3c..ac579adea 100644 --- a/src/sinks/util/http.rs +++ b/src/sinks/util/http.rs @@ -799,6 +799,12 @@ impl UserLoggingResponse for HttpResponse { None } } + + fn log_captured_data(&self) -> Option { + Some(Value::Object(btreemap! { + "response" => self.http_response.body().to_owned() + })) + } } impl UserLoggingError for crate::Error {