|
@@ -1,6 +1,7 @@
|
|
|
package edbmonitor
|
|
|
|
|
|
import (
|
|
|
+ "encoding/json"
|
|
|
"eta/eta_api/models/data_manage"
|
|
|
edbmonitor "eta/eta_api/models/edb_monitor"
|
|
|
"eta/eta_api/models/edb_monitor/request"
|
|
@@ -10,23 +11,43 @@ import (
|
|
|
"fmt"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
+ "sync"
|
|
|
"time"
|
|
|
|
|
|
"github.com/rdlucklib/rdluck_tools/paging"
|
|
|
)
|
|
|
|
|
|
-// 预警触发状态
|
|
|
-const (
|
|
|
- EDB_MONITOR_STATE_CLOSE = iota
|
|
|
- EDB_MONITOR_STATE_NO_TRIGGER
|
|
|
- EDB_MONITOR_STATE_TRIGGER_SUCCESS
|
|
|
-)
|
|
|
+type SafeEdbMonitorSet struct {
|
|
|
+ m map[int]struct{}
|
|
|
+ mu sync.Mutex
|
|
|
+}
|
|
|
|
|
|
-// 预警突破方式
|
|
|
-const (
|
|
|
- EDB_MONITOR_TYPE_UP = iota
|
|
|
- EDB_MONITOR_TYPE_DOWN
|
|
|
-)
|
|
|
+func NewSafeEdbMonitorSet() *SafeEdbMonitorSet {
|
|
|
+ return &SafeEdbMonitorSet{
|
|
|
+ m: make(map[int]struct{}),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (e *SafeEdbMonitorSet) Add(id int) {
|
|
|
+ e.mu.Lock()
|
|
|
+ defer e.mu.Unlock()
|
|
|
+ e.m[id] = struct{}{}
|
|
|
+}
|
|
|
+
|
|
|
+func (e *SafeEdbMonitorSet) IsExist(id int) (ok bool) {
|
|
|
+ e.mu.Lock()
|
|
|
+ defer e.mu.Unlock()
|
|
|
+ _, ok = e.m[id]
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (e *SafeEdbMonitorSet) Remove(id int) {
|
|
|
+ e.mu.Lock()
|
|
|
+ defer e.mu.Unlock()
|
|
|
+ delete(e.m, id)
|
|
|
+}
|
|
|
+
|
|
|
+var EdbLocalSet = NewSafeEdbMonitorSet()
|
|
|
|
|
|
func GetMonitorList(classifyId, level, state, userId string, pageSize, currentIndex int) (resp response.EdbMonitorInfoListResp, msg string, err error) {
|
|
|
if pageSize <= 0 {
|
|
@@ -269,7 +290,12 @@ func SaveEdbMonitorInfo(req request.EdbMonitorInfoSaveReq, adminId int) (msg str
|
|
|
}
|
|
|
edbMonitorInfo.EdbMonitorId = int(insertId)
|
|
|
}
|
|
|
- err = ModifyEdbMonitorState(edbMonitorInfo, edb.EdbCode, edb.Source, edb.SubSource)
|
|
|
+ err = utils.Rc.SAdd(EDB_MONITOR_ID_SET_CACHE, edbMonitorInfo.EdbInfoId)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("监控指标添加缓存失败", err)
|
|
|
+ }
|
|
|
+ EdbLocalSet.Add(edbMonitorInfo.EdbInfoId)
|
|
|
+ err = ModifyEdbMonitorStateAndSendMsg(edbMonitorInfo, edb.EdbCode, edb.Source, edb.SubSource)
|
|
|
if err != nil {
|
|
|
msg = "更新指标预警失败"
|
|
|
err = fmt.Errorf("ModifyEdbMonitorState err:%w", err)
|
|
@@ -278,7 +304,7 @@ func SaveEdbMonitorInfo(req request.EdbMonitorInfoSaveReq, adminId int) (msg str
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func ModifyEdbMonitorState(edbMonitorInfo *edbmonitor.EdbMonitorInfo, edbCode string, source, subSource int) (err error) {
|
|
|
+func ModifyEdbMonitorStateAndSendMsg(edbMonitorInfo *edbmonitor.EdbMonitorInfo, edbCode string, source, subSource int) (err error) {
|
|
|
cond := ` AND edb_code = ? `
|
|
|
pars := []interface{}{edbCode}
|
|
|
latestTwoData, er := data_manage.GetEdbDataListByCondition(cond, pars, source, subSource, 2, 0)
|
|
@@ -286,6 +312,29 @@ func ModifyEdbMonitorState(edbMonitorInfo *edbmonitor.EdbMonitorInfo, edbCode st
|
|
|
err = fmt.Errorf("GetEdbDataListByCondition err:%w", er)
|
|
|
return
|
|
|
}
|
|
|
+ err = ModifyEdbMonitorState(edbMonitorInfo, latestTwoData)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if edbMonitorInfo.State == EDB_MONITOR_STATE_TRIGGER_SUCCESS {
|
|
|
+ SendAndLogMessage(edbMonitorInfo)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func GetTwoEdbDataByDataTime(edbCode, dataTime string, source, subSource int) (twoData []*data_manage.EdbData, err error) {
|
|
|
+ cond := ` AND edb_code = ? AND data_time <= ? `
|
|
|
+ pars := []interface{}{edbCode, dataTime}
|
|
|
+ twoData, er := data_manage.GetEdbDataListByCondition(cond, pars, source, subSource, 2, 0)
|
|
|
+ if er != nil {
|
|
|
+ err = fmt.Errorf("GetEdbDataListByCondition err:%w", er)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func ModifyEdbMonitorState(edbMonitorInfo *edbmonitor.EdbMonitorInfo, latestTwoData []*data_manage.EdbData) (err error) {
|
|
|
var updateCols []string
|
|
|
edbMonitorInfo.EdbLatestDate = latestTwoData[0].DataTime
|
|
|
edbMonitorInfo.EdbLatestValue = latestTwoData[0].Value
|
|
@@ -306,17 +355,18 @@ func ModifyEdbMonitorState(edbMonitorInfo *edbmonitor.EdbMonitorInfo, edbCode st
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
+ return
|
|
|
+}
|
|
|
|
|
|
- if triggerState == EDB_MONITOR_STATE_TRIGGER_SUCCESS {
|
|
|
- triggerTime := edbMonitorInfo.MonitorTriggerTime.Format(utils.FormatDateTime)
|
|
|
- err = SendMessages(edbMonitorInfo.CreateUserId, edbMonitorInfo.EdbInfoId, edbMonitorInfo.EdbInfoType, edbMonitorInfo.EdbMonitorClassifyId, edbMonitorInfo.EdbUniqueCode, edbMonitorInfo.EdbMonitorName, triggerTime)
|
|
|
- isRead := 1
|
|
|
- if err != nil {
|
|
|
- isRead = 0
|
|
|
- }
|
|
|
- err = LogMessage(edbMonitorInfo.EdbMonitorName, edbMonitorInfo.EdbUniqueCode, edbMonitorInfo.MonitorTriggerTime, edbMonitorInfo.EdbInfoId, edbMonitorInfo.EdbInfoType, edbMonitorInfo.CreateUserId, isRead, edbMonitorInfo.EdbClassifyId)
|
|
|
+func SendAndLogMessage(edbMonitorInfo *edbmonitor.EdbMonitorInfo) (err error) {
|
|
|
+ triggerTime := edbMonitorInfo.MonitorTriggerTime.Format(utils.FormatDateTime)
|
|
|
+ err = SendMessages(edbMonitorInfo.CreateUserId, edbMonitorInfo.EdbInfoId, edbMonitorInfo.EdbInfoType, edbMonitorInfo.EdbClassifyId, edbMonitorInfo.EdbUniqueCode, edbMonitorInfo.EdbMonitorName, triggerTime)
|
|
|
+ isRead := 1
|
|
|
+ if err != nil {
|
|
|
+ err = nil
|
|
|
+ isRead = 0
|
|
|
}
|
|
|
-
|
|
|
+ err = LogMessage(edbMonitorInfo.EdbMonitorName, edbMonitorInfo.EdbUniqueCode, edbMonitorInfo.MonitorTriggerTime, edbMonitorInfo.EdbInfoId, edbMonitorInfo.EdbInfoType, edbMonitorInfo.CreateUserId, isRead, edbMonitorInfo.EdbClassifyId)
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -466,7 +516,7 @@ func RestartEdbMonitorInfo(req request.EdbMonitorInfoRestartReq, adminId int) (m
|
|
|
edbMonitor.EdbTriggerDate = time.Time{}
|
|
|
edbMonitor.MonitorTriggerTime = time.Time{}
|
|
|
edbMonitor.ModifyTime = time.Now()
|
|
|
- err = ModifyEdbMonitorState(edbMonitor, edbMonitor.EdbCode, edbMonitor.Source, edbMonitor.SubSource)
|
|
|
+ err = ModifyEdbMonitorStateAndSendMsg(edbMonitor, edbMonitor.EdbCode, edbMonitor.Source, edbMonitor.SubSource)
|
|
|
if err != nil {
|
|
|
msg = "重启失败"
|
|
|
err = fmt.Errorf("修改预警状态失败, err:%w", err)
|
|
@@ -497,6 +547,61 @@ func GetEdbMonitorInfoUserList() (resp response.EdbMonitorInfoCreateUserResp, ms
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+func InitEdbMonitorInfo() {
|
|
|
+ edbMonitorList, err := edbmonitor.GetEdbMonitorEdbInfoList()
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Error("获取预警列表失败, err:%w", err)
|
|
|
+ }
|
|
|
+ edbInfoIdList := make([]interface{}, 0)
|
|
|
+ for _, v := range edbMonitorList {
|
|
|
+ if v.EdbInfoId != 0 {
|
|
|
+ EdbLocalSet.Add(v.EdbInfoId)
|
|
|
+ edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ utils.Rc.SAdd(EDB_MONITOR_ID_SET_CACHE, edbInfoIdList...)
|
|
|
+}
|
|
|
+
|
|
|
+func HandleEdbMonitorEdbInfo() {
|
|
|
+ InitEdbMonitorInfo()
|
|
|
+ for {
|
|
|
+ utils.Rc.Brpop(EDB_MONITOR_HANDLE_LIST_CACHE, func(b []byte) {
|
|
|
+ edbInfo := new(EdbInfoBingLog)
|
|
|
+ if err := json.Unmarshal(b, &edbInfo); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbMonitorList, err := edbmonitor.GetEdbMonitorInfoByEdbInfoId(edbInfo.EdbInfoId)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Error("获取预警列表失败, err:%w, edbInfoId:%d", err, edbInfo.EdbInfoId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if len(edbMonitorList) == 0 {
|
|
|
+ utils.Rc.SRem(EDB_MONITOR_ID_SET_CACHE, edbInfo.EdbInfoId)
|
|
|
+ EdbLocalSet.Remove(edbInfo.EdbInfoId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range edbMonitorList {
|
|
|
+ twoData, err := GetTwoEdbDataByDataTime(v.EdbCode, edbInfo.EndDate, v.Source, v.SubSource)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Error("获取数据失败, err:%w, edbInfoId:%d", err, edbInfo.EdbInfoId)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ err = ModifyEdbMonitorState(v, twoData)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Error("更新预警状态失败, err:%w, edbMonitorId:%d", err, v.EdbMonitorId)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if v.State == EDB_MONITOR_STATE_TRIGGER_SUCCESS {
|
|
|
+ err = SendAndLogMessage(v)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Error("发送预警消息失败, err:%w, edbMonitorId:%d", err, v.EdbMonitorId)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
func toEdbMonitorInfoItems(edbmonitor []*edbmonitor.EdbMonitorInfo, userMap, classifyPathMap, infoMap map[int]string) []*response.EdbMonitorInfoItem {
|
|
|
res := make([]*response.EdbMonitorInfoItem, 0, len(edbmonitor))
|
|
|
for _, v := range edbmonitor {
|