12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package metrics
- import (
- "encoding/json"
- "os"
- "sync"
- "time"
- "github.com/gravitl/netmaker/models"
- )
- func Init() {
- go dumpMetrics()
- }
- // lock for metrics map
- var metricsMapLock = &sync.RWMutex{}
- // metrics data map
- var metricsPeerMap = make(map[string]map[string]*models.ProxyMetric)
- // GetMetricByServer - get metric data of peers by server
- func GetMetricByServer(server string) map[string]*models.ProxyMetric {
- metricsMapLock.RLock()
- defer metricsMapLock.RUnlock()
- if _, ok := metricsPeerMap[server]; !ok {
- return nil
- }
- return metricsPeerMap[server]
- }
- // GetMetric - fetches the metric data for the peer
- func GetMetric(server, peerKey string) models.ProxyMetric {
- metric := models.ProxyMetric{}
- peerMetricMap := GetMetricByServer(server)
- metricsMapLock.RLock()
- defer metricsMapLock.RUnlock()
- if peerMetricMap == nil {
- return metric
- }
- if m, ok := peerMetricMap[peerKey]; ok && m != nil {
- metric = *m
- }
- return metric
- }
- // UpdateMetric - updates metric data for the peer
- func UpdateMetric(server, peerKey string, metric *models.ProxyMetric) {
- metricsMapLock.Lock()
- defer metricsMapLock.Unlock()
- if metricsPeerMap[server] == nil {
- metricsPeerMap[server] = make(map[string]*models.ProxyMetric)
- }
- metricsPeerMap[server][peerKey] = metric
- }
- // UpdateMetricByPeer - updates metrics data by peer public key
- func UpdateMetricByPeer(peerKey string, metric *models.ProxyMetric, onlyTraffic bool) {
- metricsMapLock.Lock()
- defer metricsMapLock.Unlock()
- for server, peerKeyMap := range metricsPeerMap {
- if peerMetric, ok := peerKeyMap[peerKey]; ok {
- peerMetric.TrafficRecieved += metric.TrafficRecieved
- peerMetric.TrafficSent += metric.TrafficSent
- if !onlyTraffic {
- peerMetric.LastRecordedLatency = metric.LastRecordedLatency
- }
- metricsPeerMap[server][peerKey] = peerMetric
- }
- }
- }
- // ResetMetricsForPeer - reset metrics for peer
- func ResetMetricsForPeer(server, peerKey string) {
- metricsMapLock.Lock()
- defer metricsMapLock.Unlock()
- delete(metricsPeerMap[server], peerKey)
- }
- // ResetMetricForNode - resets node level metrics
- func ResetMetricForNode(server, peerKey, peerID string) {
- metric := GetMetric(server, peerKey)
- delete(metric.NodeConnectionStatus, peerID)
- UpdateMetric(server, peerKey, &metric)
- }
- // MetricCollectionInterval - collection interval for metrics
- const MetricCollectionInterval = time.Second * 25
- func dumpMetrics() {
- for {
- time.Sleep(time.Second * 35)
- d, _ := json.MarshalIndent(metricsPeerMap, "", " ")
- os.WriteFile("/tmp/metrics.json", d, 0755)
- }
- }
|