mirror of
				https://github.com/gravitl/netmaker.git
				synced 2025-10-31 08:26:23 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			83 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package metrics
 | |
| 
 | |
| import (
 | |
| 	"sync"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/gravitl/netmaker/models"
 | |
| )
 | |
| 
 | |
| // 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
 |