metrics.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package metrics
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. "github.com/go-ping/ping"
  7. "github.com/gravitl/netmaker/logger"
  8. "github.com/gravitl/netmaker/models"
  9. )
  10. // lock for metrics map
  11. var metricsMapLock = &sync.RWMutex{}
  12. // metrics data map
  13. var metricsPeerMap = make(map[string]map[string]*models.ProxyMetric)
  14. // GetMetricByServer - get metric data of peers by server
  15. func GetMetricByServer(server string) map[string]*models.ProxyMetric {
  16. metricsMapLock.RLock()
  17. defer metricsMapLock.RUnlock()
  18. if _, ok := metricsPeerMap[server]; !ok {
  19. return nil
  20. }
  21. return metricsPeerMap[server]
  22. }
  23. // GetMetric - fetches the metric data for the peer
  24. func GetMetric(server, peerKey string) models.ProxyMetric {
  25. metric := models.ProxyMetric{}
  26. peerMetricMap := GetMetricByServer(server)
  27. metricsMapLock.RLock()
  28. defer metricsMapLock.RUnlock()
  29. if peerMetricMap == nil {
  30. return metric
  31. }
  32. if m, ok := peerMetricMap[peerKey]; ok && m != nil {
  33. metric = *m
  34. }
  35. return metric
  36. }
  37. // UpdateMetric - updates metric data for the peer
  38. func UpdateMetric(server, peerKey string, metric *models.ProxyMetric) {
  39. metricsMapLock.Lock()
  40. defer metricsMapLock.Unlock()
  41. if metricsPeerMap[server] == nil {
  42. metricsPeerMap[server] = make(map[string]*models.ProxyMetric)
  43. }
  44. metricsPeerMap[server][peerKey] = metric
  45. }
  46. // UpdateMetricByPeer - updates metrics data by peer public key
  47. func UpdateMetricByPeer(peerKey string, metric *models.ProxyMetric, onlyTraffic bool) {
  48. metricsMapLock.Lock()
  49. defer metricsMapLock.Unlock()
  50. for server, peerKeyMap := range metricsPeerMap {
  51. if peerMetric, ok := peerKeyMap[peerKey]; ok {
  52. peerMetric.TrafficRecieved += metric.TrafficRecieved
  53. peerMetric.TrafficSent += metric.TrafficSent
  54. if !onlyTraffic {
  55. peerMetric.LastRecordedLatency = metric.LastRecordedLatency
  56. }
  57. metricsPeerMap[server][peerKey] = peerMetric
  58. }
  59. }
  60. }
  61. // ResetMetricsForPeer - reset metrics for peer
  62. func ResetMetricsForPeer(server, peerKey string) {
  63. metricsMapLock.Lock()
  64. defer metricsMapLock.Unlock()
  65. delete(metricsPeerMap[server], peerKey)
  66. }
  67. // ResetMetricForNode - resets node level metrics
  68. func ResetMetricForNode(server, peerKey, peerID string) {
  69. metric := GetMetric(server, peerKey)
  70. delete(metric.NodeConnectionStatus, peerID)
  71. UpdateMetric(server, peerKey, &metric)
  72. }
  73. const MetricCollectionInterval = time.Second * 25
  74. // PeerConnectionStatus - get peer connection status by pinging
  75. func PeerConnectionStatus(address string) (connected bool) {
  76. fmt.Println("PINGER ADDR: ", address)
  77. pinger, err := ping.NewPinger(address)
  78. if err != nil {
  79. logger.Log(0, "could not initiliaze ping peer address", address, err.Error())
  80. connected = false
  81. } else {
  82. pinger.Timeout = time.Second * 2
  83. err = pinger.Run()
  84. if err != nil {
  85. logger.Log(0, "failed to ping on peer address", address, err.Error())
  86. return false
  87. } else {
  88. pingStats := pinger.Statistics()
  89. if pingStats.PacketsRecv > 0 {
  90. connected = true
  91. return
  92. }
  93. }
  94. }
  95. return
  96. }