package middleware import ( "errors" "net/http" "strings" "github.com/QuantumNous/new-api/common" "github.com/QuantumNous/new-api/types" "github.com/gin-gonic/gin" ) // SystemPerformanceCheck 检查系统性能中间件 func SystemPerformanceCheck() gin.HandlerFunc { return func(c *gin.Context) { // 仅检查 Relay 接口 (/v1, /v1beta 等) // 这里简单判断路径前缀,可以根据实际路由调整 path := c.Request.URL.Path if strings.HasPrefix(path, "/v1/messages") { if err := checkSystemPerformance(); err != nil { c.JSON(err.StatusCode, gin.H{ "error": err.ToClaudeError(), }) c.Abort() return } } else { if err := checkSystemPerformance(); err != nil { c.JSON(err.StatusCode, gin.H{ "error": err.ToOpenAIError(), }) c.Abort() return } } c.Next() } } // checkSystemPerformance 检查系统性能是否超过阈值 func checkSystemPerformance() *types.NewAPIError { config := common.GetPerformanceMonitorConfig() if !config.Enabled { return nil } status := common.GetSystemStatus() // 检查 CPU if config.CPUThreshold > 0 && int(status.CPUUsage) > config.CPUThreshold { return types.NewErrorWithStatusCode(errors.New("system cpu overloaded"), "system_cpu_overloaded", http.StatusServiceUnavailable) } // 检查内存 if config.MemoryThreshold > 0 && int(status.MemoryUsage) > config.MemoryThreshold { return types.NewErrorWithStatusCode(errors.New("system memory overloaded"), "system_memory_overloaded", http.StatusServiceUnavailable) } // 检查磁盘 if config.DiskThreshold > 0 && int(status.DiskUsage) > config.DiskThreshold { return types.NewErrorWithStatusCode(errors.New("system disk overloaded"), "system_disk_overloaded", http.StatusServiceUnavailable) } return nil }