| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 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
- }
|