**新增功能**: - 新建ops_upstream_error_events表存储上游服务错误详情 - 支持记录上游429/529/5xx错误的详细上下文信息 - 提供按时间范围查询上游错误事件的API **后端改动**: 1. 模型层(ops_models.go, ops_port.go): - 新增UpstreamErrorEvent结构体 - 扩展Repository接口支持上游错误事件CRUD 2. 仓储层(ops_repo.go): - 实现InsertUpstreamErrorEvent写入上游错误 - 实现GetUpstreamErrorEvents按时间范围查询 3. 服务层(ops_service.go, ops_upstream_context.go): - ops_service: 新增GetUpstreamErrorEvents查询方法 - ops_upstream_context: 封装上游错误上下文构建逻辑 4. Handler层(ops_error_logger.go): - 新增GetUpstreamErrorsHandler处理上游错误查询请求 5. Gateway层集成: - antigravity_gateway_service.go: 429/529错误时记录上游事件 - gateway_service.go: OpenAI 429/5xx错误时记录 - gemini_messages_compat_service.go: Gemini 429/5xx错误时记录 - openai_gateway_service.go: OpenAI 429/5xx错误时记录 - ratelimit_service.go: 429限流错误时记录 **数据记录字段**: - request_id: 关联ops_logs主记录 - platform/model: 上游服务标识 - status_code/error_message: 错误详情 - request_headers/response_body: 调试信息(可选) - created_at: 错误发生时间
125 lines
3.5 KiB
Go
125 lines
3.5 KiB
Go
package service
|
|
|
|
import "time"
|
|
|
|
type OpsErrorLog struct {
|
|
ID int64 `json:"id"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
|
|
Phase string `json:"phase"`
|
|
Type string `json:"type"`
|
|
Severity string `json:"severity"`
|
|
|
|
StatusCode int `json:"status_code"`
|
|
Platform string `json:"platform"`
|
|
Model string `json:"model"`
|
|
|
|
LatencyMs *int `json:"latency_ms"`
|
|
|
|
ClientRequestID string `json:"client_request_id"`
|
|
RequestID string `json:"request_id"`
|
|
Message string `json:"message"`
|
|
|
|
UserID *int64 `json:"user_id"`
|
|
APIKeyID *int64 `json:"api_key_id"`
|
|
AccountID *int64 `json:"account_id"`
|
|
GroupID *int64 `json:"group_id"`
|
|
|
|
ClientIP *string `json:"client_ip"`
|
|
RequestPath string `json:"request_path"`
|
|
Stream bool `json:"stream"`
|
|
}
|
|
|
|
type OpsErrorLogDetail struct {
|
|
OpsErrorLog
|
|
|
|
ErrorBody string `json:"error_body"`
|
|
UserAgent string `json:"user_agent"`
|
|
|
|
// Upstream context (optional)
|
|
UpstreamStatusCode *int `json:"upstream_status_code,omitempty"`
|
|
UpstreamErrorMessage string `json:"upstream_error_message,omitempty"`
|
|
UpstreamErrorDetail string `json:"upstream_error_detail,omitempty"`
|
|
UpstreamErrors string `json:"upstream_errors,omitempty"` // JSON array (string) for display/parsing
|
|
|
|
// Timings (optional)
|
|
AuthLatencyMs *int64 `json:"auth_latency_ms"`
|
|
RoutingLatencyMs *int64 `json:"routing_latency_ms"`
|
|
UpstreamLatencyMs *int64 `json:"upstream_latency_ms"`
|
|
ResponseLatencyMs *int64 `json:"response_latency_ms"`
|
|
TimeToFirstTokenMs *int64 `json:"time_to_first_token_ms"`
|
|
|
|
// Retry context
|
|
RequestBody string `json:"request_body"`
|
|
RequestBodyTruncated bool `json:"request_body_truncated"`
|
|
RequestBodyBytes *int `json:"request_body_bytes"`
|
|
RequestHeaders string `json:"request_headers,omitempty"`
|
|
|
|
// vNext metric semantics
|
|
IsBusinessLimited bool `json:"is_business_limited"`
|
|
}
|
|
|
|
type OpsErrorLogFilter struct {
|
|
StartTime *time.Time
|
|
EndTime *time.Time
|
|
|
|
Platform string
|
|
GroupID *int64
|
|
AccountID *int64
|
|
|
|
StatusCodes []int
|
|
Phase string
|
|
Query string
|
|
|
|
Page int
|
|
PageSize int
|
|
}
|
|
|
|
type OpsErrorLogList struct {
|
|
Errors []*OpsErrorLog `json:"errors"`
|
|
Total int `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
}
|
|
|
|
type OpsRetryAttempt struct {
|
|
ID int64 `json:"id"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
|
|
RequestedByUserID int64 `json:"requested_by_user_id"`
|
|
SourceErrorID int64 `json:"source_error_id"`
|
|
Mode string `json:"mode"`
|
|
PinnedAccountID *int64 `json:"pinned_account_id"`
|
|
|
|
Status string `json:"status"`
|
|
StartedAt *time.Time `json:"started_at"`
|
|
FinishedAt *time.Time `json:"finished_at"`
|
|
DurationMs *int64 `json:"duration_ms"`
|
|
|
|
ResultRequestID *string `json:"result_request_id"`
|
|
ResultErrorID *int64 `json:"result_error_id"`
|
|
|
|
ErrorMessage *string `json:"error_message"`
|
|
}
|
|
|
|
type OpsRetryResult struct {
|
|
AttemptID int64 `json:"attempt_id"`
|
|
Mode string `json:"mode"`
|
|
Status string `json:"status"`
|
|
|
|
PinnedAccountID *int64 `json:"pinned_account_id"`
|
|
UsedAccountID *int64 `json:"used_account_id"`
|
|
|
|
HTTPStatusCode int `json:"http_status_code"`
|
|
UpstreamRequestID string `json:"upstream_request_id"`
|
|
|
|
ResponsePreview string `json:"response_preview"`
|
|
ResponseTruncated bool `json:"response_truncated"`
|
|
|
|
ErrorMessage string `json:"error_message"`
|
|
|
|
StartedAt time.Time `json:"started_at"`
|
|
FinishedAt time.Time `json:"finished_at"`
|
|
DurationMs int64 `json:"duration_ms"`
|
|
}
|