mirror of
https://github.com/yusing/godoxy.git
synced 2026-01-15 08:03:37 +01:00
54 lines
1.4 KiB
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()
|