Merge pull request #1803 from gravitl/feature_nm_proxy_metrics

store proxy metrics in the server
This commit is contained in:
Abhishek K 2022-12-08 14:26:40 +05:30 committed by GitHub
commit bbbbb98995
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 18 deletions

View file

@ -1,19 +1,18 @@
package metrics package metrics
import ( import (
"runtime"
"time" "time"
"github.com/go-ping/ping" "github.com/go-ping/ping"
proxy_metrics "github.com/gravitl/netclient/nm-proxy/metrics"
"github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/logger"
"github.com/gravitl/netmaker/logic" "github.com/gravitl/netmaker/logic"
"github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/models"
"github.com/gravitl/netmaker/netclient/wireguard"
"golang.zx2c4.com/wireguard/wgctrl" "golang.zx2c4.com/wireguard/wgctrl"
) )
// Collect - collects metrics // Collect - collects metrics
func Collect(iface string, peerMap models.PeerMap) (*models.Metrics, error) { func Collect(iface, network string, proxy bool, peerMap models.PeerMap) (*models.Metrics, error) {
var metrics models.Metrics var metrics models.Metrics
metrics.Connectivity = make(map[string]models.Metric) metrics.Connectivity = make(map[string]models.Metric)
var wgclient, err = wgctrl.New() var wgclient, err = wgctrl.New()
@ -22,19 +21,13 @@ func Collect(iface string, peerMap models.PeerMap) (*models.Metrics, error) {
return &metrics, err return &metrics, err
} }
defer wgclient.Close() defer wgclient.Close()
if runtime.GOOS == "darwin" {
iface, err = wireguard.GetRealIface(iface)
if err != nil {
fillUnconnectedData(&metrics, peerMap)
return &metrics, err
}
}
device, err := wgclient.Device(iface) device, err := wgclient.Device(iface)
if err != nil { if err != nil {
fillUnconnectedData(&metrics, peerMap) fillUnconnectedData(&metrics, peerMap)
return &metrics, err return &metrics, err
} }
metrics.ProxyMetrics = make(map[string]proxy_metrics.Metric)
// TODO handle freebsd?? // TODO handle freebsd??
for i := range device.Peers { for i := range device.Peers {
currPeer := device.Peers[i] currPeer := device.Peers[i]
@ -88,6 +81,8 @@ func Collect(iface string, peerMap models.PeerMap) (*models.Metrics, error) {
newMetric.TotalTime = 1 newMetric.TotalTime = 1
metrics.Connectivity[id] = newMetric metrics.Connectivity[id] = newMetric
metrics.ProxyMetrics[id] = proxy_metrics.GetMetric(network, currPeer.PublicKey.String())
proxy_metrics.ResetMetricsForPeer(network, currPeer.PublicKey.String())
} }
fillUnconnectedData(&metrics, peerMap) fillUnconnectedData(&metrics, peerMap)

View file

@ -1,15 +1,20 @@
package models package models
import "time" import (
"time"
proxy "github.com/gravitl/netclient/nm-proxy/metrics"
)
// Metrics - metrics struct // Metrics - metrics struct
type Metrics struct { type Metrics struct {
Network string `json:"network" bson:"network" yaml:"network"` Network string `json:"network" bson:"network" yaml:"network"`
NodeID string `json:"node_id" bson:"node_id" yaml:"node_id"` NodeID string `json:"node_id" bson:"node_id" yaml:"node_id"`
NodeName string `json:"node_name" bson:"node_name" yaml:"node_name"` NodeName string `json:"node_name" bson:"node_name" yaml:"node_name"`
IsServer string `json:"isserver" bson:"isserver" yaml:"isserver" validate:"checkyesorno"` IsServer string `json:"isserver" bson:"isserver" yaml:"isserver" validate:"checkyesorno"`
Connectivity map[string]Metric `json:"connectivity" bson:"connectivity" yaml:"connectivity"` Connectivity map[string]Metric `json:"connectivity" bson:"connectivity" yaml:"connectivity"`
FailoverPeers map[string]string `json:"needsfailover" bson:"needsfailover" yaml:"needsfailover"` FailoverPeers map[string]string `json:"needsfailover" bson:"needsfailover" yaml:"needsfailover"`
ProxyMetrics map[string]proxy.Metric `json:"proxy_metrics" bson:"proxy_metrics" yaml:"proxy_metrics"`
} }
// Metric - holds a metric for data between nodes // Metric - holds a metric for data between nodes

View file

@ -273,6 +273,13 @@ func updateNodeMetrics(currentNode *models.Node, newMetrics *models.Metrics) boo
currMetric.ActualUptime = time.Duration(totalUpMinutes) * time.Minute currMetric.ActualUptime = time.Duration(totalUpMinutes) * time.Minute
delete(oldMetrics.Connectivity, k) // remove from old data delete(oldMetrics.Connectivity, k) // remove from old data
newMetrics.Connectivity[k] = currMetric newMetrics.Connectivity[k] = currMetric
if oldProxyMetric, ok := oldMetrics.ProxyMetrics[k]; ok {
newProxyMetric := newMetrics.ProxyMetrics[k]
newProxyMetric.TrafficSent += oldProxyMetric.TrafficSent
newProxyMetric.TrafficRecieved += oldProxyMetric.TrafficRecieved
newMetrics.ProxyMetrics[k] = newProxyMetric
}
} }
// add nodes that need failover // add nodes that need failover