mirror of
https://github.com/lukaszraczylo/traefik-llmgateway.git
synced 2026-10-12 04:54:45 +00:00
feat(admin): add fleet statistics and admin read endpoints
Counters (always on when admin is enabled): - last seen per user and group, written asynchronously after admission, throttled to one write per scope per minute per replica - hourly provider and model attempts, failures and timeouts - failovers per provider, rejections per hour, and unpriced (402) refusals - cache hits, misses and cost saved - request counts per target and caller Opt-in counters under admin.stats (both default off): - userModel: usage per user and model - latency: latency histograms per provider and model All counters ride the existing Redis batches. A test measures three round trips per request with defaults and with every statistic on. A cache hit takes two. A model request is no longer counted for failed failover candidates. New admin endpoints: - usage/series and usage/totals - performance, with percentiles from the histograms - catalog, with the price billing actually uses and its source - consumers, with key source, grants and model access - config, with secrets redacted The overview gains features and a pricing summary. Usage gains lastSeen. usage/models gains offset and more detail fields. Reads are chunked at 1600 keys per round trip and capped at 64000 keys per request. Claude-Session: https://claude.ai/code/session_01V5jYJNxpDFdJkyyExpADrv
This commit is contained in:
@@ -452,6 +452,13 @@ func (g *Gateway) recordUnpricedRefusalEvent(scopes []limitScope, model, provide
|
||||
}
|
||||
applyScopeAttribution(&ev, scopes)
|
||||
g.recordEvent(ev)
|
||||
// r402 (always-on-with-admin, DECISIONS) — the one chokepoint both
|
||||
// routes_unified.go's and routes_passthrough.go's identical 402 guard
|
||||
// already share, so wiring the counter here covers both call sites
|
||||
// without touching either route file again. Fire-and-forget
|
||||
// (recordUnpriced402's own countAsync/l.spawn); no-op when admin
|
||||
// stats are off.
|
||||
g.limiter.recordUnpriced402(model)
|
||||
}
|
||||
|
||||
// recordProxyEvent records an upstream event for a proxyUpstream result
|
||||
|
||||
Reference in New Issue
Block a user