metrics.go 2.5 KB

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