1. 页面概览
运维状态页(路由 /ops,OpsHealthPage.vue)是平台级健康观测页:页面加载后立即检测一次,之后每 10 秒轮询五大产品(AIP/Foundry/Apollo/Gotham/Swift)的 /health 探针,以「服务健康卡」实时展示各服务存活状态;同时提供「授权信息」(AIP /license/info,仅首次加载 + 手动刷新)、「产品信息」与「运维参考信息」三张只读卡片。
一句话总结:五服务健康轮询 + 授权信息 + 运维参考的纯前端观测页,后端零改动。
2. 访问入口
- 路由与菜单:路由
/ops(nameOpsHealth),顶部导航栏「运维状态」入口(App.vue);源码action/web/src/views/OpsHealthPage.vue(362 行)。 - 认证与权限:路由
meta.requiresAuth = true,需先登录 AIP(aip_token);授权信息经 aipClient 自动附带 Bearer token。 - 端口与 API 前缀:健康探针按产品前缀同源访问(
/aip-api→18080、/api→18081、/apollo-api→18082、/gotham-api→18083、/swift-api→18084);授权信息/aip-api/v1/license/info。
3. 界面布局
┌──────────────────────────────────────────────┐ │ ① 页头:运维健康状态 + [立即检测/检测中...] │ │ ② 操作结果提示条(alert,可关闭) │ │ ③ 服务健康卡网格(2 列,5 张卡) │ │ AIP/Foundry/Apollo/Gotham/Swift │ │ ④ 授权信息卡:[刷新] │ │ ⑤ 产品信息卡(只读静态) │ │ ⑥ 运维参考信息卡(进程表 + 日志 + 降级说明) │ └──────────────────────────────────────────────┘
各板块职责:
- ① 页头:标题 + 「立即检测」按钮(检测中置灰显示「检测中...」)。
- ③ 服务健康卡:每卡显示服务名、状态徽标(检测中/正常/部分依赖异常/异常)、端口、service 标识、最近检查时间;异常时附「失败原因」。AIP 卡额外渲染依赖级明细列表(数据库 / 向量库 / LLM 网关 / 磁盘空间:状态 + 耗时 + 错误信息);服务网格下方有常驻说明「依赖级明细仅 AIP 提供;其余四产品健康端点只回二元存活(后端契约差异)」,其余四产品卡不渲染空明细区。
- ④ 授权信息卡:授权状态(已授权/未授权)、有效期、机器码、AUTH_KEY(已设置/未设置)、说明;「刷新」按钮手动重拉。
- ⑤ 产品信息卡:产品名称/中文名称/开发公司/版本日期/官网/微信(静态)。
- ⑥ 运维参考信息卡:六进程表 + 日志位置 + 数据库降级说明 + gateway 探针说明。
4. 交互元素
| 控件 | 位置 | 含义与作用 |
|---|---|---|
| 「立即检测」 | 页头 | 手动触发全量健康检查(checkAll);检测中显示「检测中...」并禁用 |
| 服务健康卡 ×5 | 服务网格 | 只读展示;每 10s 自动轮询一次,单卡失败不影响其他卡 |
| 依赖级明细列表 | AIP 卡内(仅 AIP 有 checks 时) | 只读:每项显示中文名、状态(正常/异常)、latency_ms(有则显示如「12ms」)、message(有则红色);未知检查项名用原名兜底 |
| 「刷新」 | 授权信息卡 | 重新请求 /license/info;加载中显示「刷新中...」并禁用 |
| 「关闭」 | 结果提示条 | 清除当前 alert 消息 |
5. 后端关联
5.1 API 端点
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | /aip-api/health | AIP(18080)健康探针(富响应:{status, checks, timestamp},checks 含 database/vector/llm_gateway/disk_space 依赖级明细) |
| GET | /api/health | Foundry(18081)健康探针 |
| GET | /apollo-api/health | Apollo(18082)健康探针 |
| GET | /gotham-api/health | Gotham(18083)健康探针 |
| GET | /swift-api/health | Swift(18084)健康探针 |
| GET | /aip-api/v1/license/info | AIP 授权信息(aipClient) |
5.2 关键机制
- 轮询与并发:
onMounted立即checkAll()一次,之后setInterval(checkAll, 10000)每 10 秒轮询(onBeforeUnmount清理定时器);各服务用Promise.allSettled并发检测,单个失败不影响其他卡。 - 3 秒超时:每个探针请求用 axios 原生
{ timeout: 3000 }(真正中断在途连接,替代此前无法取消底层连接的Promise.race包装),超时视为异常。 - 健康判定:响应
data.status === 'ok'判「正常」;degraded判独立琥珀态「部分依赖异常」;unhealthy/其他状态判「异常」并附status=...或「响应异常」;后端健康响应带service字段时覆盖卡的 service 标识。 - 依赖级明细:AIP 富响应
checks({<name>: {status, latency_ms, message}},products/aip/health/health.go:27-39)逐项渲染为中文名 + 状态 + 耗时 + 错误信息;degraded时可直接看出挂掉的依赖项。其余四产品只回{status:"ok", service},无checks字段,故不渲染明细区(界面常驻说明该契约差异)。 - 授权信息:仅首次加载 + 手动刷新(不参与 10s 轮询);失败时展示「AIP 未启动或未登录」等提示。
- 后端健康端点(AIP server.go):
GET /health(全依赖)、/health/live(存活)、/health/ready(就绪)、/api/health别名;响应{status, checks, timestamp}。
6. 权限与安全
- 进入页面需 AIP 登录(路由 requiresAuth);健康探针走网关前缀同源访问,无需额外鉴权。
- 授权信息经 aipClient 附带 Bearer
aip_token;401 时自动清理登录态并跳转/login。 - 页面只读,无写操作;进程启停与日志查看需命令行(平台不提供 API)。
7. 常见问题与排错
- 某服务卡长期「异常」:该产品后端未启动。启动对应进程(aip/foundry/apollo/gotham/swift)后点「立即检测」;确认端口未被占用。
- 授权信息显示「未授权」:未配置 AUTH_KEY 或授权过期。前往「设置」页保存 AUTH_KEY 并「刷新有效期」;仍失败请联系厂商(官网 zyinfo.pro)。
- 授权信息提示「AIP 未启动或未登录」:AIP 后端(18080)未启动或 token 过期。启动 AIP、重新登录后再「刷新」。
- 卡片一直「检测中」:单请求 3 秒超时后仍失败,多为网络/代理不可达。检查 DevTools Network 中
/xxx-api/health是否 502/超时。
8. 已知缺陷与边界
| 项 | 说明 |
|---|---|
| 依赖级探测仅 AIP | AIP 提供依赖级明细(database/vector/llm_gateway/disk_space,health/health.go:35-39),其余四产品健康端点只回二元存活 {status:"ok", service}(后端契约差异,界面已常驻如实标注) |
| 授权不轮询 | 授权信息仅首次 + 手动刷新,非实时 |
| gateway 无探针 | gateway 为 Web 网关(非平台 Go 服务),平台确无对应探针端点(后端缺口,非前端遗漏);「运维参考信息」表已常驻说明「本页能加载即说明该网关已在工作」 |
| degraded 独立琥珀态 | degraded(部分依赖挂)显示为琥珀色「部分依赖异常」并列出挂掉的依赖项,不再一律判「异常」 |
| 进程操作需命令行 | 平台不提供进程启停/日志 API,见「运维参考信息」说明 |