go-common/app/job/main/videoup-report/service/monitor.go

141 lines
4.6 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package service
import (
"context"
"fmt"
"go-common/app/job/main/videoup-report/model/archive"
"go-common/app/job/main/videoup-report/model/monitor"
"go-common/library/log"
"time"
)
// hdlMonitorArc deal with archive stay stats
func (s *Service) hdlMonitorArc(nw, old *archive.Archive) (err error) {
defer func() {
if pErr := recover(); pErr != nil {
log.Error("s.hdlMonitorArc panic(%v)", pErr)
}
}()
var (
oKey, nKey string
kFormat = monitor.RedisPrefix + monitor.SuffixArc
addit *archive.Addit
)
log.Info("hdlMonitorArc (%v,%v)", nw, old)
if addit, err = s.arc.Addit(context.TODO(), nw.ID); err != nil {
log.Error("s.hdlMonitorArc() s.arc.Addit(%d) error(%v)", nw.ID, err)
return
}
//去掉PGC稿件
if addit != nil && (addit.UpFrom == archive.UpFromPGC || addit.UpFrom == archive.UpFromPGCSecret || addit.UpFrom == archive.UpFromCoopera) {
return
}
if old != nil {
if nw.Round == old.Round && nw.State == old.State {
return
}
oKey = fmt.Sprintf(kFormat, monitor.BusArc, old.Round, old.State)
}
//忽略Round 99 state不为-6,-1,0,1的数据
if nw.Round != archive.RoundEnd && (nw.State == archive.StateForbidFixed || nw.State == archive.StateForbidWait || nw.State == archive.StateOpen || nw.State == archive.StateOrange) {
nKey = fmt.Sprintf(kFormat, monitor.BusArc, nw.Round, nw.State)
}
//回查忽略活动稿件
if addit != nil && addit.MissionID > 0 && (nw.Round == archive.RoundReviewFirst || nw.Round == archive.RoundReviewFirstWaitTrigger || nw.Round == archive.RoundReviewSecond || nw.Round == archive.RoundTriggerClick) {
nKey = ""
}
log.Info("hdlMonitorArc () s.monitorSave(%s,%s,%d)", oKey, nKey, nw.ID)
err = s.monitorSave(oKey, nKey, nw.ID)
return
}
// hdlMonitorVideo 视频审核监控
func (s *Service) hdlMonitorVideo(nv, ov *archive.Video) (err error) {
var (
oKey, nKey string
kFormat = monitor.RedisPrefix + monitor.SuffixVideo
)
log.Info("hdlMonitorVideo (%v,%v)", nv, ov)
if ov != nil {
if nv.Status == ov.Status {
return
}
oKey = fmt.Sprintf(kFormat, monitor.BusVideo, ov.Status)
}
if nv.Status == archive.VideoStatusSubmit || nv.Status == archive.VideoStatusWait {
nKey = fmt.Sprintf(kFormat, monitor.BusVideo, nv.Status)
}
log.Info("hdlMonitorVideo () s.monitorSave(%s,%s,%d) filename(%s)", oKey, nKey, nv.ID, nv.Filename)
err = s.monitorSave(oKey, nKey, nv.ID)
return
}
func (s *Service) monitorSave(oKey, nKey string, oid int64) (err error) {
defer func() {
if pErr := recover(); pErr != nil {
log.Error("s.monitorSave panic(%v)", pErr)
}
}()
var c = context.TODO()
if oKey != "" {
if err = s.redis.RemMonitorStats(c, oKey, oid); err != nil {
log.Error("s.monitorSave() RemMonitorStats(%s,%d) error(%v)", oKey, oid, err)
}
s.redis.ClearMonitorStats(c, oKey)
}
if nKey != "" {
if err = s.redis.AddMonitorStats(c, nKey, oid); err != nil {
log.Error("s.monitorSave() AddMonitorStats(%s,%d) error(%v)", nKey, oid, err)
return
}
s.redis.ClearMonitorStats(c, nKey)
}
if err != nil {
log.Error("s.monitorSave(%s,%s,%d) error(%v)", oKey, nKey, oid, err)
}
return
}
//monitorNotifyEmail 发送监控通知
func (s *Service) monitorNotify() {
var (
c = context.TODO()
data []*monitor.RuleResultData
err error
)
defer func() {
if err := recover(); err != nil {
log.Error("monitorNotifyEmail() panic(%v)", err)
}
}()
// 从admin获取报警数据
if data, err = s.dataDao.MonitorNotify(c); err != nil {
log.Error("s.dataDao.MonitorNotify() error(%v)", err)
return
}
for _, v := range data {
if v.Rule.State != monitor.RuleStateOK {
log.Error("monitorNotify() ignore rule(%d) state(%d)", v.Rule.ID, v.Rule.State)
continue
}
subject := fmt.Sprintf("%s监控", v.Rule.Name)
body := fmt.Sprintf("当前滞留时间为%s超过阀值滞留量为%d整体量为%d \n%s", secondsFormat(v.Stats.MaxTime), v.Stats.MoniCount, v.Stats.TotalCount, time.Now().Format("2006-01-02 15:04:05"))
url := ""
switch v.Rule.Business {
case monitor.BusVideo:
url = fmt.Sprintf("http://manager.bilibili.co/#!/video/list?monitor_list=%d_%d_%d", v.Rule.Type, v.Rule.Business, v.Rule.ID)
case monitor.BusArc:
url = fmt.Sprintf("http://manager.bilibili.co/#!/archive_utils/all?monitor_list=%d_%d_%d", v.Rule.Type, v.Rule.Business, v.Rule.ID)
}
body += fmt.Sprintf("\n跳转链接%s", url)
if v.Rule.RuleConf.Notify.Way == monitor.NotifyTypeEmail {
tpl := s.email.MonitorNotifyTemplate(subject, body, v.Rule.RuleConf.Notify.Member)
log.Info("monitorNotify() email template(%v)", *tpl)
s.email.PushToRedis(c, tpl)
} else {
log.Error("monitorNotify() unknown notify rule(%d) type(%s)", v.Rule.ID, v.Rule.RuleConf.Notify.Way)
continue
}
}
}