game_alarm.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // 已不使用此功能 改用脚本定时检测上报
  2. package jobs
  3. import (
  4. "context"
  5. "fmt"
  6. "gadmin/config"
  7. "gadmin/internal/admin/consts"
  8. "gadmin/internal/admin/library/docker"
  9. "gadmin/internal/gorm/model"
  10. "gadmin/internal/gorm/query"
  11. "os"
  12. "strings"
  13. "sync"
  14. "time"
  15. "github.com/go-resty/resty/v2"
  16. "github.com/sirupsen/logrus"
  17. )
  18. var GameAlarm = new(jGameAlarm)
  19. type jGameAlarm struct {
  20. sync.RWMutex
  21. }
  22. func (j *jGameAlarm) Run() {
  23. logrus.Info("jGameAlarm Run.....")
  24. if os.Getenv("GIN_MODE") == "release" || os.Getenv("ADMIN_IS_LOCAL") == "1" {
  25. j.handle()
  26. } else {
  27. logrus.Warn("非正式环境无需报警,跳过..")
  28. }
  29. }
  30. func (j *jGameAlarm) handle() {
  31. j.RLock()
  32. defer j.RUnlock()
  33. var (
  34. ctx = context.TODO()
  35. q = query.Use(config.DB).ServerDeploy
  36. m = q.WithContext(ctx).Where(q.Environment.Eq("release")).Where(q.AlarmSwitch.Eq(1)) // 只监测正式服
  37. lists []*model.ServerDeploy
  38. )
  39. m = m.Order(q.ID.Desc())
  40. count, err := m.Count()
  41. if err != nil {
  42. logrus.Warnf("GameAlarm count err:%+v", err)
  43. return
  44. }
  45. if count > 0 {
  46. if err = m.Scan(&lists); err != nil {
  47. logrus.Warnf("GameAlarm Scan err:%+v", err)
  48. return
  49. }
  50. }
  51. if len(lists) == 0 {
  52. logrus.Warnf("GameAlarm 没有找到需要监测的服务器..")
  53. return
  54. }
  55. for _, v := range lists {
  56. var monitor = make(map[string]bool)
  57. if consts.DeployTypeGrave == v.ServerType {
  58. monitor = map[string]bool{
  59. "./archive": false,
  60. // "./chapter": false,
  61. "./chapterd": false,
  62. //"./gate": false,
  63. "./store": false,
  64. "./world": false,
  65. }
  66. }
  67. if consts.DeployTypeLogin == v.ServerType {
  68. monitor = map[string]bool{
  69. "./login": false,
  70. }
  71. }
  72. // if consts.DeployTypeGate == v.ServerType {
  73. // monitor = map[string]bool{
  74. // "./gate": false,
  75. // }
  76. // }
  77. if len(monitor) == 0 {
  78. logrus.Warn("GameAlarm monitor is not set")
  79. continue
  80. }
  81. process, err := docker.RetryGraveProcess(docker.GraveProcessInput{Ctx: ctx, Deploy: v}, 5, 0)
  82. if err != nil {
  83. logrus.Warnf("GameAlarm RetryGraveProcess err:%+v", err)
  84. msg := fmt.Sprintf("docker通讯异常:[%v]", err.Error())
  85. //logrus.Warnf("GameAlarm sendAlert docker通讯异常 msg:%+v", msg)
  86. if err = j.sendAlert(v, "-", msg); err != nil {
  87. logrus.Warnf("GameAlarm sendAlert docker通讯异常 err:%+v", err)
  88. continue
  89. }
  90. continue
  91. }
  92. for _, s := range strings.Split(string(process), "\n") {
  93. awk := strings.Split(s, " ")
  94. if _, ok := monitor[awk[len(awk)-1]]; ok {
  95. monitor[awk[len(awk)-1]] = true
  96. }
  97. }
  98. for s, b := range monitor {
  99. if !b {
  100. ps := strings.ReplaceAll(s, "./", "")
  101. if err = j.sendAlert(v, ps, "离线报警"); err != nil {
  102. logrus.Warnf("GameAlarm sendAlert 离线报警 err:%+v", err)
  103. continue
  104. }
  105. }
  106. }
  107. }
  108. }
  109. func (j *jGameAlarm) sendAlert(deploy *model.ServerDeploy, ps, msg string) (err error) {
  110. logrus.Warnf("sendAlert deploy:%+v, ps:%v", deploy, ps)
  111. var (
  112. client = resty.New().SetDebug(true)
  113. url = os.Getenv("SERVER_ALERT_URL")
  114. data = `{"serverName":"%v","process":"%v","content":"%v","time":"%v"}`
  115. )
  116. _, err = client.R().
  117. SetHeader("Content-Type", "application/json").
  118. SetBody(fmt.Sprintf(data, deploy.Name, ps, msg, time.Now().Format("2006-01-02 15:04:05"))).
  119. Post(url)
  120. return
  121. }