From 19329d0c8f776bcfb8087731ec392ccdc827e885 Mon Sep 17 00:00:00 2001
From: naiba <hi@nai.ba>
Date: Tue, 12 Oct 2021 22:46:55 +0800
Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20=E4=BC=98=E5=8C=96?=
 =?UTF-8?q?=E5=8E=86=E5=8F=B2=E6=9C=8D=E5=8A=A1=E7=9B=91=E6=8E=A7=E6=95=B0?=
 =?UTF-8?q?=E6=8D=AE=E5=86=99=E5=85=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 service/dao/servicesentinel.go | 33 +++++++++++++++++++--------------
 1 file changed, 19 insertions(+), 14 deletions(-)

diff --git a/service/dao/servicesentinel.go b/service/dao/servicesentinel.go
index 833a3dc..b9cced5 100644
--- a/service/dao/servicesentinel.go
+++ b/service/dao/servicesentinel.go
@@ -12,7 +12,10 @@ import (
 	pb "github.com/naiba/nezha/proto"
 )
 
-const _CurrentStatusSize = 30 // 统计 15 分钟内的数据为当前状态
+const (
+	_CurrentStatusSize = 30 // 统计 15 分钟内的数据为当前状态
+	_StatusOk          = "良好"
+)
 
 var ServiceSentinelShared *ServiceSentinel
 
@@ -268,7 +271,7 @@ func getStateStr(percent uint64) string {
 		return "无数据"
 	}
 	if percent > 95 {
-		return "良好"
+		return _StatusOk
 	}
 	if percent > 80 {
 		return "低可用"
@@ -303,18 +306,13 @@ func (ss *ServiceSentinel) worker() {
 			ss.serviceStatusToday[mh.MonitorID].Up++
 		} else {
 			ss.serviceStatusToday[mh.MonitorID].Down++
+			ServerLock.RLock()
+			log.Println("NEZHA>> 服务故障上报:", ss.monitors[mh.MonitorID].Target, "上报者:", ServerList[r.Reporter].Name, "错误信息:", mh.Data)
+			ServerLock.RUnlock()
 		}
 		// 写入当前数据
 		ss.serviceCurrentStatusData[mh.MonitorID][ss.serviceCurrentStatusIndex[mh.MonitorID]] = mh
 		ss.serviceCurrentStatusIndex[mh.MonitorID]++
-		// 数据持久化
-		if ss.serviceCurrentStatusIndex[mh.MonitorID] == _CurrentStatusSize {
-			ss.serviceCurrentStatusIndex[mh.MonitorID] = 0
-			dataToSave := ss.serviceCurrentStatusData[mh.MonitorID]
-			if err := DB.Create(&dataToSave).Error; err != nil {
-				log.Println("NEZHA>> 服务监控数据持久化失败:", err)
-			}
-		}
 		// 更新当前状态
 		ss.serviceResponseDataStoreCurrentUp[mh.MonitorID] = 0
 		ss.serviceResponseDataStoreCurrentDown[mh.MonitorID] = 0
@@ -332,10 +330,17 @@ func (ss *ServiceSentinel) worker() {
 			upPercent = ss.serviceResponseDataStoreCurrentUp[mh.MonitorID] * 100 / (ss.serviceResponseDataStoreCurrentDown[mh.MonitorID] + ss.serviceResponseDataStoreCurrentUp[mh.MonitorID])
 		}
 		stateStr := getStateStr(upPercent)
-		if !mh.Successful {
-			ServerLock.RLock()
-			log.Println("NEZHA>> 服务故障上报:", ss.monitors[mh.MonitorID].Target, stateStr, "上报者:", ServerList[r.Reporter].Name, "请求输出:", mh.Data)
-			ServerLock.RUnlock()
+		// 数据持久化
+		if ss.serviceCurrentStatusIndex[mh.MonitorID] == _CurrentStatusSize {
+			ss.serviceCurrentStatusIndex[mh.MonitorID] = 0
+			if err := DB.Create(&model.MonitorHistory{
+				MonitorID:  mh.MonitorID,
+				Delay:      ss.serviceStatusToday[mh.MonitorID].Delay,
+				Successful: stateStr == _StatusOk,
+				Data:       mh.Data,
+			}).Error; err != nil {
+				log.Println("NEZHA>> 服务监控数据持久化失败:", err)
+			}
 		}
 		if stateStr == "故障" || stateStr != ss.lastStatus[mh.MonitorID] {
 			ss.monitorsLock.RLock()