pinglog.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package pinglog
  2. import (
  3. "github.com/gogf/gf/v2/database/gdb"
  4. "github.com/gogf/gf/v2/frame/g"
  5. "github.com/gogf/gf/v2/os/glog"
  6. "github.com/gogf/gf/v2/os/gtime"
  7. "golang.org/x/net/context"
  8. "nodeMonitor/internal/consts"
  9. "nodeMonitor/internal/dao"
  10. "nodeMonitor/internal/model"
  11. "nodeMonitor/internal/model/do"
  12. "nodeMonitor/internal/service"
  13. )
  14. type (
  15. sPing struct{}
  16. )
  17. func init() {
  18. service.RegisterPing(New())
  19. }
  20. func New() *sPing {
  21. return &sPing{}
  22. }
  23. // Create 创建延迟日志
  24. func (c *sPing) Create(ctx context.Context, ping model.PingSt, setverid int) error {
  25. return dao.Pinglog.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
  26. _, err := dao.Pinglog.Ctx(ctx).Data(do.Pinglog{
  27. Maxdelay: ping.MaxDelay,
  28. Mindelay: ping.MinDelay,
  29. Avgdelay: ping.AvgDelay,
  30. Losspk: ping.LossPk,
  31. Serverid: setverid,
  32. }).Insert()
  33. return err
  34. })
  35. }
  36. func (c *sPing) GetHyStatus(ctx context.Context, ping model.PingSt, serverid int) (bool, error) {
  37. pingConfig, err := service.PingConfig().Get(ctx)
  38. if err != nil {
  39. glog.Debug(ctx, err.Error())
  40. return false, err
  41. }
  42. // 查询节点上一次有离线记录的时间
  43. var lastDownTime *gtime.Time
  44. err = dao.Pinglog.Ctx(ctx).
  45. Where("avgdelay = 0").
  46. Where("losspk > ?", pingConfig.NodeLoos).
  47. Where("maxdelay = 0").
  48. Where("serverid = ?", serverid).
  49. OrderDesc("create_at").
  50. Limit(1).
  51. Scan(&lastDownTime)
  52. if err != nil {
  53. glog.Debug(ctx, err.Error())
  54. return false, err
  55. }
  56. // 如果没有找到上一次的离线记录,返回 false
  57. if lastDownTime == nil {
  58. return false, nil
  59. }
  60. return true, nil
  61. }
  62. // GetStatus 查询节点状态
  63. // SELECT * FROM pinglog WHERE create_at >= DATE_SUB(NOW(),INTERVAL 10 MINUTE) and avgdelay = 0 and losspk >= 0 and maxdelay = 0 and `serverid` = '1'gf
  64. func (c *sPing) GetStatus(ctx context.Context, serverid int) (consts.NodeStatus, error) {
  65. //查询10分钟内的数据
  66. startTime, err := g.Cfg().Get(ctx, "node.startTime")
  67. if err != nil {
  68. glog.Debug(ctx, err.Error())
  69. return consts.Normal, err
  70. }
  71. //查询的数据超过3次就是不ok了
  72. //loos, err := g.Cfg().Get(ctx, "node.loos")
  73. //if err != nil {
  74. // glog.Debug(ctx, err.Error())
  75. // return false, err
  76. //}
  77. // 获取 ping 配置
  78. pingConfig, err := service.PingConfig().Get(ctx)
  79. if err != nil {
  80. glog.Debug(ctx, err.Error())
  81. return consts.Normal, err
  82. }
  83. // 查询最近10分钟内的 ping 日志,判断节点是否不通
  84. failCount, err := dao.Pinglog.Ctx(ctx).
  85. Where("create_at > DATE_SUB(NOW(), INTERVAL ? MINUTE)", startTime).
  86. Where("avgdelay = 0").
  87. Where("losspk > ?", pingConfig.NodeLoos).
  88. Where("maxdelay = 0").
  89. Where("serverid = ?", serverid).
  90. Count()
  91. if err != nil {
  92. glog.Debug(ctx, err.Error())
  93. return consts.Normal, err
  94. }
  95. // 如果节点当前是离线状态
  96. if failCount >= pingConfig.NodeDie {
  97. // Node is down
  98. return consts.Down, nil
  99. }
  100. // 查询节点上一次有离线记录的时间
  101. var lastDownTime *gtime.Time
  102. err = dao.Pinglog.Ctx(ctx).
  103. Where("avgdelay = 0").
  104. Where("losspk > ?", pingConfig.NodeLoos).
  105. Where("maxdelay = 0").
  106. Where("serverid = ?", serverid).
  107. OrderDesc("create_at").
  108. Limit(1).
  109. Scan(&lastDownTime)
  110. if err != nil {
  111. glog.Debug(ctx, err.Error())
  112. return consts.Normal, err
  113. }
  114. // 如果没有找到上一次的离线记录,返回 Normal
  115. if lastDownTime == nil {
  116. return consts.Normal, nil
  117. }
  118. // 查询最近10分钟内的 ping 日志,判断节点是否恢复
  119. successCount, err := dao.Pinglog.Ctx(ctx).
  120. Where("create_at > ?", lastDownTime).
  121. Where("avgdelay > 0").
  122. Where("serverid = ?", serverid).
  123. Count()
  124. if err != nil {
  125. glog.Debug(ctx, err.Error())
  126. return consts.Normal, err
  127. }
  128. // 如果节点之前是离线状态且现在恢复了,返回 Recovered
  129. if successCount >= pingConfig.NodeRecover {
  130. return consts.Recovered, nil
  131. }
  132. // 返回正常状态
  133. return consts.Normal, nil
  134. }
  135. func (c *sPing) ClearLog(ctx context.Context) {
  136. clearLogTime, err := g.Cfg().Get(ctx, "node.clearLogTime")
  137. if err != nil {
  138. glog.Debug(ctx, err.Error())
  139. return
  140. }
  141. timeStartStr := gtime.Now().AddDate(0, 0, -clearLogTime.Int()).String()
  142. glog.Info(ctx, timeStartStr)
  143. _, err = dao.Pinglog.Ctx(ctx).Where("create_at <= ?", timeStartStr).Delete()
  144. if err != nil {
  145. glog.Error(ctx, err)
  146. return
  147. }
  148. }