logic.go 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package queue
  2. import (
  3. "time"
  4. "github.com/gravitl/netmaker/logger"
  5. "github.com/gravitl/netmaker/logic"
  6. "github.com/gravitl/netmaker/models"
  7. "github.com/gravitl/netmaker/netclient/ncutils"
  8. )
  9. func updateNodeMetrics(currentNode *models.Node, newMetrics *models.Metrics) bool {
  10. if newMetrics.FailoverPeers == nil {
  11. newMetrics.FailoverPeers = make(map[string]string)
  12. }
  13. oldMetrics, err := logic.GetMetrics(currentNode.ID.String())
  14. if err != nil {
  15. logger.Log(1, "error finding old metrics for node", currentNode.ID.String())
  16. return false
  17. }
  18. if oldMetrics.FailoverPeers == nil {
  19. oldMetrics.FailoverPeers = make(map[string]string)
  20. }
  21. var attachedClients []models.ExtClient
  22. if currentNode.IsIngressGateway {
  23. clients, err := logic.GetExtClientsByID(currentNode.ID.String(), currentNode.Network)
  24. if err == nil {
  25. attachedClients = clients
  26. }
  27. }
  28. if len(attachedClients) > 0 {
  29. // associate ext clients with IDs
  30. for i := range attachedClients {
  31. extMetric := newMetrics.Connectivity[attachedClients[i].PublicKey]
  32. if len(extMetric.NodeName) == 0 &&
  33. len(newMetrics.Connectivity[attachedClients[i].ClientID].NodeName) > 0 { // cover server clients
  34. extMetric = newMetrics.Connectivity[attachedClients[i].ClientID]
  35. if extMetric.TotalReceived > 0 && extMetric.TotalSent > 0 {
  36. extMetric.Connected = true
  37. }
  38. }
  39. extMetric.NodeName = attachedClients[i].ClientID
  40. delete(newMetrics.Connectivity, attachedClients[i].PublicKey)
  41. newMetrics.Connectivity[attachedClients[i].ClientID] = extMetric
  42. }
  43. }
  44. // run through metrics for each peer
  45. for k := range newMetrics.Connectivity {
  46. currMetric := newMetrics.Connectivity[k]
  47. oldMetric := oldMetrics.Connectivity[k]
  48. currMetric.TotalTime += oldMetric.TotalTime
  49. currMetric.Uptime += oldMetric.Uptime // get the total uptime for this connection
  50. if currMetric.Uptime == 0 || currMetric.TotalTime == 0 {
  51. currMetric.PercentUp = 0
  52. } else {
  53. currMetric.PercentUp = 100.0 * (float64(currMetric.Uptime) / float64(currMetric.TotalTime))
  54. }
  55. totalUpMinutes := currMetric.Uptime * ncutils.CheckInInterval
  56. currMetric.ActualUptime = time.Duration(totalUpMinutes) * time.Minute
  57. delete(oldMetrics.Connectivity, k) // remove from old data
  58. newMetrics.Connectivity[k] = currMetric
  59. }
  60. // add nodes that need failover
  61. nodes, err := logic.GetNetworkNodes(currentNode.Network)
  62. if err != nil {
  63. logger.Log(0, "failed to retrieve nodes while updating metrics")
  64. return false
  65. }
  66. for _, node := range nodes {
  67. if !newMetrics.Connectivity[node.ID.String()].Connected &&
  68. len(newMetrics.Connectivity[node.ID.String()].NodeName) > 0 &&
  69. node.Connected &&
  70. len(node.FailoverNode) > 0 &&
  71. !node.Failover {
  72. newMetrics.FailoverPeers[node.ID.String()] = node.FailoverNode.String()
  73. }
  74. }
  75. shouldUpdate := len(oldMetrics.FailoverPeers) == 0 && len(newMetrics.FailoverPeers) > 0
  76. for k, v := range oldMetrics.FailoverPeers {
  77. if len(newMetrics.FailoverPeers[k]) > 0 && len(v) == 0 {
  78. shouldUpdate = true
  79. }
  80. if len(v) > 0 && len(newMetrics.FailoverPeers[k]) == 0 {
  81. newMetrics.FailoverPeers[k] = v
  82. }
  83. }
  84. for k := range oldMetrics.Connectivity { // cleanup any left over data, self healing
  85. delete(newMetrics.Connectivity, k)
  86. }
  87. return shouldUpdate
  88. }