feat: expose retry priority in retry chain

This commit is contained in:
2026-05-30 14:25:29 +08:00
parent a6f1be8f07
commit 8ee7a7969e
4 changed files with 56 additions and 23 deletions
+22 -3
View File
@@ -4,6 +4,8 @@ import (
"context"
"fmt"
"time"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
)
func failureTraceEntry(err error, retryable bool) map[string]any {
@@ -17,21 +19,23 @@ func failureTraceEntryWithReason(err error, retryable bool, scope string, reason
return entry
}
func retryTraceEntry(decision retryDecision, action string, clientAttempt int, maxAttempts int) map[string]any {
func retryTraceEntry(candidate store.RuntimeModelCandidate, decision retryDecision, action string, clientAttempt int, maxAttempts int) map[string]any {
entry := policyTraceEntry("same_client_retry", "same_client", action, decision.Reason, decision.Match, decision.Info)
entry["retry"] = decision.Retry
entry["clientAttempt"] = clientAttempt
entry["maxAttempts"] = maxAttempts
addCandidatePriorityTraceFields(entry, candidate)
return entry
}
func failoverTraceEntry(decision failoverDecision) map[string]any {
func failoverTraceEntry(decision failoverDecision, candidate store.RuntimeModelCandidate) map[string]any {
event := "failover_next"
if !decision.Retry {
event = "failover_stop"
}
entry := policyTraceEntry(event, "next_platform", decision.Action, decision.Reason, decision.Match, decision.Info)
entry["retry"] = decision.Retry
addCandidatePriorityTraceFields(entry, candidate)
if decision.CooldownSeconds > 0 {
entry["cooldownSeconds"] = decision.CooldownSeconds
}
@@ -49,7 +53,7 @@ func priorityDemoteTraceEntry(decision priorityDemoteDecision, platformID string
return entry
}
func failoverTimeBudgetTraceEntry(elapsedSeconds int, maxDurationSeconds int, info failureInfo) map[string]any {
func failoverTimeBudgetTraceEntry(elapsedSeconds int, maxDurationSeconds int, info failureInfo, candidate store.RuntimeModelCandidate) map[string]any {
entry := policyTraceEntry("failover_stop", "next_platform", "stop", "failover_time_budget_exceeded", policyRuleMatch{
Source: "gateway_runner_policies.failover_policy",
Policy: "failoverPolicy",
@@ -58,9 +62,24 @@ func failoverTimeBudgetTraceEntry(elapsedSeconds int, maxDurationSeconds int, in
}, info)
entry["elapsedSeconds"] = elapsedSeconds
entry["maxDurationSeconds"] = maxDurationSeconds
addCandidatePriorityTraceFields(entry, candidate)
return entry
}
func addCandidatePriorityTraceFields(entry map[string]any, candidate store.RuntimeModelCandidate) {
if entry == nil {
return
}
entry["currentPriority"] = candidate.PlatformPriority
entry["platformPriority"] = candidate.PlatformPriority
if candidate.PlatformID != "" {
entry["currentPlatformId"] = candidate.PlatformID
}
if candidate.PlatformName != "" {
entry["currentPlatformName"] = candidate.PlatformName
}
}
func policyTraceEntry(event string, scope string, action string, reason string, match policyRuleMatch, info failureInfo) map[string]any {
entry := map[string]any{
"event": event,