metrics.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package logic
  2. import (
  3. "encoding/json"
  4. "time"
  5. "github.com/gravitl/netmaker/database"
  6. "github.com/gravitl/netmaker/models"
  7. "github.com/gravitl/netmaker/netclient/wireguard"
  8. )
  9. // GetMetrics - gets the metrics
  10. func GetMetrics(nodeid string) (*models.Metrics, error) {
  11. var metrics models.Metrics
  12. record, err := database.FetchRecord(database.METRICS_TABLE_NAME, nodeid)
  13. if err != nil {
  14. if database.IsEmptyRecord(err) {
  15. return &metrics, nil
  16. }
  17. return &metrics, err
  18. }
  19. err = json.Unmarshal([]byte(record), &metrics)
  20. if err != nil {
  21. return &metrics, err
  22. }
  23. return &metrics, nil
  24. }
  25. // UpdateMetrics - updates the metrics of a given client
  26. func UpdateMetrics(nodeid string, metrics *models.Metrics) error {
  27. data, err := json.Marshal(metrics)
  28. if err != nil {
  29. return err
  30. }
  31. return database.Insert(nodeid, string(data), database.METRICS_TABLE_NAME)
  32. }
  33. // DeleteMetrics - deletes metrics of a given node
  34. func DeleteMetrics(nodeid string) error {
  35. return database.DeleteRecord(database.METRICS_TABLE_NAME, nodeid)
  36. }
  37. // CollectServerMetrics - collects metrics for given server node
  38. func CollectServerMetrics(serverID string, networkNodes []models.Node) *models.Metrics {
  39. newServerMetrics := models.Metrics{}
  40. newServerMetrics.Connectivity = make(map[string]models.Metric)
  41. var serverNode models.Node
  42. for i := range networkNodes {
  43. currNodeID := networkNodes[i].ID
  44. if currNodeID == serverID {
  45. serverNode = networkNodes[i]
  46. continue
  47. }
  48. if currMetrics, err := GetMetrics(currNodeID); err == nil {
  49. if currMetrics.Connectivity != nil && currMetrics.Connectivity[serverID].Connected {
  50. metrics := currMetrics.Connectivity[serverID]
  51. metrics.NodeName = networkNodes[i].Name
  52. metrics.IsServer = "no"
  53. newServerMetrics.Connectivity[currNodeID] = metrics
  54. }
  55. } else {
  56. newServerMetrics.Connectivity[currNodeID] = models.Metric{
  57. Connected: false,
  58. Latency: 999,
  59. }
  60. }
  61. }
  62. if serverNode.IsIngressGateway == "yes" {
  63. clients, err := GetExtClientsByID(serverID, serverNode.Network)
  64. if err == nil {
  65. peers, err := wireguard.GetDevicePeers(serverNode.Interface)
  66. if err == nil {
  67. for i := range clients {
  68. for j := range peers {
  69. if clients[i].PublicKey == peers[j].PublicKey.String() {
  70. if peers[j].LastHandshakeTime.Before(time.Now().Add(-(time.Minute * 3))) &&
  71. peers[j].ReceiveBytes > 0 &&
  72. peers[j].TransmitBytes > 0 {
  73. newServerMetrics.Connectivity[clients[i].ClientID] = models.Metric{
  74. NodeName: clients[i].ClientID,
  75. TotalTime: 1,
  76. Uptime: 1,
  77. IsServer: "no",
  78. TotalReceived: peers[j].ReceiveBytes,
  79. TotalSent: peers[j].TransmitBytes,
  80. Connected: true,
  81. }
  82. } else {
  83. newServerMetrics.Connectivity[clients[i].ClientID] = models.Metric{
  84. NodeName: clients[i].ClientID,
  85. TotalTime: 1,
  86. Uptime: 0,
  87. IsServer: "no",
  88. Connected: false,
  89. Latency: 999,
  90. }
  91. }
  92. }
  93. }
  94. }
  95. }
  96. }
  97. }
  98. return &newServerMetrics
  99. }