88 lines
1.9 KiB
Go
88 lines
1.9 KiB
Go
![]() |
package monitor
|
|||
|
|
|||
|
import (
|
|||
|
"fmt"
|
|||
|
"math"
|
|||
|
"samba/pkg/log"
|
|||
|
"samba/pkg/servername"
|
|||
|
"samba/pkg/task"
|
|||
|
"samba/pkg/xtime"
|
|||
|
"samba/proto"
|
|||
|
"samba/server/other/handler"
|
|||
|
|
|||
|
"samba/util/model"
|
|||
|
|
|||
|
"samba/util/routingKey"
|
|||
|
"samba/util/util"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
// OnlineMonitor
|
|||
|
// 在线人数异常检测
|
|||
|
type OnlineMonitor struct {
|
|||
|
*Ding
|
|||
|
}
|
|||
|
|
|||
|
func (m *OnlineMonitor) Init(t *task.Task) {
|
|||
|
t.Ticker(10 * time.Minute)
|
|||
|
}
|
|||
|
|
|||
|
// 获取昨天的数据
|
|||
|
func (m *OnlineMonitor) getYesterdayData(fn func(flows []proto.OnlineFlow, err error)) {
|
|||
|
ys := xtime.Now().Yesterday()
|
|||
|
stamp := xtime.ConvertToCarbon(time.Date(ys.Year(), time.Month(ys.Month()), ys.Day(), ys.Hour(), ys.Minute(), 0, 0, ys.StdTime().Location()))
|
|||
|
req := &proto.ReqGetOnlineFlow{
|
|||
|
Date: ys.StdTime().Format("20060102"),
|
|||
|
TimeStamp: stamp.Timestamp(),
|
|||
|
}
|
|||
|
handler.CallRpc(proto.ReqGetOnlineFlowId,
|
|||
|
util.Direct(servername.ClickHouse),
|
|||
|
routingKey.ClickHouseKey(0),
|
|||
|
req, func(rsp *proto.RspGetOnlineFlow, err error) {
|
|||
|
if err != nil {
|
|||
|
fn(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
if rsp.Err != "" {
|
|||
|
fn(nil, fmt.Errorf("query error:%v", rsp.Err))
|
|||
|
return
|
|||
|
}
|
|||
|
fn(rsp.Flows, nil)
|
|||
|
})
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
func (m *OnlineMonitor) Name() string {
|
|||
|
return "在线人数异常检测"
|
|||
|
}
|
|||
|
|
|||
|
func (m *OnlineMonitor) Do(*task.Task) {
|
|||
|
m.getYesterdayData(func(flows []proto.OnlineFlow, err error) {
|
|||
|
if err != nil {
|
|||
|
log.Error(err.Error())
|
|||
|
return
|
|||
|
}
|
|||
|
var yesterdayOnline int64
|
|||
|
for _, flow := range flows {
|
|||
|
// 找到昨天当前分钟的数据,
|
|||
|
yesterdayOnline += flow.Online
|
|||
|
}
|
|||
|
|
|||
|
current, err := model.NewUserOnlineOp().Current()
|
|||
|
if err != nil {
|
|||
|
log.Error(err.Error())
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if math.Abs(float64(yesterdayOnline-current)) > (float64(yesterdayOnline) * 0.5) {
|
|||
|
// 波动大于 正负50%
|
|||
|
err := m.SendMessageText(fmt.Sprintf("在线人数波动,昨日同时刻%d人,今日%d人", yesterdayOnline, current))
|
|||
|
if err != nil {
|
|||
|
log.Error(err.Error())
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
}
|