Skip to content

Commit 71dc8ea

Browse files
committed
Update.
1 parent 277bd06 commit 71dc8ea

File tree

7 files changed

+900
-427
lines changed

7 files changed

+900
-427
lines changed

resource/template/theme-default/network.html

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,16 +105,40 @@
105105
return [pt[0], '10%'];
106106
},
107107
formatter: function(params){
108+
if (!params || params.length === 0) {
109+
return '';
110+
}
111+
108112
let result = params[0].axisValueLabel + "<br />";
109-
params.forEach(function(item){
110-
result += item.marker + item.seriesName + ": " + item.value[1].toFixed(2) + " ms<br />";
111-
})
113+
114+
// 优化:显示所有监控点在该时间的数据
115+
// 按监控点名称排序,确保显示顺序一致
116+
const sortedParams = params.sort((a, b) => {
117+
return a.seriesName.localeCompare(b.seriesName);
118+
});
119+
120+
sortedParams.forEach(function(item){
121+
if (item.value && item.value[1] !== undefined) {
122+
const delay = parseFloat(item.value[1]);
123+
const displayDelay = isNaN(delay) ? '超时' : delay.toFixed(2) + ' ms';
124+
result += item.marker + item.seriesName + ": " + displayDelay + "<br />";
125+
}
126+
});
127+
112128
return result;
113129
},
114130
confine: true,
115131
transitionDuration: 0,
116132
z: 10,
117-
zlevel: 1
133+
zlevel: 1,
134+
// 优化:确保显示所有数据系列
135+
showContent: true,
136+
axisPointer: {
137+
type: 'cross',
138+
crossStyle: {
139+
color: '#999'
140+
}
141+
}
118142
},
119143
title: {
120144
left: 'center',

service/servicesentinel/servicesentinel.go

Lines changed: 0 additions & 45 deletions
This file was deleted.

service/singleton/api.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -457,9 +457,9 @@ func (m *MonitorAPIService) GetMonitorHistories(search map[string]any) []*model.
457457
return make([]*model.MonitorHistory, 0)
458458
}
459459

460-
// 性能优化:获取时间范围(减少到最近3天
460+
// 性能优化:获取时间范围(获取最近3天
461461
endTime := time.Now()
462-
startTime := endTime.AddDate(0, 0, -3)
462+
startTime := endTime.Add(-72 * time.Hour) // 3天数据,与其他接口保持一致
463463

464464
// 使用更高效的查询方法,避免全表扫描
465465
monitorOps := db.NewMonitorHistoryOps(db.DB)
@@ -469,9 +469,9 @@ func (m *MonitorAPIService) GetMonitorHistories(search map[string]any) []*model.
469469
if ServiceSentinelShared != nil {
470470
monitors := ServiceSentinelShared.Monitors()
471471
for _, monitor := range monitors {
472-
// 使用针对性查询,限制每个监控器的记录数量
472+
// 移除记录数量限制,返回所有记录
473473
monitorHistories, err := monitorOps.GetMonitorHistoriesByServerAndMonitor(
474-
serverID, monitor.ID, startTime, endTime, 500) // 限制每个监控器最多500条
474+
serverID, monitor.ID, startTime, endTime, 0) // 0表示不限制记录数量
475475
if err != nil {
476476
log.Printf("MonitorAPIService.GetMonitorHistories: 查询监控器 %d 失败: %v", monitor.ID, err)
477477
continue

service/singleton/badger_adapter.go

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -328,25 +328,48 @@ func startBadgerDBMaintenanceTasks() {
328328
// BadgerDB自己会管理GC等维护任务
329329
// 这里可以启动其他自定义的维护任务
330330

331-
// 例如定期清理过期的监控历史记录
332-
go func() {
333-
ticker := time.NewTicker(24 * time.Hour)
334-
defer ticker.Stop()
335-
336-
for {
337-
select {
338-
case <-ticker.C:
339-
// 清理30天前的监控历史记录
340-
monitorHistoryOps := db.NewMonitorHistoryOps(db.DB)
341-
count, err := monitorHistoryOps.CleanupOldMonitorHistories(30 * 24 * time.Hour)
342-
if err != nil {
343-
log.Printf("清理过期监控历史记录失败: %v", err)
344-
} else if count > 0 {
345-
log.Printf("已清理 %d 条过期的监控历史记录", count)
331+
// 使用worker池处理定期清理任务
332+
if ServiceSentinelShared != nil {
333+
ServiceSentinelShared.SubmitOptimizedTask("badger_maintenance", nil, func() error {
334+
ticker := time.NewTicker(24 * time.Hour)
335+
defer ticker.Stop()
336+
337+
for {
338+
select {
339+
case <-ticker.C:
340+
// 清理30天前的监控历史记录
341+
monitorHistoryOps := db.NewMonitorHistoryOps(db.DB)
342+
count, err := monitorHistoryOps.CleanupOldMonitorHistories(30 * 24 * time.Hour)
343+
if err != nil {
344+
log.Printf("清理过期监控历史记录失败: %v", err)
345+
} else if count > 0 {
346+
log.Printf("已清理 %d 条过期的监控历史记录", count)
347+
}
346348
}
347349
}
348-
}
349-
}()
350+
})
351+
} else {
352+
// 如果ServiceSentinel未初始化,使用传统方式
353+
log.Printf("警告:ServiceSentinel未初始化,使用传统goroutine启动BadgerDB维护")
354+
go func() {
355+
ticker := time.NewTicker(24 * time.Hour)
356+
defer ticker.Stop()
357+
358+
for {
359+
select {
360+
case <-ticker.C:
361+
// 清理30天前的监控历史记录
362+
monitorHistoryOps := db.NewMonitorHistoryOps(db.DB)
363+
count, err := monitorHistoryOps.CleanupOldMonitorHistories(30 * 24 * time.Hour)
364+
if err != nil {
365+
log.Printf("清理过期监控历史记录失败: %v", err)
366+
} else if count > 0 {
367+
log.Printf("已清理 %d 条过期的监控历史记录", count)
368+
}
369+
}
370+
}
371+
}()
372+
}
350373
}
351374

352375
// 以下是替代原有数据库操作的函数

service/singleton/server.go

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -326,9 +326,10 @@ func CleanupServerState() {
326326
server.LastStateBeforeOffline = nil
327327
server.TaskStream = nil
328328

329-
// 安全关闭通道,使用异步处理防止死锁
329+
// 安全关闭通道,使用worker池处理防止goroutine泄漏
330330
if server.TaskClose != nil && server.TaskCloseLock != nil {
331-
go func(s *model.Server) {
331+
ServiceSentinelShared.SubmitOptimizedTask("server_cleanup", server, func() error {
332+
s := server // 闭包捕获
332333
// 使用带超时的锁获取,避免永久阻塞
333334
done := make(chan bool, 1)
334335
go func() {
@@ -351,17 +352,19 @@ func CleanupServerState() {
351352
}
352353
case <-time.After(100 * time.Millisecond):
353354
// 超时后跳过这次清理
354-
return
355+
return fmt.Errorf("server cleanup timeout")
355356
}
356-
}(server)
357+
return nil
358+
})
357359
}
358360
}
359361

360362
// 清理长时间未活动的连接
361363
if server.IsOnline && now.Sub(server.LastActive) > 5*time.Minute {
362-
// 使用异步处理防止死锁
364+
// 使用worker池处理防止goroutine泄漏
363365
if server.TaskCloseLock != nil {
364-
go func(s *model.Server) {
366+
ServiceSentinelShared.SubmitOptimizedTask("connection_timeout", server, func() error {
367+
s := server // 闭包捕获
365368
// 使用带超时的锁获取,避免永久阻塞
366369
done := make(chan bool, 1)
367370
go func() {
@@ -385,9 +388,10 @@ func CleanupServerState() {
385388
s.TaskStream = nil
386389
case <-time.After(100 * time.Millisecond):
387390
// 超时后跳过这次清理
388-
return
391+
return fmt.Errorf("connection timeout cleanup timeout")
389392
}
390-
}(server)
393+
return nil
394+
})
391395
}
392396
}
393397
}
@@ -406,16 +410,17 @@ func SafeCleanupServerState() {
406410

407411
lockCh := make(chan lockResult, 1)
408412

409-
// 尝试获取锁的goroutine
410-
go func() {
413+
// 尝试获取锁的任务,使用worker池
414+
ServiceSentinelShared.SubmitOptimizedTask("server_lock_acquire", nil, func() error {
411415
result := lockResult{acquired: false}
412416

413-
// 尝试在500ms内获取锁
417+
// 尝试在500ms内获取锁,需要另一个嵌套worker任务处理
414418
done := make(chan bool, 1)
415-
go func() {
419+
ServiceSentinelShared.SubmitOptimizedTask("server_rlock", nil, func() error {
416420
ServerLock.RLock()
417421
done <- true
418-
}()
422+
return nil
423+
})
419424

420425
select {
421426
case <-done:
@@ -438,7 +443,8 @@ func SafeCleanupServerState() {
438443
}
439444

440445
lockCh <- result
441-
}()
446+
return nil
447+
})
442448

443449
// 等待锁获取结果
444450
select {
@@ -484,15 +490,16 @@ func cleanupSingleServerState(server *model.Server) bool {
484490
// 保存最后状态到数据库(非阻塞,仅在SQLite模式下)
485491
if server.State != nil && Conf.DatabaseType != "badger" && DB != nil {
486492
if lastStateJSON, err := utils.Json.Marshal(server.State); err == nil {
487-
// 使用非阻塞的数据库更新
488-
go func() {
493+
// 使用worker池处理数据库更新
494+
ServiceSentinelShared.SubmitOptimizedTask("db_update_state", server, func() error {
489495
defer func() {
490496
if r := recover(); r != nil {
491497
log.Printf("保存服务器状态时panic: %v", r)
492498
}
493499
}()
494500
DB.Model(server).Update("last_state_json", string(lastStateJSON))
495-
}()
501+
return nil
502+
})
496503
}
497504
}
498505

@@ -506,11 +513,12 @@ func cleanupSingleServerState(server *model.Server) bool {
506513
if server.TaskCloseLock != nil {
507514
lockAcquired := make(chan bool, 1)
508515

509-
// 尝试获取TaskCloseLock
510-
go func() {
516+
// 使用worker池尝试获取TaskCloseLock
517+
ServiceSentinelShared.SubmitOptimizedTask("task_close_lock", server, func() error {
511518
server.TaskCloseLock.Lock()
512519
lockAcquired <- true
513-
}()
520+
return nil
521+
})
514522

515523
select {
516524
case <-lockAcquired:

0 commit comments

Comments
 (0)