Files
urldb/handlers/stats_handler.go

102 lines
2.8 KiB
Go
Raw Normal View History

2025-07-10 13:58:28 +08:00
package handlers
import (
2025-07-11 17:45:16 +08:00
"runtime"
"time"
2025-07-10 13:58:28 +08:00
2025-07-18 09:42:07 +08:00
"github.com/ctwj/urldb/db"
"github.com/ctwj/urldb/db/entity"
2025-07-23 12:31:45 +08:00
"github.com/ctwj/urldb/utils"
2025-07-10 13:58:28 +08:00
"github.com/gin-gonic/gin"
)
2025-07-11 17:45:16 +08:00
// GetStats 获取基础统计信息
2025-07-10 13:58:28 +08:00
func GetStats(c *gin.Context) {
2025-07-11 18:37:28 +08:00
// 设置响应头,启用缓存
c.Header("Cache-Control", "public, max-age=60") // 1分钟缓存
2025-07-11 17:45:16 +08:00
// 获取数据库统计
var totalResources, totalCategories, totalTags, totalViews int64
db.DB.Model(&entity.Resource{}).Count(&totalResources)
db.DB.Model(&entity.Category{}).Count(&totalCategories)
db.DB.Model(&entity.Tag{}).Count(&totalTags)
db.DB.Model(&entity.Resource{}).Select("COALESCE(SUM(view_count), 0)").Scan(&totalViews)
2025-07-10 13:58:28 +08:00
2025-07-20 11:00:17 +08:00
// 获取今日更新数量
var todayUpdates int64
today := time.Now().Format("2006-01-02")
db.DB.Model(&entity.Resource{}).Where("DATE(updated_at) = ?", today).Count(&todayUpdates)
2025-07-11 17:45:16 +08:00
SuccessResponse(c, gin.H{
"total_resources": totalResources,
"total_categories": totalCategories,
"total_tags": totalTags,
"total_views": totalViews,
2025-07-20 11:00:17 +08:00
"today_updates": todayUpdates,
2025-07-11 17:45:16 +08:00
})
}
2025-07-10 13:58:28 +08:00
2025-07-11 17:45:16 +08:00
// GetPerformanceStats 获取性能监控信息
func GetPerformanceStats(c *gin.Context) {
var m runtime.MemStats
runtime.ReadMemStats(&m)
2025-07-10 13:58:28 +08:00
2025-07-11 17:45:16 +08:00
// 获取数据库连接池状态
sqlDB, err := db.DB.DB()
var dbStats gin.H
if err == nil {
2025-07-23 12:31:45 +08:00
stats := sqlDB.Stats()
2025-07-11 17:45:16 +08:00
dbStats = gin.H{
2025-07-23 12:31:45 +08:00
"max_open_connections": stats.MaxOpenConnections,
"open_connections": stats.OpenConnections,
"in_use": stats.InUse,
"idle": stats.Idle,
"wait_count": stats.WaitCount,
"wait_duration": stats.WaitDuration,
2025-07-11 17:45:16 +08:00
}
2025-07-23 12:31:45 +08:00
// 添加调试日志
utils.Info("数据库连接池状态 - MaxOpen: %d, Open: %d, InUse: %d, Idle: %d",
stats.MaxOpenConnections, stats.OpenConnections, stats.InUse, stats.Idle)
2025-07-11 17:45:16 +08:00
} else {
dbStats = gin.H{
2025-07-23 12:31:45 +08:00
"error": "无法获取数据库连接池状态: " + err.Error(),
2025-07-11 17:45:16 +08:00
}
2025-07-23 12:31:45 +08:00
utils.Error("获取数据库连接池状态失败: %v", err)
2025-07-10 13:58:28 +08:00
}
2025-07-11 17:45:16 +08:00
SuccessResponse(c, gin.H{
"timestamp": time.Now().Unix(),
"memory": gin.H{
"alloc": m.Alloc,
"total_alloc": m.TotalAlloc,
"sys": m.Sys,
"num_gc": m.NumGC,
"heap_alloc": m.HeapAlloc,
"heap_sys": m.HeapSys,
"heap_idle": m.HeapIdle,
"heap_inuse": m.HeapInuse,
},
"goroutines": runtime.NumGoroutine(),
"database": dbStats,
"system": gin.H{
"cpu_count": runtime.NumCPU(),
"go_version": runtime.Version(),
},
})
}
2025-07-10 13:58:28 +08:00
2025-07-11 17:45:16 +08:00
// GetSystemInfo 获取系统信息
func GetSystemInfo(c *gin.Context) {
SuccessResponse(c, gin.H{
"uptime": time.Since(startTime).String(),
"start_time": startTime.Format("2006-01-02 15:04:05"),
2025-07-27 08:06:55 +08:00
"version": utils.Version,
2025-07-11 17:45:16 +08:00
"environment": gin.H{
"gin_mode": gin.Mode(),
},
})
2025-07-10 13:58:28 +08:00
}
2025-07-11 17:45:16 +08:00
// 记录启动时间
var startTime = time.Now()