feat: expose sub2api timeout timing diagnostics

This commit is contained in:
Codex
2026-07-14 06:51:24 +02:00
parent a91238c200
commit b9ede0471e
6 changed files with 265 additions and 5 deletions
@@ -3145,6 +3145,25 @@ def run_trace():
"latencyMs": native_request.get("duration_ms"),
"source": "sub2api-native-admin-ops-requests",
}
reference_at = request_start.get("at") if isinstance(request_start, dict) else None
reference_epoch = log_time_epoch({"_at": reference_at}) if isinstance(reference_at, str) else first_epoch
reference_source = "request-start" if isinstance(reference_at, str) and reference_epoch is not None else "first-matched-event"
native_duration_ms = native_request.get("duration_ms") if isinstance(native_request, dict) else None
if not isinstance(native_duration_ms, int) and isinstance(final_event, dict):
native_duration_ms = final_event.get("latencyMs")
if (
isinstance(request_start, dict)
and request_start.get("source") == "sub2api-native-admin-ops-requests"
and isinstance(native_duration_ms, int)
and native_duration_ms >= 0
and reference_epoch is not None
):
reference_epoch -= native_duration_ms / 1000
reference_at = datetime.fromtimestamp(reference_epoch, timezone.utc).isoformat().replace("+00:00", "Z")
reference_source = "native-completion-minus-duration"
for event in events:
epoch = log_time_epoch({"_at": event.get("at")}) if isinstance(event.get("at"), str) else None
event["elapsedMs"] = round((epoch - reference_epoch) * 1000) if epoch is not None and reference_epoch is not None else None
failovers = [item for item in events if item.get("type") == "failover"]
select_failures = [item for item in events if item.get("type") == "select-failed"]
upstream_errors = [item for item in events if item.get("type") == "upstream-error"]
@@ -3157,6 +3176,11 @@ def run_trace():
window_select_failures = [item for item in window_events if item.get("type") == "select-failed"]
window_forward_failures = [item for item in window_events if item.get("type") == "forward-failed"]
untried_schedulable_accounts = trace_untried_schedulable_accounts(failovers, final_event or {}, account_snapshot)
first_failover_elapsed = failovers[0].get("elapsedMs") if failovers else None
first_select_failed_elapsed = select_failures[0].get("elapsedMs") if select_failures else None
final_epoch = log_time_epoch({"_at": final_event.get("at")}) if isinstance(final_event, dict) and isinstance(final_event.get("at"), str) else None
final_elapsed = round((final_epoch - reference_epoch) * 1000) if final_epoch is not None and reference_epoch is not None else None
failover_to_final = final_elapsed - first_failover_elapsed if isinstance(final_elapsed, int) and isinstance(first_failover_elapsed, int) else None
reason = trace_reason(events, final_event)
if not matched:
outcome = "not-found"
@@ -3220,6 +3244,17 @@ def run_trace():
"diagnostics": {
"failoverBudgetExhausted": failover_budget_exhausted(failovers, final_event or {}),
"untriedSchedulableAccounts": untried_schedulable_accounts,
"timing": {
"referenceAt": reference_at if isinstance(reference_at, str) else (events[0].get("at") if events else None),
"referenceSource": reference_source,
"firstFailoverElapsedMs": first_failover_elapsed,
"firstSelectFailedElapsedMs": first_select_failed_elapsed,
"finalElapsedMs": final_elapsed,
"failoverToFinalMs": failover_to_final,
"clientDeadlineAvailable": False,
"clientDeadlineRemainingMs": None,
"attribution": "Elapsed values come from indexed event timestamps. The client deadline is not present in Sub2API Ops records, so remaining request budget cannot be calculated.",
},
},
"accountSnapshot": account_snapshot,
"accountSnapshotError": account_snapshot_error,