Skip to content

Commit f4cda0d

Browse files
committed
Update.
1 parent 8cfb170 commit f4cda0d

File tree

5 files changed

+86
-47
lines changed

5 files changed

+86
-47
lines changed

cmd/dashboard/controller/common_page.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,7 +1288,10 @@ func (cp *commonPage) ws(c *gin.Context) {
12881288

12891289
// 其他错误表示连接问题
12901290
if !websocket.IsCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure, websocket.CloseNormalClosure) {
1291-
log.Printf("WebSocket读取错误 %s: %v", connID, err)
1291+
// 只在调试模式下输出WebSocket读取错误,正常关闭连接不输出
1292+
if singleton.Conf.Debug {
1293+
log.Printf("WebSocket读取错误 %s: %v", connID, err)
1294+
}
12921295
}
12931296

12941297
// 通知其他goroutine退出
@@ -1372,7 +1375,10 @@ func (cp *commonPage) ws(c *gin.Context) {
13721375

13731376
select {
13741377
case <-done:
1375-
log.Printf("WebSocket所有goroutine正常退出: %s", connID)
1378+
// 正常退出不输出日志,减少日志噪音
1379+
if singleton.Conf.Debug {
1380+
log.Printf("WebSocket所有goroutine正常退出: %s", connID)
1381+
}
13761382
case <-ctx.Done():
13771383
log.Printf("WebSocket上下文取消: %s", connID)
13781384
case <-time.After(30 * time.Minute):
@@ -1384,7 +1390,10 @@ func (cp *commonPage) ws(c *gin.Context) {
13841390
select {
13851391
case <-done:
13861392
case <-time.After(5 * time.Second):
1387-
log.Printf("等待goroutine退出超时: %s", connID)
1393+
// 只在调试模式下输出goroutine超时日志
1394+
if singleton.Conf.Debug {
1395+
log.Printf("等待goroutine退出超时: %s", connID)
1396+
}
13881397
}
13891398
}
13901399

cmd/dashboard/controller/controller.go

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func corsMiddleware(c *gin.Context) {
6565
}
6666

6767
// pprofAuthMiddleware pprof 认证中间件
68-
// 检查用户是否为管理员(需要在 mygin.Authorize 之后使用)
68+
// 与API接口采用相同的授权逻辑:支持Cookie和API Token认证,不要求管理员权限
6969
func pprofAuthMiddleware() gin.HandlerFunc {
7070
return func(c *gin.Context) {
7171
// 从上下文获取用户信息(由 mygin.Authorize 设置)
@@ -80,21 +80,9 @@ func pprofAuthMiddleware() gin.HandlerFunc {
8080
return
8181
}
8282

83-
// 检查是否为管理员用户
84-
if u, ok := user.(*model.User); ok {
85-
if u.SuperAdmin {
86-
// 管理员用户,允许访问
87-
c.Next()
88-
return
89-
}
90-
}
91-
92-
// 非管理员用户,拒绝访问
93-
c.JSON(http.StatusForbidden, gin.H{
94-
"error": "需要管理员权限才能访问性能分析工具",
95-
"code": 403,
96-
})
97-
c.Abort()
83+
// 与API接口相同:只要通过认证即可访问,不要求管理员权限
84+
// 这样Cookie登录用户和API Token用户都能访问
85+
c.Next()
9886
}
9987
}
10088

@@ -148,13 +136,13 @@ func ServeWeb(port uint) *http.Server {
148136

149137
if singleton.Conf.Debug {
150138
gin.SetMode(gin.DebugMode)
151-
// 为 pprof 添加认证保护,只允许管理员访问
139+
// 为 pprof 添加认证保护,与API接口采用相同的授权模式
152140
pprofGroup := r.Group("/debug/pprof")
153141
pprofGroup.Use(mygin.Authorize(mygin.AuthorizeOption{
154142
MemberOnly: true,
155143
AllowAPI: true,
156144
IsPage: false,
157-
Msg: "访问性能分析工具需要管理员权限",
145+
Msg: "访问性能分析工具需要登录",
158146
Btn: "点此登录",
159147
Redirect: "/login",
160148
}))

db/badger_init.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,9 +316,9 @@ func startBadgerDBMaintenanceTasks() {
316316
for {
317317
select {
318318
case <-ticker.C:
319-
// 清理30天前的监控历史记录
319+
// 清理7天前的监控历史记录,减少数据库大小
320320
monitorHistoryOps := NewMonitorHistoryOps(DB)
321-
count, err := monitorHistoryOps.CleanupOldMonitorHistories(30 * 24 * time.Hour)
321+
count, err := monitorHistoryOps.CleanupOldMonitorHistories(7 * 24 * time.Hour)
322322
if err != nil {
323323
log.Printf("清理过期监控历史记录失败: %v", err)
324324
} else if count > 0 {

service/singleton/crontask.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ func InitCronTask() {
2323
Crons = make(map[uint64]*model.Cron)
2424

2525
// 添加基础的系统定时任务 - 修复重复任务注册问题
26-
// 每天凌晨3点清理30天前的数据
26+
// 每天凌晨3点清理累计流量数据(已废弃,保留为空函数)
2727
if _, err := Cron.AddFunc("0 0 3 * * *", func() {
28-
CleanCumulativeTransferData(30)
28+
CleanCumulativeTransferData(7) // 改为7天,保持与监控历史一致
2929
}); err != nil {
3030
panic(err)
3131
}
3232

33-
// 每天的3:30 对 监控记录 和 流量记录 进行清理
33+
// 每天的3:30 对 监控记录 和 流量记录 进行清理(7天前数据)
3434
if _, err := Cron.AddFunc("0 30 3 * * *", func() {
3535
count, err := CleanMonitorHistory() // 处理返回值
3636
if err != nil {

service/singleton/singleton.go

Lines changed: 63 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -702,7 +702,7 @@ func CleanMonitorHistory() (int64, error) {
702702
if db.DB != nil {
703703
// 使用BadgerDB的MonitorHistoryOps清理过期数据
704704
monitorOps := db.NewMonitorHistoryOps(db.DB)
705-
maxAge := 60 * 24 * time.Hour // 60天
705+
maxAge := 7 * 24 * time.Hour // 修改为7天,减少数据库大小
706706
count, err := monitorOps.CleanupOldMonitorHistories(maxAge)
707707
if err != nil {
708708
log.Printf("BadgerDB监控历史清理失败: %v", err)
@@ -743,11 +743,11 @@ func CleanMonitorHistory() (int64, error) {
743743
err := executeWithoutLock(func() error {
744744
batchSize := 25 // 增加批次大小到25(从20增加)
745745
maxRetries := 3 // 减少重试次数,更快失败
746-
cutoffDate := time.Now().AddDate(0, 0, -60) // 延长到60天,避免误删除有效历史数据
746+
cutoffDate := time.Now().AddDate(0, 0, -7) // 修改为7天,减少数据库大小和内存占用
747747
safetyBuffer := time.Now().Add(-6 * time.Hour) // 添加6小时安全缓冲区,避免误删新数据
748748

749749
// 使用非事务方式分批清理,避免长时间事务锁定
750-
// 清理60天前的监控记录,并确保不删除最近6小时的数据
750+
// 清理7天前的监控记录,并确保不删除最近6小时的数据
751751
for {
752752
var count int64
753753
var err error
@@ -884,6 +884,38 @@ func CleanMonitorHistory() (int64, error) {
884884
break
885885
}
886886

887+
// 清理7天前的流量记录
888+
for retry := 0; retry < maxRetries; retry++ {
889+
// 等待确保没有其他操作在进行
890+
time.Sleep(time.Duration(retry*100) * time.Millisecond)
891+
892+
if DB == nil {
893+
return fmt.Errorf("数据库未初始化")
894+
}
895+
result := DB.Exec("DELETE FROM transfers WHERE created_at < ?", cutoffDate)
896+
897+
if result.Error != nil {
898+
err := result.Error
899+
900+
if strings.Contains(err.Error(), "database is locked") ||
901+
strings.Contains(err.Error(), "SQL statements in progress") ||
902+
strings.Contains(err.Error(), "cannot commit") {
903+
if retry < maxRetries-1 {
904+
backoffDelay := time.Duration((retry+1)*1000) * time.Millisecond
905+
log.Printf("数据库忙碌,%v 后重试历史流量记录清理 (%d/%d)", backoffDelay, retry+1, maxRetries)
906+
time.Sleep(backoffDelay)
907+
continue
908+
}
909+
}
910+
911+
log.Printf("清理历史流量记录失败: %v", err)
912+
return err
913+
}
914+
915+
totalCleaned += result.RowsAffected
916+
break
917+
}
918+
887919
if totalCleaned > 0 {
888920
log.Printf("历史数据清理完成,共清理 %d 条记录", totalCleaned)
889921
}
@@ -1208,7 +1240,10 @@ func SaveAllTrafficToDB() {
12081240
// 等待所有批次完成
12091241
wg.Wait()
12101242

1211-
log.Printf("成功保存 %d 个服务器的累计流量数据", len(serverData))
1243+
// 只在调试模式下输出详细的保存日志
1244+
if Conf.Debug {
1245+
log.Printf("成功保存 %d 个服务器的累计流量数据", len(serverData))
1246+
}
12121247
}
12131248

12141249
// SaveAllTrafficToBadgerDB 保存所有服务器的累计流量到BadgerDB
@@ -1292,7 +1327,10 @@ func SaveAllTrafficToBadgerDB() {
12921327
// 等待所有批次完成
12931328
wg.Wait()
12941329

1295-
log.Printf("BadgerDB: 成功保存 %d 个服务器的累计流量数据", successCount)
1330+
// 只在调试模式下输出详细的保存日志
1331+
if Conf.Debug {
1332+
log.Printf("BadgerDB: 成功保存 %d 个服务器的累计流量数据", successCount)
1333+
}
12961334
}
12971335

12981336
// SaveAllDataToDB 保存所有数据到数据库,确保数据永久化
@@ -1399,7 +1437,10 @@ func SaveAllServerDataToDB() {
13991437
}
14001438
}
14011439

1402-
log.Printf("BadgerDB: 成功保存 %d 个服务器的完整数据", successCount)
1440+
// 只在调试模式下输出详细的保存日志
1441+
if Conf.Debug {
1442+
log.Printf("BadgerDB: 成功保存 %d 个服务器的完整数据", successCount)
1443+
}
14031444
}
14041445

14051446
// SaveAllUserDataToDB 保存所有用户数据到BadgerDB
@@ -1428,7 +1469,10 @@ func SaveAllUserDataToDB() {
14281469
}
14291470
}
14301471

1431-
log.Printf("BadgerDB: 成功保存 %d 个用户的数据", successCount)
1472+
// 只在调试模式下输出详细的保存日志
1473+
if Conf.Debug {
1474+
log.Printf("BadgerDB: 成功保存 %d 个用户的数据", successCount)
1475+
}
14321476
}
14331477

14341478
// SaveAllDDNSStateToDB 保存所有DDNS状态到BadgerDB
@@ -1438,7 +1482,10 @@ func SaveAllDDNSStateToDB() {
14381482
}
14391483

14401484
// DDNS状态通常在变更时已经保存,这里只是确保一致性
1441-
log.Printf("BadgerDB: DDNS状态数据已在变更时保存")
1485+
// 只在调试模式下输出详细的保存日志
1486+
if Conf.Debug {
1487+
log.Printf("BadgerDB: DDNS状态数据已在变更时保存")
1488+
}
14421489
}
14431490

14441491
// SaveAllAPITokensToDB 保存所有API令牌到BadgerDB
@@ -1515,7 +1562,10 @@ func SaveAllAPITokensToDB() {
15151562
}
15161563

15171564
if successCount > 0 || skipCount > 0 || deleteCount > 0 {
1518-
log.Printf("BadgerDB: 成功保存 %d 个API令牌,跳过 %d 个已存在的令牌,删除 %d 个过期令牌", successCount, skipCount, deleteCount)
1565+
// 只在调试模式下输出详细的保存日志
1566+
if Conf.Debug {
1567+
log.Printf("BadgerDB: 成功保存 %d 个API令牌,跳过 %d 个已存在的令牌,删除 %d 个过期令牌", successCount, skipCount, deleteCount)
1568+
}
15191569
}
15201570
}
15211571

@@ -2255,9 +2305,7 @@ func executeDBInsertRequest(req DBInsertRequest) error {
22552305
// 特殊处理monitor_histories表,确保不使用@id字段
22562306
if req.TableName == "monitor_histories" {
22572307
// 移除@id字段如果存在
2258-
if _, exists := req.Data["@id"]; exists {
2259-
delete(req.Data, "@id")
2260-
}
2308+
delete(req.Data, "@id")
22612309

22622310
// 避免直接使用GORM的Create方法,改用手动SQL
22632311
fields, values, args := prepareInsertSQL(req.Data)
@@ -2524,9 +2572,7 @@ func StartMonitorHistoryWorker() {
25242572
go func() {
25252573
for req := range monitorHistoryQueue {
25262574
// 确保没有使用@id字段
2527-
if _, exists := req.Data["@id"]; exists {
2528-
delete(req.Data, "@id")
2529-
}
2575+
delete(req.Data, "@id")
25302576

25312577
// 增加更多字段检查和验证
25322578
var monitorID uint64
@@ -2663,9 +2709,7 @@ func StartBadgerMonitorHistoryWorker() {
26632709
go func() {
26642710
for req := range monitorHistoryQueue {
26652711
// 确保没有使用@id字段
2666-
if _, exists := req.Data["@id"]; exists {
2667-
delete(req.Data, "@id")
2668-
}
2712+
delete(req.Data, "@id")
26692713

26702714
// 转换数据为MonitorHistory结构
26712715
history := &model.MonitorHistory{
@@ -3019,9 +3063,7 @@ func batchInsertMonitorHistories(requests []DBInsertRequest) error {
30193063
allData := make([]map[string]interface{}, len(requests))
30203064
for i, req := range requests {
30213065
// 移除@id字段
3022-
if _, exists := req.Data["@id"]; exists {
3023-
delete(req.Data, "@id")
3024-
}
3066+
delete(req.Data, "@id")
30253067
allData[i] = req.Data
30263068
}
30273069

0 commit comments

Comments
 (0)