
chenchenandClaude Opus 4.8
e7239c24b6
feat(telemetry): 管理员遥测后台只读视图(列表 + 聚合)
客户端错误遥测(#24)此前只有 ingest + 留存清理,无后台查看。新增管理员只读视图
(列表 + 聚合两者),admin-gated —— device_id 可关联账号,仅管理员可读。
后端:
- model.ListTelemetryEvents(filter, startIdx, pageSize):分页列表(received_at desc),
按 user_id/client_id/platform/app_version/error_category/error_code + 时间范围过滤。
- model.AggregateTelemetryEvents(filter, dimension, limit):按白名单维度 group by 计数 +
COUNT(DISTINCT user_id),busiest first。维度白名单是 SQL 注入防线(列名只能来自 map)。
跨库安全(仅 COUNT/COUNT(DISTINCT)/GROUP BY 固定列,无 DB 特有日期函数)。
- 查询走 LOG_DB(与 ingest 同库);遥测仍隔离于计费、载荷无用户内容。
- controller AdminListTelemetryEvents / AdminAggregateTelemetryEvents;路由
GET /api/telemetry/{events,aggregate},middleware.AdminAuth() 守门。
前端(web/default):
- features/telemetry:api + types + 页面(过滤条 + 聚合面板含维度切换/条形/去重用户数 +
分页列表表)。
- 路由 /_authenticated/telemetry(ROLE.ADMIN 守门),系统设置工作区侧栏加「Client Telemetry」入口。
- routeTree.gen.ts 由 router-generator 重新生成(仅 +22 行 telemetry 路由,无重排)。
测试:model/telemetry_query_test.go 覆盖列表过滤/分页/最新在前、聚合计数 + 去重用户、
维度白名单拒绝(注入防线)。go build ./... + model/controller/router 全绿;前端 tsc 仅
resources-page 一处既有报错(与本改动无关)。
影响面:Manager ✅(新增 admin 只读端点 + 前端页面)/ 计费 ❌(遥测隔离)/ 密钥 ❌ /
审计 ❌ / Client ❌ / agent_swarm ❌ / 发布链路 ❌。隐私:沿用 #24 口径,载荷无用户内容,
device_id 账号可关联故管理员才可读。
Refs #24。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 19:13:38 +08:00
..
2026-06-04 00:05:08 +08:00
2026-06-11 19:13:38 +08:00
2026-06-01 23:45:10 +08:00
2026-06-01 23:45:10 +08:00
2026-06-08 17:17:40 +08:00
2026-06-10 18:01:32 +08:00
2026-06-08 17:49:35 +08:00
2026-06-08 17:49:35 +08:00
2026-06-10 15:37:28 +08:00
2026-06-10 15:28:07 +08:00
2026-06-10 15:28:07 +08:00
2026-06-01 23:45:10 +08:00
2026-06-01 23:45:10 +08:00
2026-06-02 17:45:00 +08:00
2026-06-10 21:43:00 +08:00
2026-06-10 21:43:00 +08:00
2026-06-01 23:45:10 +08:00
2026-06-04 15:30:33 +08:00
2026-06-10 16:27:34 +08:00
2026-06-05 11:06:49 +08:00
2026-06-05 11:06:49 +08:00
2026-06-10 00:33:47 +08:00
2026-06-10 20:38:17 +08:00
2026-06-10 20:38:17 +08:00
2026-05-25 17:41:43 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-06-10 20:38:17 +08:00
2026-06-10 14:29:57 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-22 14:24:20 +08:00
2026-06-04 16:15:47 +08:00
2026-05-20 14:07:30 +08:00
2026-06-10 14:29:57 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-06-01 23:45:10 +08:00
2026-05-20 14:07:30 +08:00
2026-06-09 15:51:21 +08:00
2026-06-09 15:51:21 +08:00
2026-06-01 23:45:10 +08:00
2026-06-09 22:16:29 +08:00
2026-06-10 00:40:23 +08:00
2026-05-20 14:07:30 +08:00
2026-06-08 17:34:03 +08:00
2026-06-08 17:34:03 +08:00
2026-06-10 00:40:23 +08:00
2026-06-10 00:40:23 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-06-01 23:45:10 +08:00
2026-06-09 00:55:09 +08:00
2026-06-10 00:33:47 +08:00
2026-06-10 00:33:47 +08:00
2026-06-08 15:26:47 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 16:43:36 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-06-09 14:28:19 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-06-10 00:40:23 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-06-09 00:55:09 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00