mirror of
https://github.com/bolucat/Archive.git
synced 2025-10-06 00:27:31 +08:00
Update On Fri Sep 6 20:35:08 CEST 2024
This commit is contained in:
134
echo/internal/web/handler_api.go
Normal file
134
echo/internal/web/handler_api.go
Normal file
@@ -0,0 +1,134 @@
|
||||
package web
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/Ehco1996/ehco/internal/cmgr/ms"
|
||||
"github.com/labstack/echo/v4"
|
||||
)
|
||||
|
||||
const (
|
||||
defaultTimeRange = 60 // seconds
|
||||
errInvalidParam = "invalid parameter: %s"
|
||||
)
|
||||
|
||||
type queryParams struct {
|
||||
startTS int64
|
||||
endTS int64
|
||||
refresh bool
|
||||
}
|
||||
|
||||
func parseQueryParams(c echo.Context) (*queryParams, error) {
|
||||
now := time.Now().Unix()
|
||||
params := &queryParams{
|
||||
startTS: now - defaultTimeRange,
|
||||
endTS: now,
|
||||
refresh: false,
|
||||
}
|
||||
|
||||
if start, err := parseTimestamp(c.QueryParam("start_ts")); err == nil {
|
||||
params.startTS = start
|
||||
}
|
||||
|
||||
if end, err := parseTimestamp(c.QueryParam("end_ts")); err == nil {
|
||||
params.endTS = end
|
||||
}
|
||||
|
||||
if refresh, err := strconv.ParseBool(c.QueryParam("latest")); err == nil {
|
||||
params.refresh = refresh
|
||||
}
|
||||
|
||||
if params.startTS >= params.endTS {
|
||||
return nil, fmt.Errorf(errInvalidParam, "time range")
|
||||
}
|
||||
|
||||
return params, nil
|
||||
}
|
||||
|
||||
func parseTimestamp(s string) (int64, error) {
|
||||
if s == "" {
|
||||
return 0, fmt.Errorf("empty timestamp")
|
||||
}
|
||||
return strconv.ParseInt(s, 10, 64)
|
||||
}
|
||||
|
||||
func (s *Server) GetNodeMetrics(c echo.Context) error {
|
||||
params, err := parseQueryParams(c)
|
||||
if err != nil {
|
||||
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
|
||||
}
|
||||
req := &ms.QueryNodeMetricsReq{StartTimestamp: params.startTS, EndTimestamp: params.endTS, Num: -1}
|
||||
if params.refresh {
|
||||
req.Num = 1
|
||||
}
|
||||
metrics, err := s.connMgr.QueryNodeMetrics(c.Request().Context(), req, params.refresh)
|
||||
if err != nil {
|
||||
return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return c.JSON(http.StatusOK, metrics)
|
||||
}
|
||||
|
||||
func (s *Server) GetRuleMetrics(c echo.Context) error {
|
||||
params, err := parseQueryParams(c)
|
||||
if err != nil {
|
||||
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
|
||||
}
|
||||
req := &ms.QueryRuleMetricsReq{
|
||||
StartTimestamp: params.startTS,
|
||||
EndTimestamp: params.endTS,
|
||||
Num: -1,
|
||||
RuleLabel: c.QueryParam("label"),
|
||||
Remote: c.QueryParam("remote"),
|
||||
}
|
||||
if params.refresh {
|
||||
req.Num = 1
|
||||
}
|
||||
|
||||
metrics, err := s.connMgr.QueryRuleMetrics(c.Request().Context(), req, params.refresh)
|
||||
if err != nil {
|
||||
return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return c.JSON(http.StatusOK, metrics)
|
||||
}
|
||||
|
||||
func (s *Server) CurrentConfig(c echo.Context) error {
|
||||
ret, err := json.Marshal(s.cfg)
|
||||
if err != nil {
|
||||
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
|
||||
}
|
||||
|
||||
return c.JSONBlob(http.StatusOK, ret)
|
||||
}
|
||||
|
||||
func (s *Server) HandleReload(c echo.Context) error {
|
||||
if s.Reloader == nil {
|
||||
return echo.NewHTTPError(http.StatusBadRequest, "reload not support")
|
||||
}
|
||||
err := s.Reloader.Reload(true)
|
||||
if err != nil {
|
||||
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
|
||||
}
|
||||
|
||||
if _, err := c.Response().Write([]byte("reload success")); err != nil {
|
||||
s.l.Errorf("write response meet err=%v", err)
|
||||
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) HandleHealthCheck(c echo.Context) error {
|
||||
relayLabel := c.QueryParam("relay_label")
|
||||
if relayLabel == "" {
|
||||
return echo.NewHTTPError(http.StatusBadRequest, "relay_label is required")
|
||||
}
|
||||
latency, err := s.HealthCheck(c.Request().Context(), relayLabel)
|
||||
if err != nil {
|
||||
res := HealthCheckResp{Message: err.Error(), ErrorCode: -1}
|
||||
return c.JSON(http.StatusBadRequest, res)
|
||||
}
|
||||
return c.JSON(http.StatusOK, HealthCheckResp{Message: "connect success", Latency: latency})
|
||||
}
|
Reference in New Issue
Block a user