Expose ranking metadata in request trace

This commit is contained in:
fawney19
2026-04-27 17:16:30 +08:00
parent 3e0293ac28
commit 17f09fc8c1
5 changed files with 191 additions and 7 deletions

View File

@@ -365,6 +365,7 @@ pub fn build_admin_monitoring_trace_request_candidate_payload_with_key_accounts(
"error_message": candidate.error_message,
"latency_ms": candidate.latency_ms,
"concurrent_requests": candidate.concurrent_requests,
"ranking": build_admin_monitoring_trace_candidate_ranking(candidate.extra_data.as_ref()),
"extra_data": build_admin_monitoring_trace_candidate_extra_data(candidate.extra_data.as_ref(), usage),
"created_at": unix_ms_to_rfc3339(candidate.created_at_unix_ms),
"started_at": candidate.started_at_unix_ms.and_then(unix_ms_to_rfc3339),
@@ -417,6 +418,41 @@ fn admin_monitoring_candidate_status_rank(status: RequestCandidateStatus) -> u8
}
}
fn build_admin_monitoring_trace_candidate_ranking(existing: Option<&Value>) -> Value {
let Some(object) = existing.and_then(Value::as_object) else {
return Value::Null;
};
let mut ranking = serde_json::Map::new();
if let Some(ranking_mode) = json_string_field(object, "ranking_mode") {
ranking.insert("mode".to_string(), Value::String(ranking_mode));
}
if let Some(priority_mode) = json_string_field(object, "priority_mode") {
ranking.insert("priority_mode".to_string(), Value::String(priority_mode));
}
if let Some(ranking_index) = json_u64_field(object, "ranking_index") {
ranking.insert("index".to_string(), Value::Number(ranking_index.into()));
}
if let Some(priority_slot) = json_i64_field(object, "priority_slot") {
ranking.insert(
"priority_slot".to_string(),
Value::Number(priority_slot.into()),
);
}
if let Some(promoted_by) = json_string_field(object, "promoted_by") {
ranking.insert("promoted_by".to_string(), Value::String(promoted_by));
}
if let Some(demoted_by) = json_string_field(object, "demoted_by") {
ranking.insert("demoted_by".to_string(), Value::String(demoted_by));
}
if ranking.is_empty() {
Value::Null
} else {
Value::Object(ranking)
}
}
fn build_admin_monitoring_trace_candidate_extra_data(
existing: Option<&Value>,
usage: Option<&StoredRequestUsageAudit>,
@@ -461,6 +497,31 @@ fn build_admin_monitoring_trace_candidate_extra_data(
}
}
fn json_string_field(object: &serde_json::Map<String, Value>, key: &str) -> Option<String> {
object
.get(key)
.and_then(Value::as_str)
.map(str::trim)
.filter(|value| !value.is_empty())
.map(ToOwned::to_owned)
}
fn json_u64_field(object: &serde_json::Map<String, Value>, key: &str) -> Option<u64> {
match object.get(key)? {
Value::Number(value) => value.as_u64(),
Value::String(value) => value.trim().parse::<u64>().ok(),
_ => None,
}
}
fn json_i64_field(object: &serde_json::Map<String, Value>, key: &str) -> Option<i64> {
match object.get(key)? {
Value::Number(value) => value.as_i64().or_else(|| value.as_u64()?.try_into().ok()),
Value::String(value) => value.trim().parse::<i64>().ok(),
_ => None,
}
}
fn parse_admin_monitoring_usage_proxy_timing(usage: &StoredRequestUsageAudit) -> Option<Value> {
admin_monitoring_header_value(usage.response_headers.as_ref(), "x-proxy-timing")
.or_else(|| {