metrics.go 3.0 KB

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