metrics.go 5.8 KB

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