mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-01 17:00:21 +08:00
Expose ranking metadata in request trace
This commit is contained in:
@@ -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(|| {
|
||||
|
||||
Reference in New Issue
Block a user