@@ -529,19 +529,28 @@ func generateDetailedAlertMessage(alert *model.AlertRule, server *model.Server,
529529 message += fmt .Sprintf ("• 进程数过多: %d (阈值: %.0f)\n " ,
530530 server .State .ProcessCount , rule .Max )
531531 case ruleType == "offline" :
532- // 使用正确的最后在线时间字段
532+ // 修复离线时长计算:使用服务器实际离线的时间点
533533 var lastSeenTime time.Time
534+ var offlineDuration time.Duration
535+
536+ // 优先使用LastOnline字段(这是服务器最后一次在线的准确时间)
534537 if ! server .LastOnline .IsZero () {
535538 lastSeenTime = server .LastOnline
539+ offlineDuration = time .Since (lastSeenTime )
536540 } else if ! server .LastActive .IsZero () {
541+ // 如果没有LastOnline,使用LastActive,但需要考虑离线超时时间
537542 lastSeenTime = server .LastActive
543+ // 减去离线检测的超时时间(3分钟),得到更准确的离线时长
544+ offlineDuration = time .Since (lastSeenTime ) - (3 * time .Minute )
545+ if offlineDuration < 0 {
546+ offlineDuration = time .Since (lastSeenTime )
547+ }
538548 } else {
539- lastSeenTime = time .Now ().Add (- 24 * time .Hour ) // 默认24小时前
549+ // 如果都没有,说明服务器从未上线过
550+ lastSeenTime = time .Now ().Add (- time .Hour ) // 默认1小时前
551+ offlineDuration = time .Hour
540552 }
541553
542- // 计算离线时长
543- offlineDuration := time .Since (lastSeenTime )
544-
545554 message += fmt .Sprintf ("• 服务器离线: 最后在线时间 %s (离线时长: %s)\n " ,
546555 lastSeenTime .Format ("2006-01-02 15:04:05" ),
547556 formatDuration (offlineDuration ))
@@ -782,19 +791,28 @@ func generateDetailedRecoveryMessage(alert *model.AlertRule, server *model.Serve
782791 }
783792
784793 if hasOfflineRule {
785- // 使用正确的最后在线时间字段
794+ // 修复恢复消息中的离线时长计算
786795 var lastSeenTime time.Time
796+ var offlineDuration time.Duration
797+
798+ // 优先使用LastOnline字段(这是服务器最后一次在线的准确时间)
787799 if ! server .LastOnline .IsZero () {
788800 lastSeenTime = server .LastOnline
801+ offlineDuration = now .Sub (lastSeenTime )
789802 } else if ! server .LastActive .IsZero () {
803+ // 如果没有LastOnline,使用LastActive,但需要考虑离线超时时间
790804 lastSeenTime = server .LastActive
805+ // 减去离线检测的超时时间(3分钟),得到更准确的离线时长
806+ offlineDuration = now .Sub (lastSeenTime ) - (3 * time .Minute )
807+ if offlineDuration < 0 {
808+ offlineDuration = now .Sub (lastSeenTime )
809+ }
791810 } else {
811+ // 如果都没有,说明服务器从未上线过
792812 lastSeenTime = now .Add (- time .Hour ) // 默认1小时前
813+ offlineDuration = time .Hour
793814 }
794815
795- // 计算离线时长(从离线到恢复)
796- offlineDuration := now .Sub (lastSeenTime )
797-
798816 message += fmt .Sprintf ("• 服务器已恢复上线: 上次离线时间 %s (离线时长: %s)\n " ,
799817 lastSeenTime .Format ("2006-01-02 15:04:05" ),
800818 formatDuration (offlineDuration ))
0 commit comments