Skip to content

Commit 91220d7

Browse files
committed
Update.
1 parent 39b14be commit 91220d7

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

service/singleton/singleton.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,10 @@ func CleanMonitorHistory() {
152152
// server_id = 0 的数据会用于/service页面的可用性展示
153153
DB.Unscoped().Delete(&model.MonitorHistory{}, "(created_at < ? AND server_id != 0) OR monitor_id NOT IN (SELECT `id` FROM monitors)", time.Now().AddDate(0, 0, -1))
154154
DB.Unscoped().Delete(&model.Transfer{}, "server_id NOT IN (SELECT `id` FROM servers)")
155+
156+
// 清理过期的累计流量数据(保留30天)
157+
cleanCumulativeTransferData(30)
158+
155159
// 计算可清理流量记录的时长
156160
var allServerKeep time.Time
157161
specialServerKeep := make(map[uint64]time.Time)
@@ -192,6 +196,77 @@ func CleanMonitorHistory() {
192196
}
193197
}
194198

199+
// cleanCumulativeTransferData 清理超过指定天数的累计流量数据
200+
func cleanCumulativeTransferData(days int) {
201+
// 获取保留期限的开始时间点
202+
retentionStart := time.Now().AddDate(0, 0, -days)
203+
log.Println("NG>> 开始清理", days, "天前的累计流量数据")
204+
205+
// 从Transfer表中查询保留期内最早的有效数据日期
206+
var oldestValidTransfers []model.Transfer
207+
if err := DB.Where("datetime(`created_at`) >= datetime(?)", retentionStart).Order("created_at ASC").Limit(10).Find(&oldestValidTransfers).Error; err != nil {
208+
log.Println("NG>> 查询保留期内流量记录失败:", err)
209+
return
210+
}
211+
212+
if len(oldestValidTransfers) == 0 {
213+
log.Println("NG>> 未找到保留期内的有效流量记录")
214+
return
215+
}
216+
217+
// 计算每个服务器在保留期内的总流量
218+
serverFlows := make(map[uint64]struct {
219+
In uint64
220+
Out uint64
221+
})
222+
223+
// 查询所有在保留期内的流量记录
224+
var transfers []model.Transfer
225+
if err := DB.Where("datetime(`created_at`) >= datetime(?)", retentionStart).Find(&transfers).Error; err != nil {
226+
log.Println("NG>> 查询流量记录失败:", err)
227+
return
228+
}
229+
230+
// 计算每个服务器在保留期内的总流量
231+
for _, transfer := range transfers {
232+
flow := serverFlows[transfer.ServerID]
233+
flow.In += transfer.In
234+
flow.Out += transfer.Out
235+
serverFlows[transfer.ServerID] = flow
236+
}
237+
238+
// 更新每个服务器的累计流量为保留期内的总流量
239+
ServerLock.Lock()
240+
defer ServerLock.Unlock()
241+
242+
var serversToUpdate []model.Server
243+
for id, flow := range serverFlows {
244+
if server, ok := ServerList[id]; ok {
245+
// 重置服务器的累计流量为保留期内的总流量
246+
server.CumulativeNetInTransfer = flow.In
247+
server.CumulativeNetOutTransfer = flow.Out
248+
249+
// 添加到待更新列表
250+
serversToUpdate = append(serversToUpdate, model.Server{
251+
Common: model.Common{ID: id},
252+
CumulativeNetInTransfer: flow.In,
253+
CumulativeNetOutTransfer: flow.Out,
254+
})
255+
}
256+
}
257+
258+
// 批量更新数据库中的累计流量值
259+
if len(serversToUpdate) > 0 {
260+
for i := range serversToUpdate {
261+
DB.Model(&serversToUpdate[i]).Updates(map[string]interface{}{
262+
"cumulative_net_in_transfer": serversToUpdate[i].CumulativeNetInTransfer,
263+
"cumulative_net_out_transfer": serversToUpdate[i].CumulativeNetOutTransfer,
264+
})
265+
}
266+
log.Println("NG>> 已更新", len(serversToUpdate), "个服务器的累计流量数据")
267+
}
268+
}
269+
195270
// IPDesensitize 根据设置选择是否对IP进行打码处理 返回处理后的IP(关闭打码则返回原IP)
196271
func IPDesensitize(ip string) string {
197272
if Conf.EnablePlainIPInNotification {

0 commit comments

Comments
 (0)