feat: expose sub2api timeout timing diagnostics
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user