metrics.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package ee_controllers
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "github.com/gorilla/mux"
  6. "github.com/gravitl/netmaker/database"
  7. "github.com/gravitl/netmaker/logger"
  8. "github.com/gravitl/netmaker/logic"
  9. "github.com/gravitl/netmaker/models"
  10. )
  11. // MetricHandlers - How we handle EE Metrics
  12. func MetricHandlers(r *mux.Router) {
  13. r.HandleFunc("/api/metrics/{network}/{nodeid}", logic.SecurityCheck(true, http.HandlerFunc(getNodeMetrics))).Methods(http.MethodGet)
  14. r.HandleFunc("/api/metrics/{network}", logic.SecurityCheck(true, http.HandlerFunc(getNetworkNodesMetrics))).Methods(http.MethodGet)
  15. r.HandleFunc("/api/metrics", logic.SecurityCheck(true, http.HandlerFunc(getAllMetrics))).Methods(http.MethodGet)
  16. r.HandleFunc("/api/metrics-ext/{network}", logic.SecurityCheck(true, http.HandlerFunc(getNetworkExtMetrics))).Methods(http.MethodGet)
  17. }
  18. // get the metrics of a given node
  19. func getNodeMetrics(w http.ResponseWriter, r *http.Request) {
  20. // set header.
  21. w.Header().Set("Content-Type", "application/json")
  22. var params = mux.Vars(r)
  23. nodeID := params["nodeid"]
  24. logger.Log(1, r.Header.Get("user"), "requested fetching metrics for node", nodeID, "on network", params["network"])
  25. metrics, err := logic.GetMetrics(nodeID)
  26. if err != nil {
  27. logger.Log(1, r.Header.Get("user"), "failed to fetch metrics of node", nodeID, err.Error())
  28. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  29. return
  30. }
  31. logger.Log(1, r.Header.Get("user"), "fetched metrics for node", params["nodeid"])
  32. w.WriteHeader(http.StatusOK)
  33. json.NewEncoder(w).Encode(metrics)
  34. }
  35. // get the metrics of all nodes in given network
  36. func getNetworkNodesMetrics(w http.ResponseWriter, r *http.Request) {
  37. // set header.
  38. w.Header().Set("Content-Type", "application/json")
  39. var params = mux.Vars(r)
  40. network := params["network"]
  41. logger.Log(1, r.Header.Get("user"), "requested fetching network node metrics on network", network)
  42. networkNodes, err := logic.GetNetworkNodes(network)
  43. if err != nil {
  44. logger.Log(1, r.Header.Get("user"), "failed to fetch metrics of all nodes in network", network, err.Error())
  45. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  46. return
  47. }
  48. networkMetrics := models.NetworkMetrics{}
  49. networkMetrics.Nodes = make(models.MetricsMap)
  50. for i := range networkNodes {
  51. id := networkNodes[i].ID
  52. metrics, err := logic.GetMetrics(id.String())
  53. if err != nil {
  54. logger.Log(1, r.Header.Get("user"), "failed to append metrics of node", id.String(), "during network metrics fetch", err.Error())
  55. continue
  56. }
  57. networkMetrics.Nodes[id.String()] = *metrics
  58. }
  59. logger.Log(1, r.Header.Get("user"), "fetched metrics for network", network)
  60. w.WriteHeader(http.StatusOK)
  61. json.NewEncoder(w).Encode(networkMetrics)
  62. }
  63. // get the metrics for ext clients on a given network
  64. func getNetworkExtMetrics(w http.ResponseWriter, r *http.Request) {
  65. // set header.
  66. w.Header().Set("Content-Type", "application/json")
  67. var params = mux.Vars(r)
  68. network := params["network"]
  69. logger.Log(1, r.Header.Get("user"), "requested fetching external client metrics on network", network)
  70. ingresses, err := logic.GetNetworkIngresses(network) // grab all the ingress gateways
  71. if err != nil {
  72. logger.Log(1, r.Header.Get("user"), "failed to fetch metrics of ext clients in network", network, err.Error())
  73. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  74. return
  75. }
  76. clients, err := logic.GetNetworkExtClients(network) // grab all the network ext clients
  77. if err != nil {
  78. if database.IsEmptyRecord(err) {
  79. var metrics struct{}
  80. w.WriteHeader(http.StatusOK)
  81. json.NewEncoder(w).Encode(metrics)
  82. return
  83. }
  84. logger.Log(1, r.Header.Get("user"), "failed to fetch metrics of ext clients in network", network, err.Error())
  85. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  86. return
  87. }
  88. networkMetrics := models.Metrics{}
  89. networkMetrics.Connectivity = make(map[string]models.Metric)
  90. for i := range ingresses {
  91. id := ingresses[i].ID
  92. ingressMetrics, err := logic.GetMetrics(id.String())
  93. if err != nil {
  94. logger.Log(1, r.Header.Get("user"), "failed to append external client metrics from ingress node", id.String(), err.Error())
  95. continue
  96. }
  97. if ingressMetrics.Connectivity == nil {
  98. continue
  99. }
  100. for j := range clients {
  101. if clients[j].Network != network {
  102. continue
  103. }
  104. // if metrics for that client have been reported, append them
  105. if len(ingressMetrics.Connectivity[clients[j].ClientID].NodeName) > 0 {
  106. networkMetrics.Connectivity[clients[j].ClientID] = ingressMetrics.Connectivity[clients[j].ClientID]
  107. }
  108. }
  109. }
  110. logger.Log(1, r.Header.Get("user"), "fetched ext client metrics for network", network)
  111. w.WriteHeader(http.StatusOK)
  112. json.NewEncoder(w).Encode(networkMetrics.Connectivity)
  113. }
  114. // get Metrics of all nodes on server, lots of data
  115. func getAllMetrics(w http.ResponseWriter, r *http.Request) {
  116. w.Header().Set("Content-Type", "application/json")
  117. logger.Log(1, r.Header.Get("user"), "requested fetching all metrics")
  118. allNodes, err := logic.GetAllNodes()
  119. if err != nil {
  120. logger.Log(1, r.Header.Get("user"), "failed to fetch metrics of all nodes on server", err.Error())
  121. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  122. return
  123. }
  124. networkMetrics := models.NetworkMetrics{}
  125. networkMetrics.Nodes = make(models.MetricsMap)
  126. for i := range allNodes {
  127. id := allNodes[i].ID
  128. metrics, err := logic.GetMetrics(id.String())
  129. if err != nil {
  130. logger.Log(1, r.Header.Get("user"), "failed to append metrics of node", id.String(), "during all nodes metrics fetch", err.Error())
  131. continue
  132. }
  133. networkMetrics.Nodes[id.String()] = *metrics
  134. }
  135. logger.Log(1, r.Header.Get("user"), "fetched metrics for all nodes on server")
  136. w.WriteHeader(http.StatusOK)
  137. json.NewEncoder(w).Encode(networkMetrics)
  138. }