package controller import ( "net/http" "os" "path/filepath" "runtime" "github.com/QuantumNous/new-api/common" "github.com/gin-gonic/gin" ) // PerformanceStats 性能统计信息 type PerformanceStats struct { // 缓存统计 CacheStats common.DiskCacheStats `json:"cache_stats"` // 系统内存统计 MemoryStats MemoryStats `json:"memory_stats"` // 磁盘缓存目录信息 DiskCacheInfo DiskCacheInfo `json:"disk_cache_info"` // 磁盘空间信息 DiskSpaceInfo DiskSpaceInfo `json:"disk_space_info"` // 配置信息 Config PerformanceConfig `json:"config"` } // MemoryStats 内存统计 type MemoryStats struct { // 已分配内存(字节) Alloc uint64 `json:"alloc"` // 总分配内存(字节) TotalAlloc uint64 `json:"total_alloc"` // 系统内存(字节) Sys uint64 `json:"sys"` // GC 次数 NumGC uint32 `json:"num_gc"` // Goroutine 数量 NumGoroutine int `json:"num_goroutine"` } // DiskCacheInfo 磁盘缓存目录信息 type DiskCacheInfo struct { // 缓存目录路径 Path string `json:"path"` // 目录是否存在 Exists bool `json:"exists"` // 文件数量 FileCount int `json:"file_count"` // 总大小(字节) TotalSize int64 `json:"total_size"` } // DiskSpaceInfo 磁盘空间信息 type DiskSpaceInfo struct { // 总空间(字节) Total uint64 `json:"total"` // 可用空间(字节) Free uint64 `json:"free"` // 已用空间(字节) Used uint64 `json:"used"` // 使用百分比 UsedPercent float64 `json:"used_percent"` } // PerformanceConfig 性能配置 type PerformanceConfig struct { // 是否启用磁盘缓存 DiskCacheEnabled bool `json:"disk_cache_enabled"` // 磁盘缓存阈值(MB) DiskCacheThresholdMB int `json:"disk_cache_threshold_mb"` // 磁盘缓存最大大小(MB) DiskCacheMaxSizeMB int `json:"disk_cache_max_size_mb"` // 磁盘缓存路径 DiskCachePath string `json:"disk_cache_path"` // 是否在容器中运行 IsRunningInContainer bool `json:"is_running_in_container"` } // GetPerformanceStats 获取性能统计信息 func GetPerformanceStats(c *gin.Context) { // 获取缓存统计 cacheStats := common.GetDiskCacheStats() // 获取内存统计 var memStats runtime.MemStats runtime.ReadMemStats(&memStats) // 获取磁盘缓存目录信息 diskCacheInfo := getDiskCacheInfo() // 获取配置信息 diskConfig := common.GetDiskCacheConfig() config := PerformanceConfig{ DiskCacheEnabled: diskConfig.Enabled, DiskCacheThresholdMB: diskConfig.ThresholdMB, DiskCacheMaxSizeMB: diskConfig.MaxSizeMB, DiskCachePath: diskConfig.Path, IsRunningInContainer: common.IsRunningInContainer(), } // 获取磁盘空间信息 diskSpaceInfo := getDiskSpaceInfo() stats := PerformanceStats{ CacheStats: cacheStats, MemoryStats: MemoryStats{ Alloc: memStats.Alloc, TotalAlloc: memStats.TotalAlloc, Sys: memStats.Sys, NumGC: memStats.NumGC, NumGoroutine: runtime.NumGoroutine(), }, DiskCacheInfo: diskCacheInfo, DiskSpaceInfo: diskSpaceInfo, Config: config, } c.JSON(http.StatusOK, gin.H{ "success": true, "data": stats, }) } // ClearDiskCache 清理磁盘缓存 func ClearDiskCache(c *gin.Context) { cachePath := common.GetDiskCachePath() if cachePath == "" { cachePath = os.TempDir() } dir := filepath.Join(cachePath, "new-api-body-cache") // 删除缓存目录 err := os.RemoveAll(dir) if err != nil && !os.IsNotExist(err) { common.ApiError(c, err) return } // 重置统计 common.ResetDiskCacheStats() c.JSON(http.StatusOK, gin.H{ "success": true, "message": "磁盘缓存已清理", }) } // ResetPerformanceStats 重置性能统计 func ResetPerformanceStats(c *gin.Context) { common.ResetDiskCacheStats() c.JSON(http.StatusOK, gin.H{ "success": true, "message": "统计信息已重置", }) } // ForceGC 强制执行 GC func ForceGC(c *gin.Context) { runtime.GC() c.JSON(http.StatusOK, gin.H{ "success": true, "message": "GC 已执行", }) } // getDiskCacheInfo 获取磁盘缓存目录信息 func getDiskCacheInfo() DiskCacheInfo { cachePath := common.GetDiskCachePath() if cachePath == "" { cachePath = os.TempDir() } dir := filepath.Join(cachePath, "new-api-body-cache") info := DiskCacheInfo{ Path: dir, Exists: false, } entries, err := os.ReadDir(dir) if err != nil { return info } info.Exists = true info.FileCount = 0 info.TotalSize = 0 for _, entry := range entries { if entry.IsDir() { continue } info.FileCount++ if fileInfo, err := entry.Info(); err == nil { info.TotalSize += fileInfo.Size() } } return info }