ping.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package task
  2. import (
  3. "github.com/gogf/gf/v2/frame/g"
  4. "github.com/gogf/gf/v2/os/glog"
  5. "golang.org/x/net/context"
  6. "net"
  7. "nodeMonitor/internal/model"
  8. "nodeMonitor/internal/service"
  9. "nodeMonitor/library/nettools"
  10. "sync"
  11. "time"
  12. )
  13. func Ping(ctx context.Context) {
  14. glog.Debug(ctx, "start ping .....")
  15. var wg sync.WaitGroup
  16. //获取节点数据
  17. nodeList, err := service.Node().GetNode(ctx)
  18. if err != nil {
  19. glog.Debug(ctx, err.Error())
  20. return
  21. }
  22. for _, target := range nodeList {
  23. wg.Add(1)
  24. //glog.Debug(ctx, target)
  25. go PingTask(ctx, target.Host, &wg, target.PingType, target.Port)
  26. }
  27. wg.Wait()
  28. go CheckNodeStatus(ctx)
  29. }
  30. func PingTask(ctx context.Context, t string, wg *sync.WaitGroup, pingType int, hostPort int) {
  31. //var ipSlice []string
  32. //ipSlice = append(ipSlice, "kdvkr-02.xyz")
  33. //ipSlice = append(ipSlice, "kdvkr-04.xyz")
  34. pingCount, err := g.Cfg().Get(ctx, "node.pingCount")
  35. if err != nil {
  36. glog.Debug(ctx, err.Error())
  37. return
  38. }
  39. stat := model.PingSt{}
  40. stat.MinDelay = -1
  41. lossPK := 0
  42. addr, err := net.ResolveIPAddr("ip", t)
  43. if err == nil {
  44. for i := 0; i < pingCount.Int(); i++ {
  45. starttime := time.Now().UnixNano()
  46. var rest nettools.IPingResult
  47. if pingType == 0 { //icmp
  48. icmping := nettools.NewIcmpPing(addr.String(), time.Second*4)
  49. rest = icmping.Ping()
  50. } else if pingType == 1 {
  51. tcpping := nettools.NewTcpPing(addr.String(), hostPort, time.Second*4)
  52. rest = tcpping.Ping()
  53. }
  54. if rest.Error() == nil {
  55. delay := rest.Result()
  56. //seelog.Info("[func:IcmpPing] Finish Addr:", addr, delay, "ms")
  57. stat.AvgDelay = stat.AvgDelay + rest.Result()
  58. if stat.MaxDelay < delay {
  59. stat.MaxDelay = delay
  60. }
  61. if stat.MinDelay == -1 || stat.MinDelay > delay {
  62. stat.MinDelay = delay
  63. }
  64. stat.RevcPk = stat.RevcPk + 1
  65. } else {
  66. glog.Debug(ctx, "[func:StartPing IcmpPing] ID:", i, " IP:", addr, "| err:", rest.Error())
  67. lossPK = lossPK + 1
  68. }
  69. stat.SendPk = stat.SendPk + 1
  70. stat.LossPk = int((float64(lossPK) / float64(stat.SendPk)) * 100)
  71. duringtime := time.Now().UnixNano() - starttime
  72. time.Sleep(time.Duration(3000*1000000-duringtime) * time.Nanosecond)
  73. }
  74. if stat.RevcPk > 0 {
  75. stat.AvgDelay = stat.AvgDelay / stat.RevcPk
  76. } else {
  77. stat.AvgDelay = 0.0
  78. }
  79. glog.Debug(ctx, "[func:IcmpPing] Finish Addr:", addr, " MaxDelay:", stat.MaxDelay, " MinDelay:", stat.MinDelay, " AvgDelay:", stat.AvgDelay, " Revc:", stat.RevcPk, " LossPK:", stat.LossPk)
  80. } else {
  81. stat.AvgDelay = 0.00
  82. stat.MinDelay = 0.00
  83. stat.MaxDelay = 0.00
  84. stat.SendPk = 0
  85. stat.RevcPk = 0
  86. stat.LossPk = 100
  87. glog.Debug(ctx, "[func:IcmpPing] Finish Addr:", addr, " Unable to resolve destination host")
  88. }
  89. //添加到数据库
  90. AddPingLog(ctx, stat, t)
  91. wg.Done()
  92. }
  93. func AddPingLog(ctx context.Context, pingres model.PingSt, addr string) {
  94. err := service.Ping().Create(ctx, pingres, addr)
  95. if err != nil {
  96. glog.Debug(ctx, err.Error())
  97. return
  98. }
  99. return
  100. }
  101. func CheckNodeStatus(ctx context.Context) {
  102. nodeList, err := service.Node().GetNode(ctx)
  103. if err != nil {
  104. glog.Debug(ctx, err.Error())
  105. return
  106. }
  107. for _, target := range nodeList {
  108. glog.Debug(ctx, "start url req .....")
  109. //获取不通的IP进程url请求
  110. status, err := service.Ping().GetStatus(ctx, target.Host)
  111. if err != nil {
  112. glog.Error(ctx, err.Error())
  113. return
  114. }
  115. if status {
  116. if target.UrlStatus == 200 {
  117. return
  118. }
  119. r, err := g.Client().Get(ctx, target.Url)
  120. if err != nil {
  121. glog.Error(ctx, err.Error())
  122. return
  123. }
  124. defer r.Close()
  125. glog.Debug(ctx, "req :", target.Url, "status :", r.Status)
  126. if r.StatusCode == 200 {
  127. err := service.Node().UpdateNodeUrlStatus(ctx, model.NodeCreateInput{Host: target.Host, UrlStatus: r.StatusCode})
  128. if err != nil {
  129. glog.Debug(ctx, err.Error())
  130. return
  131. }
  132. }
  133. }
  134. }
  135. }