Skip to content

Commit 6311121

Browse files
committed
Update.
1 parent a945e64 commit 6311121

File tree

5 files changed

+450
-410
lines changed

5 files changed

+450
-410
lines changed

model/notification.go

Lines changed: 79 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -171,49 +171,87 @@ func (ns *NotificationServerBundle) replaceParamsInString(str string, message st
171171
if ns.Server != nil {
172172
str = strings.ReplaceAll(str, "#SERVER.NAME#", mod(ns.Server.Name))
173173
str = strings.ReplaceAll(str, "#SERVER.ID#", mod(fmt.Sprintf("%d", ns.Server.ID)))
174-
str = strings.ReplaceAll(str, "#SERVER.CPU#", mod(fmt.Sprintf("%f", ns.Server.State.CPU)))
175-
str = strings.ReplaceAll(str, "#SERVER.MEM#", mod(fmt.Sprintf("%d", ns.Server.State.MemUsed)))
176-
str = strings.ReplaceAll(str, "#SERVER.SWAP#", mod(fmt.Sprintf("%d", ns.Server.State.SwapUsed)))
177-
str = strings.ReplaceAll(str, "#SERVER.DISK#", mod(fmt.Sprintf("%d", ns.Server.State.DiskUsed)))
178-
str = strings.ReplaceAll(str, "#SERVER.MEMUSED#", mod(fmt.Sprintf("%d", ns.Server.State.MemUsed)))
179-
str = strings.ReplaceAll(str, "#SERVER.SWAPUSED#", mod(fmt.Sprintf("%d", ns.Server.State.SwapUsed)))
180-
str = strings.ReplaceAll(str, "#SERVER.DISKUSED#", mod(fmt.Sprintf("%d", ns.Server.State.DiskUsed)))
181-
str = strings.ReplaceAll(str, "#SERVER.MEMTOTAL#", mod(fmt.Sprintf("%d", ns.Server.Host.MemTotal)))
182-
str = strings.ReplaceAll(str, "#SERVER.SWAPTOTAL#", mod(fmt.Sprintf("%d", ns.Server.Host.SwapTotal)))
183-
str = strings.ReplaceAll(str, "#SERVER.DISKTOTAL#", mod(fmt.Sprintf("%d", ns.Server.Host.DiskTotal)))
184-
str = strings.ReplaceAll(str, "#SERVER.NETINSPEED#", mod(fmt.Sprintf("%d", ns.Server.State.NetInSpeed)))
185-
str = strings.ReplaceAll(str, "#SERVER.NETOUTSPEED#", mod(fmt.Sprintf("%d", ns.Server.State.NetOutSpeed)))
186-
str = strings.ReplaceAll(str, "#SERVER.TRANSFERIN#", mod(fmt.Sprintf("%d", ns.Server.State.NetInTransfer)))
187-
str = strings.ReplaceAll(str, "#SERVER.TRANSFEROUT#", mod(fmt.Sprintf("%d", ns.Server.State.NetOutTransfer)))
188-
str = strings.ReplaceAll(str, "#SERVER.NETINTRANSFER#", mod(fmt.Sprintf("%d", ns.Server.State.NetInTransfer)))
189-
str = strings.ReplaceAll(str, "#SERVER.NETOUTTRANSFER#", mod(fmt.Sprintf("%d", ns.Server.State.NetOutTransfer)))
190-
str = strings.ReplaceAll(str, "#SERVER.LOAD1#", mod(fmt.Sprintf("%f", ns.Server.State.Load1)))
191-
str = strings.ReplaceAll(str, "#SERVER.LOAD5#", mod(fmt.Sprintf("%f", ns.Server.State.Load5)))
192-
str = strings.ReplaceAll(str, "#SERVER.LOAD15#", mod(fmt.Sprintf("%f", ns.Server.State.Load15)))
193-
str = strings.ReplaceAll(str, "#SERVER.TCPCONNCOUNT#", mod(fmt.Sprintf("%d", ns.Server.State.TcpConnCount)))
194-
str = strings.ReplaceAll(str, "#SERVER.UDPCONNCOUNT#", mod(fmt.Sprintf("%d", ns.Server.State.UdpConnCount)))
195-
196-
var ipv4, ipv6, validIP string
197-
ipList := strings.Split(ns.Server.Host.IP, "/")
198-
if len(ipList) > 1 {
199-
// 双栈
200-
ipv4 = ipList[0]
201-
ipv6 = ipList[1]
202-
validIP = ipv4
203-
} else if len(ipList) == 1 {
204-
// 仅ipv4|ipv6
205-
if strings.Contains(ipList[0], ":") {
206-
ipv6 = ipList[0]
207-
validIP = ipv6
208-
} else {
209-
ipv4 = ipList[0]
210-
validIP = ipv4
211-
}
174+
175+
// 安全地访问 State 字段
176+
if ns.Server.State != nil {
177+
str = strings.ReplaceAll(str, "#SERVER.CPU#", mod(fmt.Sprintf("%f", ns.Server.State.CPU)))
178+
str = strings.ReplaceAll(str, "#SERVER.MEM#", mod(fmt.Sprintf("%d", ns.Server.State.MemUsed)))
179+
str = strings.ReplaceAll(str, "#SERVER.SWAP#", mod(fmt.Sprintf("%d", ns.Server.State.SwapUsed)))
180+
str = strings.ReplaceAll(str, "#SERVER.DISK#", mod(fmt.Sprintf("%d", ns.Server.State.DiskUsed)))
181+
str = strings.ReplaceAll(str, "#SERVER.MEMUSED#", mod(fmt.Sprintf("%d", ns.Server.State.MemUsed)))
182+
str = strings.ReplaceAll(str, "#SERVER.SWAPUSED#", mod(fmt.Sprintf("%d", ns.Server.State.SwapUsed)))
183+
str = strings.ReplaceAll(str, "#SERVER.DISKUSED#", mod(fmt.Sprintf("%d", ns.Server.State.DiskUsed)))
184+
str = strings.ReplaceAll(str, "#SERVER.NETINSPEED#", mod(fmt.Sprintf("%d", ns.Server.State.NetInSpeed)))
185+
str = strings.ReplaceAll(str, "#SERVER.NETOUTSPEED#", mod(fmt.Sprintf("%d", ns.Server.State.NetOutSpeed)))
186+
str = strings.ReplaceAll(str, "#SERVER.TRANSFERIN#", mod(fmt.Sprintf("%d", ns.Server.State.NetInTransfer)))
187+
str = strings.ReplaceAll(str, "#SERVER.TRANSFEROUT#", mod(fmt.Sprintf("%d", ns.Server.State.NetOutTransfer)))
188+
str = strings.ReplaceAll(str, "#SERVER.NETINTRANSFER#", mod(fmt.Sprintf("%d", ns.Server.State.NetInTransfer)))
189+
str = strings.ReplaceAll(str, "#SERVER.NETOUTTRANSFER#", mod(fmt.Sprintf("%d", ns.Server.State.NetOutTransfer)))
190+
str = strings.ReplaceAll(str, "#SERVER.LOAD1#", mod(fmt.Sprintf("%f", ns.Server.State.Load1)))
191+
str = strings.ReplaceAll(str, "#SERVER.LOAD5#", mod(fmt.Sprintf("%f", ns.Server.State.Load5)))
192+
str = strings.ReplaceAll(str, "#SERVER.LOAD15#", mod(fmt.Sprintf("%f", ns.Server.State.Load15)))
193+
str = strings.ReplaceAll(str, "#SERVER.TCPCONNCOUNT#", mod(fmt.Sprintf("%d", ns.Server.State.TcpConnCount)))
194+
str = strings.ReplaceAll(str, "#SERVER.UDPCONNCOUNT#", mod(fmt.Sprintf("%d", ns.Server.State.UdpConnCount)))
195+
} else {
196+
// 为 nil 状态提供默认值
197+
str = strings.ReplaceAll(str, "#SERVER.CPU#", mod("0"))
198+
str = strings.ReplaceAll(str, "#SERVER.MEM#", mod("0"))
199+
str = strings.ReplaceAll(str, "#SERVER.SWAP#", mod("0"))
200+
str = strings.ReplaceAll(str, "#SERVER.DISK#", mod("0"))
201+
str = strings.ReplaceAll(str, "#SERVER.MEMUSED#", mod("0"))
202+
str = strings.ReplaceAll(str, "#SERVER.SWAPUSED#", mod("0"))
203+
str = strings.ReplaceAll(str, "#SERVER.DISKUSED#", mod("0"))
204+
str = strings.ReplaceAll(str, "#SERVER.NETINSPEED#", mod("0"))
205+
str = strings.ReplaceAll(str, "#SERVER.NETOUTSPEED#", mod("0"))
206+
str = strings.ReplaceAll(str, "#SERVER.TRANSFERIN#", mod("0"))
207+
str = strings.ReplaceAll(str, "#SERVER.TRANSFEROUT#", mod("0"))
208+
str = strings.ReplaceAll(str, "#SERVER.NETINTRANSFER#", mod("0"))
209+
str = strings.ReplaceAll(str, "#SERVER.NETOUTTRANSFER#", mod("0"))
210+
str = strings.ReplaceAll(str, "#SERVER.LOAD1#", mod("0"))
211+
str = strings.ReplaceAll(str, "#SERVER.LOAD5#", mod("0"))
212+
str = strings.ReplaceAll(str, "#SERVER.LOAD15#", mod("0"))
213+
str = strings.ReplaceAll(str, "#SERVER.TCPCONNCOUNT#", mod("0"))
214+
str = strings.ReplaceAll(str, "#SERVER.UDPCONNCOUNT#", mod("0"))
212215
}
213216

214-
str = strings.ReplaceAll(str, "#SERVER.IP#", mod(validIP))
215-
str = strings.ReplaceAll(str, "#SERVER.IPV4#", mod(ipv4))
216-
str = strings.ReplaceAll(str, "#SERVER.IPV6#", mod(ipv6))
217+
// 安全地访问 Host 字段
218+
if ns.Server.Host != nil {
219+
str = strings.ReplaceAll(str, "#SERVER.MEMTOTAL#", mod(fmt.Sprintf("%d", ns.Server.Host.MemTotal)))
220+
str = strings.ReplaceAll(str, "#SERVER.SWAPTOTAL#", mod(fmt.Sprintf("%d", ns.Server.Host.SwapTotal)))
221+
str = strings.ReplaceAll(str, "#SERVER.DISKTOTAL#", mod(fmt.Sprintf("%d", ns.Server.Host.DiskTotal)))
222+
223+
var ipv4, ipv6, validIP string
224+
if ns.Server.Host.IP != "" {
225+
ipList := strings.Split(ns.Server.Host.IP, "/")
226+
if len(ipList) > 1 {
227+
// 双栈
228+
ipv4 = ipList[0]
229+
ipv6 = ipList[1]
230+
validIP = ipv4
231+
} else if len(ipList) == 1 {
232+
// 仅ipv4|ipv6
233+
if strings.Contains(ipList[0], ":") {
234+
ipv6 = ipList[0]
235+
validIP = ipv6
236+
} else {
237+
ipv4 = ipList[0]
238+
validIP = ipv4
239+
}
240+
}
241+
}
242+
243+
str = strings.ReplaceAll(str, "#SERVER.IP#", mod(validIP))
244+
str = strings.ReplaceAll(str, "#SERVER.IPV4#", mod(ipv4))
245+
str = strings.ReplaceAll(str, "#SERVER.IPV6#", mod(ipv6))
246+
} else {
247+
// 为 nil Host 提供默认值
248+
str = strings.ReplaceAll(str, "#SERVER.MEMTOTAL#", mod("0"))
249+
str = strings.ReplaceAll(str, "#SERVER.SWAPTOTAL#", mod("0"))
250+
str = strings.ReplaceAll(str, "#SERVER.DISKTOTAL#", mod("0"))
251+
str = strings.ReplaceAll(str, "#SERVER.IP#", mod(""))
252+
str = strings.ReplaceAll(str, "#SERVER.IPV4#", mod(""))
253+
str = strings.ReplaceAll(str, "#SERVER.IPV6#", mod(""))
254+
}
217255
}
218256

219257
return str

service/singleton/alertsentinel.go

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -84,27 +84,26 @@ func AlertSentinelStart() {
8484
var lastPrint time.Time
8585
var checkCount uint64
8686

87-
// 内存清理计时器 - 更频繁的清理,每20分钟清理一次
87+
// 内存清理计时器 - 调整为每1小时清理一次,降低清理频率
8888
lastCleanupTime := time.Now()
8989

9090
for {
9191
startedAt := time.Now()
9292
checkStatus()
9393
checkCount++
9494

95-
// 更频繁的内存清理 - 从1小时改为20分钟
96-
if startedAt.Sub(lastCleanupTime) >= 20*time.Minute {
95+
if startedAt.Sub(lastCleanupTime) >= 1*time.Hour {
9796
cleanupAlertMemoryData()
9897
lastCleanupTime = startedAt
9998
}
10099

101-
// 检查内存使用量,如果超过150MB立即触发清理
100+
// 调整内存使用阈值,如果超过200MB才立即触发清理
102101
var m runtime.MemStats
103102
runtime.ReadMemStats(&m)
104-
if m.Alloc > 150*1024*1024 { // 150MB阈值
103+
if m.Alloc > 200*1024*1024 { // 200MB阈值,适中设置
105104
log.Printf("AlertSentinel内存使用过高: %dMB,立即执行清理", m.Alloc/1024/1024)
106105
cleanupAlertMemoryData()
107-
runtime.GC() // 强制垃圾回收
106+
runtime.GC() // 强制垃圾回收
108107
lastCleanupTime = startedAt // 更新清理时间,避免频繁清理
109108
}
110109

@@ -496,7 +495,7 @@ func cleanupAlertMemoryData() {
496495

497496
cleanedAlerts := 0
498497
cleanedServers := 0
499-
498+
500499
// 获取当前内存使用情况
501500
var memBefore runtime.MemStats
502501
runtime.ReadMemStats(&memBefore)
@@ -540,7 +539,7 @@ func cleanupAlertMemoryData() {
540539
cleanedServers++
541540
}
542541
}
543-
542+
544543
// 如果服务器映射为空,清理整个报警项
545544
if len(serverMap) == 0 {
546545
delete(alertsStore, alertID)
@@ -573,16 +572,16 @@ func cleanupAlertMemoryData() {
573572
delete(AlertsCycleTransferStatsStore, alertID)
574573
}
575574
}
576-
575+
577576
// 强制垃圾回收
578577
runtime.GC()
579-
578+
580579
// 获取清理后的内存使用情况
581580
var memAfter runtime.MemStats
582581
runtime.ReadMemStats(&memAfter)
583-
582+
584583
memFreed := int64(memBefore.Alloc) - int64(memAfter.Alloc)
585-
586-
log.Printf("报警系统内存清理完成: 清理了 %d 个失效报警规则, %d 个服务器历史记录, 释放内存 %dMB",
584+
585+
log.Printf("报警系统内存清理完成: 清理了 %d 个失效报警规则, %d 个服务器历史记录, 释放内存 %dMB",
587586
cleanedAlerts, cleanedServers, memFreed/1024/1024)
588587
}

service/singleton/crontask.go

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

2525
// 添加基础的系统定时任务
26-
// 每分钟保存一次流量数据
27-
if _, err := Cron.AddFunc("0 * * * * *", RecordTransferHourlyUsage); err != nil {
26+
// 改为每5分钟保存一次流量数据,降低频率
27+
if _, err := Cron.AddFunc("0 */5 * * * *", RecordTransferHourlyUsage); err != nil {
2828
panic(err)
2929
}
3030

@@ -40,18 +40,18 @@ func InitCronTask() {
4040
panic(err)
4141
}
4242

43-
// 每小时对流量记录进行打点 (注意:这里不重复每分钟的任务)
44-
if _, err := Cron.AddFunc("0 0 * * * *", RecordTransferHourlyUsage); err != nil {
43+
// 改为每2小时对流量记录进行打点,降低频率
44+
if _, err := Cron.AddFunc("0 0 */2 * * *", RecordTransferHourlyUsage); err != nil {
4545
panic(err)
4646
}
4747

48-
// 每10分钟同步一次所有服务器的累计流量
49-
if _, err := Cron.AddFunc("0 */10 * * * *", SyncAllServerTrafficFromDB); err != nil {
48+
// 改为每30分钟同步一次所有服务器的累计流量,降低频率
49+
if _, err := Cron.AddFunc("0 */30 * * * *", SyncAllServerTrafficFromDB); err != nil {
5050
panic(err)
5151
}
5252

53-
// 每分钟保存一次流量数据到数据库
54-
if _, err := Cron.AddFunc("0 * * * * *", SaveAllTrafficToDB); err != nil {
53+
// 改为每5分钟保存一次流量数据到数据库,降低频率
54+
if _, err := Cron.AddFunc("0 */5 * * * *", SaveAllTrafficToDB); err != nil {
5555
panic(err)
5656
}
5757
}

0 commit comments

Comments
 (0)