Files
godoxy/internal/api/v1/stats.go

54 lines
1.4 KiB
Go

package v1
import (
"net/http"
"time"
"github.com/gin-gonic/gin"
statequery "github.com/yusing/godoxy/internal/config/query"
"github.com/yusing/godoxy/internal/types"
"github.com/yusing/goutils/http/httpheaders"
"github.com/yusing/goutils/http/websocket"
)
type StatsResponse struct {
Proxies ProxyStats `json:"proxies"`
Uptime int64 `json:"uptime"`
} // @name StatsResponse
type ProxyStats struct {
Total uint16 `json:"total"`
ReverseProxies types.RouteStats `json:"reverse_proxies"`
Streams types.RouteStats `json:"streams"`
Providers map[string]types.ProviderStats `json:"providers"`
} // @name ProxyStats
// @x-id "stats"
// @BasePath /api/v1
// @Summary Get GoDoxy stats
// @Description Get stats
// @Tags v1,websocket
// @Accept json
// @Produce json
// @Success 200 {object} StatsResponse
// @Failure 403 {object} apitypes.ErrorResponse
// @Failure 500 {object} apitypes.ErrorResponse
// @Router /stats [get]
func Stats(c *gin.Context) {
getStats := func() (any, error) {
return map[string]any{
"proxies": statequery.GetStatistics(),
"uptime": int64(time.Since(startTime).Round(time.Second).Seconds()),
}, nil
}
if httpheaders.IsWebsocket(c.Request.Header) {
websocket.PeriodicWrite(c, time.Second, getStats)
} else {
stats, _ := getStats()
c.JSON(http.StatusOK, stats)
}
}
var startTime = time.Now()