package provider import ( R "github.com/yusing/go-proxy/internal/route" "github.com/yusing/go-proxy/internal/route/provider/types" route "github.com/yusing/go-proxy/internal/route/types" "github.com/yusing/go-proxy/internal/watcher/health" ) type ( RouteStats struct { Total uint16 `json:"total"` NumHealthy uint16 `json:"healthy"` NumUnhealthy uint16 `json:"unhealthy"` NumNapping uint16 `json:"napping"` NumError uint16 `json:"error"` NumUnknown uint16 `json:"unknown"` } ProviderStats struct { Total uint16 `json:"total"` RPs RouteStats `json:"reverse_proxies"` Streams RouteStats `json:"streams"` Type types.ProviderType `json:"type"` } ) func (stats *RouteStats) Add(r *R.Route) { stats.Total++ switch r.Health() { case health.StatusHealthy: stats.NumHealthy++ case health.StatusUnhealthy: stats.NumUnhealthy++ case health.StatusNapping: stats.NumNapping++ case health.StatusError: stats.NumError++ default: stats.NumUnknown++ } } func (stats *RouteStats) AddOther(other RouteStats) { stats.Total += other.Total stats.NumHealthy += other.NumHealthy stats.NumUnhealthy += other.NumUnhealthy stats.NumNapping += other.NumNapping stats.NumError += other.NumError stats.NumUnknown += other.NumUnknown } func (p *Provider) Statistics() ProviderStats { var rps, streams RouteStats p.routes.RangeAll(func(_ string, r *R.Route) { switch r.Type { case route.RouteTypeReverseProxy: rps.Add(r) case route.RouteTypeStream: streams.Add(r) } }) return ProviderStats{ Total: rps.Total + streams.Total, RPs: rps, Streams: streams, Type: p.t, } }