monitor.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "go-common/app/job/main/videoup-report/model/archive"
  6. "go-common/app/job/main/videoup-report/model/monitor"
  7. "go-common/library/log"
  8. "time"
  9. )
  10. // hdlMonitorArc deal with archive stay stats
  11. func (s *Service) hdlMonitorArc(nw, old *archive.Archive) (err error) {
  12. defer func() {
  13. if pErr := recover(); pErr != nil {
  14. log.Error("s.hdlMonitorArc panic(%v)", pErr)
  15. }
  16. }()
  17. var (
  18. oKey, nKey string
  19. kFormat = monitor.RedisPrefix + monitor.SuffixArc
  20. addit *archive.Addit
  21. )
  22. log.Info("hdlMonitorArc (%v,%v)", nw, old)
  23. if addit, err = s.arc.Addit(context.TODO(), nw.ID); err != nil {
  24. log.Error("s.hdlMonitorArc() s.arc.Addit(%d) error(%v)", nw.ID, err)
  25. return
  26. }
  27. //去掉PGC稿件
  28. if addit != nil && (addit.UpFrom == archive.UpFromPGC || addit.UpFrom == archive.UpFromPGCSecret || addit.UpFrom == archive.UpFromCoopera) {
  29. return
  30. }
  31. if old != nil {
  32. if nw.Round == old.Round && nw.State == old.State {
  33. return
  34. }
  35. oKey = fmt.Sprintf(kFormat, monitor.BusArc, old.Round, old.State)
  36. }
  37. //忽略Round 99 state不为-6,-1,0,1的数据
  38. if nw.Round != archive.RoundEnd && (nw.State == archive.StateForbidFixed || nw.State == archive.StateForbidWait || nw.State == archive.StateOpen || nw.State == archive.StateOrange) {
  39. nKey = fmt.Sprintf(kFormat, monitor.BusArc, nw.Round, nw.State)
  40. }
  41. //回查忽略活动稿件
  42. if addit != nil && addit.MissionID > 0 && (nw.Round == archive.RoundReviewFirst || nw.Round == archive.RoundReviewFirstWaitTrigger || nw.Round == archive.RoundReviewSecond || nw.Round == archive.RoundTriggerClick) {
  43. nKey = ""
  44. }
  45. log.Info("hdlMonitorArc () s.monitorSave(%s,%s,%d)", oKey, nKey, nw.ID)
  46. err = s.monitorSave(oKey, nKey, nw.ID)
  47. return
  48. }
  49. // hdlMonitorVideo 视频审核监控
  50. func (s *Service) hdlMonitorVideo(nv, ov *archive.Video) (err error) {
  51. var (
  52. oKey, nKey string
  53. kFormat = monitor.RedisPrefix + monitor.SuffixVideo
  54. )
  55. log.Info("hdlMonitorVideo (%v,%v)", nv, ov)
  56. if ov != nil {
  57. if nv.Status == ov.Status {
  58. return
  59. }
  60. oKey = fmt.Sprintf(kFormat, monitor.BusVideo, ov.Status)
  61. }
  62. if nv.Status == archive.VideoStatusSubmit || nv.Status == archive.VideoStatusWait {
  63. nKey = fmt.Sprintf(kFormat, monitor.BusVideo, nv.Status)
  64. }
  65. log.Info("hdlMonitorVideo () s.monitorSave(%s,%s,%d) filename(%s)", oKey, nKey, nv.ID, nv.Filename)
  66. err = s.monitorSave(oKey, nKey, nv.ID)
  67. return
  68. }
  69. func (s *Service) monitorSave(oKey, nKey string, oid int64) (err error) {
  70. defer func() {
  71. if pErr := recover(); pErr != nil {
  72. log.Error("s.monitorSave panic(%v)", pErr)
  73. }
  74. }()
  75. var c = context.TODO()
  76. if oKey != "" {
  77. if err = s.redis.RemMonitorStats(c, oKey, oid); err != nil {
  78. log.Error("s.monitorSave() RemMonitorStats(%s,%d) error(%v)", oKey, oid, err)
  79. }
  80. s.redis.ClearMonitorStats(c, oKey)
  81. }
  82. if nKey != "" {
  83. if err = s.redis.AddMonitorStats(c, nKey, oid); err != nil {
  84. log.Error("s.monitorSave() AddMonitorStats(%s,%d) error(%v)", nKey, oid, err)
  85. return
  86. }
  87. s.redis.ClearMonitorStats(c, nKey)
  88. }
  89. if err != nil {
  90. log.Error("s.monitorSave(%s,%s,%d) error(%v)", oKey, nKey, oid, err)
  91. }
  92. return
  93. }
  94. //monitorNotifyEmail 发送监控通知
  95. func (s *Service) monitorNotify() {
  96. var (
  97. c = context.TODO()
  98. data []*monitor.RuleResultData
  99. err error
  100. )
  101. defer func() {
  102. if err := recover(); err != nil {
  103. log.Error("monitorNotifyEmail() panic(%v)", err)
  104. }
  105. }()
  106. // 从admin获取报警数据
  107. if data, err = s.dataDao.MonitorNotify(c); err != nil {
  108. log.Error("s.dataDao.MonitorNotify() error(%v)", err)
  109. return
  110. }
  111. for _, v := range data {
  112. if v.Rule.State != monitor.RuleStateOK {
  113. log.Error("monitorNotify() ignore rule(%d) state(%d)", v.Rule.ID, v.Rule.State)
  114. continue
  115. }
  116. subject := fmt.Sprintf("%s监控", v.Rule.Name)
  117. 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"))
  118. url := ""
  119. switch v.Rule.Business {
  120. case monitor.BusVideo:
  121. url = fmt.Sprintf("http://manager.bilibili.co/#!/video/list?monitor_list=%d_%d_%d", v.Rule.Type, v.Rule.Business, v.Rule.ID)
  122. case monitor.BusArc:
  123. url = fmt.Sprintf("http://manager.bilibili.co/#!/archive_utils/all?monitor_list=%d_%d_%d", v.Rule.Type, v.Rule.Business, v.Rule.ID)
  124. }
  125. body += fmt.Sprintf("\n跳转链接:%s", url)
  126. if v.Rule.RuleConf.Notify.Way == monitor.NotifyTypeEmail {
  127. tpl := s.email.MonitorNotifyTemplate(subject, body, v.Rule.RuleConf.Notify.Member)
  128. log.Info("monitorNotify() email template(%v)", *tpl)
  129. s.email.PushToRedis(c, tpl)
  130. } else {
  131. log.Error("monitorNotify() unknown notify rule(%d) type(%s)", v.Rule.ID, v.Rule.RuleConf.Notify.Way)
  132. continue
  133. }
  134. }
  135. }