metrics.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package metrics
  2. import (
  3. "sync"
  4. "time"
  5. "github.com/gravitl/netmaker/models"
  6. )
  7. // lock for metrics map
  8. var metricsMapLock = &sync.RWMutex{}
  9. // metrics data map
  10. var metricsPeerMap = make(map[string]map[string]*models.ProxyMetric)
  11. // GetMetricByServer - get metric data of peers by server
  12. func GetMetricByServer(server string) map[string]*models.ProxyMetric {
  13. metricsMapLock.RLock()
  14. defer metricsMapLock.RUnlock()
  15. if _, ok := metricsPeerMap[server]; !ok {
  16. return nil
  17. }
  18. return metricsPeerMap[server]
  19. }
  20. // GetMetric - fetches the metric data for the peer
  21. func GetMetric(server, peerKey string) models.ProxyMetric {
  22. metric := models.ProxyMetric{}
  23. peerMetricMap := GetMetricByServer(server)
  24. metricsMapLock.RLock()
  25. defer metricsMapLock.RUnlock()
  26. if peerMetricMap == nil {
  27. return metric
  28. }
  29. if m, ok := peerMetricMap[peerKey]; ok && m != nil {
  30. metric = *m
  31. }
  32. return metric
  33. }
  34. // UpdateMetric - updates metric data for the peer
  35. func UpdateMetric(server, peerKey string, metric *models.ProxyMetric) {
  36. metricsMapLock.Lock()
  37. defer metricsMapLock.Unlock()
  38. if metricsPeerMap[server] == nil {
  39. metricsPeerMap[server] = make(map[string]*models.ProxyMetric)
  40. }
  41. metricsPeerMap[server][peerKey] = metric
  42. }
  43. // UpdateMetricByPeer - updates metrics data by peer public key
  44. func UpdateMetricByPeer(peerKey string, metric *models.ProxyMetric, onlyTraffic bool) {
  45. metricsMapLock.Lock()
  46. defer metricsMapLock.Unlock()
  47. for server, peerKeyMap := range metricsPeerMap {
  48. if peerMetric, ok := peerKeyMap[peerKey]; ok {
  49. peerMetric.TrafficRecieved += metric.TrafficRecieved
  50. peerMetric.TrafficSent += metric.TrafficSent
  51. if !onlyTraffic {
  52. peerMetric.LastRecordedLatency = metric.LastRecordedLatency
  53. }
  54. metricsPeerMap[server][peerKey] = peerMetric
  55. }
  56. }
  57. }
  58. // ResetMetricsForPeer - reset metrics for peer
  59. func ResetMetricsForPeer(server, peerKey string) {
  60. metricsMapLock.Lock()
  61. defer metricsMapLock.Unlock()
  62. delete(metricsPeerMap[server], peerKey)
  63. }
  64. // ResetMetricForNode - resets node level metrics
  65. func ResetMetricForNode(server, peerKey, peerID string) {
  66. metric := GetMetric(server, peerKey)
  67. delete(metric.NodeConnectionStatus, peerID)
  68. UpdateMetric(server, peerKey, &metric)
  69. }
  70. // MetricCollectionInterval - collection interval for metrics
  71. const MetricCollectionInterval = time.Second * 25