metrics.go 5.3 KB

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