refactor(api): update traffic chart response structure

Change the traffic chart API response from bucket-based to series-based
to better support frontend visualization libraries. The new format
provides a shared X-axis and aligned data arrays for each model series.

- Replace `buckets` with `x` and `series` in response
- Implement data alignment and zero-filling for time slots
- Update Swagger documentation including pending definitions

BREAKING CHANGE: The `GET /admin/logs/stats/traffic-chart` response
schema has changed. `buckets` and `models` fields are removed.
This commit is contained in:
zenfun
2026-01-08 18:40:44 +08:00
parent 341b54b185
commit f400ffde95
10 changed files with 3239 additions and 294 deletions

View File

@@ -176,17 +176,33 @@
"granularity": "hour",
"since": 1735689600,
"until": 1735776000,
"models": ["gpt-4-turbo", "claude-3.5-sonnet", "llama-3-70b", "other"],
"buckets": [
"x": {
"labels": ["2025-01-01T00:00:00Z", "2025-01-01T01:00:00Z"],
"timestamps": [1735689600, 1735693200],
"totals": {
"data": [2050, 1800],
"tokens_in": [82000, 70000],
"tokens_out": [128000, 110000]
}
},
"series": [
{
"time": "2025-01-01T00:00:00Z",
"timestamp": 1735689600,
"breakdown": {
"gpt-4-turbo": { "count": 1200, "tokens_in": 50000, "tokens_out": 80000 },
"claude-3.5-sonnet": { "count": 800, "tokens_in": 30000, "tokens_out": 45000 },
"other": { "count": 50, "tokens_in": 2000, "tokens_out": 3000 }
},
"total": { "count": 2050, "tokens_in": 82000, "tokens_out": 128000 }
"name": "gpt-4-turbo",
"data": [1200, 900],
"tokens_in": [50000, 38000],
"tokens_out": [80000, 62000]
},
{
"name": "claude-3.5-sonnet",
"data": [800, 700],
"tokens_in": [30000, 26000],
"tokens_out": [45000, 40000]
},
{
"name": "other",
"data": [50, 200],
"tokens_in": [2000, 6000],
"tokens_out": [3000, 8000]
}
]
}
@@ -196,11 +212,11 @@
| 图表类型 | 数据映射 |
|----------|----------|
| X 轴 | `buckets[i].time` (格式化为 00:00, 04:00 等) |
| X 轴 | `x.labels` (格式化为 00:00, 04:00 等) |
| Y 轴 | 请求数量 |
| 堆叠系列 | `models` 数组,每个模型一个系列 |
| 系列数据 | `buckets[i].breakdown[model].count` |
| 总量标签 | `buckets[i].total.count` |
| 堆叠系列 | `series` 数组,每个模型一个系列 |
| 系列数据 | `series[i].data` |
| 总量标签 | `x.totals.data` |
**时间范围选择器映射**:
@@ -226,7 +242,7 @@
| 功能点 | 用户操作 | 前端行为 | 后端请求 | 成功反馈 | 异常处理 | 风险/边界 |
|--------|----------|----------|----------|----------|----------|-----------|
| 图表加载 | 页面加载 | 请求默认 24H 图表 | `GET /admin/logs/stats/traffic-chart` | 渲染堆叠柱状图 | 请求失败 → 显示错误提示 | `buckets` 为空 → 显示 No Data |
| 图表加载 | 页面加载 | 请求默认 24H 图表 | `GET /admin/logs/stats/traffic-chart` | 渲染堆叠柱状图 | 请求失败 → 显示错误提示 | `series` 为空或 `x.labels` 为空 → 显示 No Data |
| 时间粒度切换 | 选择分钟级范围 | 自动切换 granularity=minute | `GET /admin/logs/stats/traffic-chart` | 图表更细粒度 | 400 → 回退到 hour 并提示 | minute 范围 ≤ 6h |
| Top 模型限制 | 修改显示数量 | 约束 top_n ≤ 20 | `GET /admin/logs/stats/traffic-chart` | 图表更新 | 400 → 自动回退到 20 | 模型过多时显示 "other" |