feat(ops): 添加QPS脉搏线图并优化指标布局
- 添加实时QPS/TPS历史数据追踪(最近60个数据点) - 在平均QPS/TPS上方添加SVG脉搏线图(sparkline) - 将延迟和TTFT卡片的指标布局从2列改为3列 - 恢复Max指标显示(P95/P90/P50/Avg/Max)
This commit is contained in:
@@ -135,6 +135,34 @@ func (s *OpsService) RecordError(ctx context.Context, entry *OpsInsertErrorLogIn
|
||||
entry.ErrorBody = sanitized
|
||||
}
|
||||
|
||||
// Sanitize upstream error context if provided by gateway services.
|
||||
if entry.UpstreamStatusCode != nil && *entry.UpstreamStatusCode <= 0 {
|
||||
entry.UpstreamStatusCode = nil
|
||||
}
|
||||
if entry.UpstreamErrorMessage != nil {
|
||||
msg := strings.TrimSpace(*entry.UpstreamErrorMessage)
|
||||
msg = sanitizeUpstreamErrorMessage(msg)
|
||||
msg = truncateString(msg, 2048)
|
||||
if strings.TrimSpace(msg) == "" {
|
||||
entry.UpstreamErrorMessage = nil
|
||||
} else {
|
||||
entry.UpstreamErrorMessage = &msg
|
||||
}
|
||||
}
|
||||
if entry.UpstreamErrorDetail != nil {
|
||||
detail := strings.TrimSpace(*entry.UpstreamErrorDetail)
|
||||
if detail == "" {
|
||||
entry.UpstreamErrorDetail = nil
|
||||
} else {
|
||||
sanitized, _ := sanitizeErrorBodyForStorage(detail, opsMaxStoredErrorBodyBytes)
|
||||
if strings.TrimSpace(sanitized) == "" {
|
||||
entry.UpstreamErrorDetail = nil
|
||||
} else {
|
||||
entry.UpstreamErrorDetail = &sanitized
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := s.opsRepo.InsertErrorLog(ctx, entry); err != nil {
|
||||
// Never bubble up to gateway; best-effort logging.
|
||||
log.Printf("[Ops] RecordError failed: %v", err)
|
||||
|
||||
Reference in New Issue
Block a user