mirror of
https://github.com/EZ-Api/ez-api.git
synced 2026-01-13 17:47:51 +00:00
Introduce StatsService integration to admin and master handlers, exposing realtime metrics (requests, tokens, QPS, rate limit status) via new endpoints: - GET /admin/masters/:id/realtime - GET /v1/realtime Also embed realtime stats in the existing GET /admin/masters/:id response and change GlobalQPS default to 0 with validation to reject negative values.
82 lines
2.2 KiB
Go
82 lines
2.2 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/alicebob/miniredis/v2"
|
|
"github.com/redis/go-redis/v9"
|
|
)
|
|
|
|
func TestStatsService_KeyRealtimeStats(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
mr := miniredis.RunT(t)
|
|
rdb := redis.NewClient(&redis.Options{Addr: mr.Addr()})
|
|
svc := NewStatsService(rdb)
|
|
|
|
mr.Set("key:stats:hash:requests", "3")
|
|
mr.Set("key:stats:hash:tokens", "42")
|
|
mr.Set("key:stats:hash:last_access", "1700000000")
|
|
|
|
stats, err := svc.GetKeyRealtimeStats(context.Background(), "hash")
|
|
if err != nil {
|
|
t.Fatalf("GetKeyRealtimeStats: %v", err)
|
|
}
|
|
if stats.Requests != 3 || stats.Tokens != 42 {
|
|
t.Fatalf("unexpected stats: %+v", stats)
|
|
}
|
|
if stats.LastAccessedAt == nil || !stats.LastAccessedAt.Equal(time.Unix(1700000000, 0).UTC()) {
|
|
t.Fatalf("unexpected last access: %+v", stats.LastAccessedAt)
|
|
}
|
|
}
|
|
|
|
func TestStatsService_MasterRealtimeStats(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
mr := miniredis.RunT(t)
|
|
rdb := redis.NewClient(&redis.Options{Addr: mr.Addr()})
|
|
svc := NewStatsService(rdb)
|
|
|
|
mr.Set("master:stats:99:requests", "7")
|
|
mr.Set("master:stats:99:tokens", "100")
|
|
|
|
stats, err := svc.GetMasterRealtimeStats(context.Background(), 99)
|
|
if err != nil {
|
|
t.Fatalf("GetMasterRealtimeStats: %v", err)
|
|
}
|
|
if stats.Requests != 7 || stats.Tokens != 100 {
|
|
t.Fatalf("unexpected stats: %+v", stats)
|
|
}
|
|
}
|
|
|
|
func TestStatsService_MasterRealtimeSnapshot(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
mr := miniredis.RunT(t)
|
|
rdb := redis.NewClient(&redis.Options{Addr: mr.Addr()})
|
|
svc := NewStatsService(rdb)
|
|
|
|
mr.Set("master:stats:12:requests", "9")
|
|
mr.Set("master:stats:12:tokens", "18")
|
|
mr.HSet("master:rate:12", "qps", "3")
|
|
mr.HSet("master:rate:12", "limit", "10")
|
|
mr.HSet("master:rate:12", "blocked", "1")
|
|
mr.HSet("master:rate:12", "updated_at", "1700000100")
|
|
|
|
stats, err := svc.GetMasterRealtimeSnapshot(context.Background(), 12)
|
|
if err != nil {
|
|
t.Fatalf("GetMasterRealtimeSnapshot: %v", err)
|
|
}
|
|
if stats.Requests != 9 || stats.Tokens != 18 {
|
|
t.Fatalf("unexpected totals: %+v", stats)
|
|
}
|
|
if stats.QPS != 3 || stats.QPSLimit != 10 || !stats.RateLimited {
|
|
t.Fatalf("unexpected rate stats: %+v", stats)
|
|
}
|
|
if stats.UpdatedAt == nil || !stats.UpdatedAt.Equal(time.Unix(1700000100, 0).UTC()) {
|
|
t.Fatalf("unexpected updated_at: %+v", stats.UpdatedAt)
|
|
}
|
|
}
|