feat(api): add admin traffic chart statistics endpoint

Add new endpoint GET /admin/logs/stats/traffic-chart to provide
aggregated traffic metrics grouped by time and model. Features include:
- Time granularity selection (hour/minute)
- Top-N model breakdown with "other" aggregation
- Metrics for request counts and token usage

Includes generated Swagger documentation.
This commit is contained in:
zenfun
2026-01-02 21:24:56 +08:00
parent bae3d9bd5b
commit 9d082ff375
5 changed files with 555 additions and 0 deletions

View File

@@ -1610,6 +1610,73 @@ const docTemplate = `{
}
}
},
"/admin/logs/stats/traffic-chart": {
"get": {
"security": [
{
"AdminAuth": []
}
],
"description": "Get time × model aggregated data for stacked traffic charts. Returns time buckets with per-model breakdown.",
"produces": [
"application/json"
],
"tags": [
"admin"
],
"summary": "Traffic chart data (admin)",
"parameters": [
{
"enum": [
"hour",
"minute"
],
"type": "string",
"description": "Time granularity: hour (default) or minute",
"name": "granularity",
"in": "query"
},
{
"type": "integer",
"description": "Start time (unix seconds), defaults to 24h ago",
"name": "since",
"in": "query"
},
{
"type": "integer",
"description": "End time (unix seconds), defaults to now",
"name": "until",
"in": "query"
},
{
"type": "integer",
"description": "Number of top models to return (1-20), defaults to 5",
"name": "top_n",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/internal_api.TrafficChartResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/gin.H"
}
}
}
}
},
"/admin/logs/webhook": {
"get": {
"security": [
@@ -5840,6 +5907,66 @@ const docTemplate = `{
}
}
},
"internal_api.TrafficBucket": {
"type": "object",
"properties": {
"breakdown": {
"type": "object",
"additionalProperties": {
"$ref": "#/definitions/internal_api.TrafficMetrics"
}
},
"time": {
"type": "string"
},
"timestamp": {
"type": "integer"
},
"total": {
"$ref": "#/definitions/internal_api.TrafficMetrics"
}
}
},
"internal_api.TrafficChartResponse": {
"type": "object",
"properties": {
"buckets": {
"type": "array",
"items": {
"$ref": "#/definitions/internal_api.TrafficBucket"
}
},
"granularity": {
"type": "string"
},
"models": {
"type": "array",
"items": {
"type": "string"
}
},
"since": {
"type": "integer"
},
"until": {
"type": "integer"
}
}
},
"internal_api.TrafficMetrics": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"tokens_in": {
"type": "integer"
},
"tokens_out": {
"type": "integer"
}
}
},
"internal_api.UpdateAccessRequest": {
"type": "object",
"properties": {

View File

@@ -1604,6 +1604,73 @@
}
}
},
"/admin/logs/stats/traffic-chart": {
"get": {
"security": [
{
"AdminAuth": []
}
],
"description": "Get time × model aggregated data for stacked traffic charts. Returns time buckets with per-model breakdown.",
"produces": [
"application/json"
],
"tags": [
"admin"
],
"summary": "Traffic chart data (admin)",
"parameters": [
{
"enum": [
"hour",
"minute"
],
"type": "string",
"description": "Time granularity: hour (default) or minute",
"name": "granularity",
"in": "query"
},
{
"type": "integer",
"description": "Start time (unix seconds), defaults to 24h ago",
"name": "since",
"in": "query"
},
{
"type": "integer",
"description": "End time (unix seconds), defaults to now",
"name": "until",
"in": "query"
},
{
"type": "integer",
"description": "Number of top models to return (1-20), defaults to 5",
"name": "top_n",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/internal_api.TrafficChartResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/gin.H"
}
}
}
}
},
"/admin/logs/webhook": {
"get": {
"security": [
@@ -5834,6 +5901,66 @@
}
}
},
"internal_api.TrafficBucket": {
"type": "object",
"properties": {
"breakdown": {
"type": "object",
"additionalProperties": {
"$ref": "#/definitions/internal_api.TrafficMetrics"
}
},
"time": {
"type": "string"
},
"timestamp": {
"type": "integer"
},
"total": {
"$ref": "#/definitions/internal_api.TrafficMetrics"
}
}
},
"internal_api.TrafficChartResponse": {
"type": "object",
"properties": {
"buckets": {
"type": "array",
"items": {
"$ref": "#/definitions/internal_api.TrafficBucket"
}
},
"granularity": {
"type": "string"
},
"models": {
"type": "array",
"items": {
"type": "string"
}
},
"since": {
"type": "integer"
},
"until": {
"type": "integer"
}
}
},
"internal_api.TrafficMetrics": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"tokens_in": {
"type": "integer"
},
"tokens_out": {
"type": "integer"
}
}
},
"internal_api.UpdateAccessRequest": {
"type": "object",
"properties": {

View File

@@ -1055,6 +1055,45 @@ definitions:
tokens:
type: integer
type: object
internal_api.TrafficBucket:
properties:
breakdown:
additionalProperties:
$ref: '#/definitions/internal_api.TrafficMetrics'
type: object
time:
type: string
timestamp:
type: integer
total:
$ref: '#/definitions/internal_api.TrafficMetrics'
type: object
internal_api.TrafficChartResponse:
properties:
buckets:
items:
$ref: '#/definitions/internal_api.TrafficBucket'
type: array
granularity:
type: string
models:
items:
type: string
type: array
since:
type: integer
until:
type: integer
type: object
internal_api.TrafficMetrics:
properties:
count:
type: integer
tokens_in:
type: integer
tokens_out:
type: integer
type: object
internal_api.UpdateAccessRequest:
properties:
default_namespace:
@@ -2333,6 +2372,50 @@ paths:
summary: Log stats (admin)
tags:
- admin
/admin/logs/stats/traffic-chart:
get:
description: Get time × model aggregated data for stacked traffic charts. Returns
time buckets with per-model breakdown.
parameters:
- description: 'Time granularity: hour (default) or minute'
enum:
- hour
- minute
in: query
name: granularity
type: string
- description: Start time (unix seconds), defaults to 24h ago
in: query
name: since
type: integer
- description: End time (unix seconds), defaults to now
in: query
name: until
type: integer
- description: Number of top models to return (1-20), defaults to 5
in: query
name: top_n
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/internal_api.TrafficChartResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/gin.H'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/gin.H'
security:
- AdminAuth: []
summary: Traffic chart data (admin)
tags:
- admin
/admin/logs/webhook:
get:
description: Returns current webhook notification config