Record per-candidate upstream error bodies

This commit is contained in:
fawney19
2026-05-11 02:30:45 +08:00
parent e3574e1918
commit ef4cc55c9a
8 changed files with 170 additions and 19 deletions

View File

@@ -501,7 +501,7 @@ fn build_admin_monitoring_trace_candidate_extra_data(
usage.response_body_ref.as_deref(),
usage.response_body_state,
) {
extra_object.insert("upstream_response".to_string(), response);
merge_admin_monitoring_trace_response(extra_object, "upstream_response", response);
}
}
@@ -558,6 +558,39 @@ fn admin_monitoring_trace_response_data(
}))
}
fn merge_admin_monitoring_trace_response(
extra_object: &mut serde_json::Map<String, Value>,
key: &str,
response: Value,
) {
let Some(response_object) = response.as_object() else {
extra_object.insert(key.to_string(), response);
return;
};
let Some(existing_object) = extra_object.get_mut(key).and_then(Value::as_object_mut) else {
extra_object.insert(key.to_string(), Value::Object(response_object.clone()));
return;
};
for (field, value) in response_object {
if admin_monitoring_trace_response_value_empty(value)
&& existing_object
.get(field)
.is_some_and(|existing| !admin_monitoring_trace_response_value_empty(existing))
{
continue;
}
existing_object.insert(field.clone(), value.clone());
}
}
fn admin_monitoring_trace_response_value_empty(value: &Value) -> bool {
value.is_null()
|| value.as_str().is_some_and(str::is_empty)
|| value.as_array().is_some_and(Vec::is_empty)
|| value.as_object().is_some_and(serde_json::Map::is_empty)
}
fn admin_monitoring_usage_is_error_node(usage: &StoredRequestUsageAudit) -> bool {
!usage.status.eq_ignore_ascii_case("completed")
|| usage