From 03aa0433b2820659f3213e9997bada492fb412cf Mon Sep 17 00:00:00 2001 From: Codex Date: Fri, 12 Jun 2026 14:47:00 +0000 Subject: [PATCH] docs: record resource status sync runbook --- .agents/skills/unidesk-ops/SKILL.md | 12 ++++++++++++ docs/reference/observability.md | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/.agents/skills/unidesk-ops/SKILL.md b/.agents/skills/unidesk-ops/SKILL.md index 8c4f9fb6..26cae03b 100644 --- a/.agents/skills/unidesk-ops/SKILL.md +++ b/.agents/skills/unidesk-ops/SKILL.md @@ -34,6 +34,18 @@ bun scripts/cli.ts server status 低内存时 `swap.warning` 非空,先执行 `server swap ensure`。 +## 节点资源指标同步 + +资源面板显示旧 CPU/内存/磁盘值时,先对照 provider 上报、backend-core 落库和内部 API 三段: + +```bash +docker logs --tail 120 unidesk-provider-gateway-main | rg 'system_status_sent|docker_status_sent|error' +docker logs --tail 200 unidesk-backend-core | rg 'provider_system_status|provider_docker_status|provider_message_failed|serializing parameter' +docker exec unidesk-backend-core sh -lc 'backend-core --fetch-json http://127.0.0.1:8080/api/nodes/system-status?limit=5' +``` + +provider 已发送但 backend-core 没有 `provider_system_status` / `provider_docker_status`,优先查 backend-core ingest/DB 写入错误;provider 自身停发时才用 `server restart provider-gateway` 做无构建维护重启。修复 backend-core 后必须用 `server rebuild backend-core` 上线并验证 `stale=false`、`currentCollectedAt` 为当前采样。长期语义见 `docs/reference/observability.md#node-resource-status`。 + --- ## Swap 管理 diff --git a/docs/reference/observability.md b/docs/reference/observability.md index 12955941..0b60cfd7 100644 --- a/docs/reference/observability.md +++ b/docs/reference/observability.md @@ -48,6 +48,14 @@ backend-core 必须提供 `/api/performance`,返回滚动窗口内的 HTTP 组 frontend Bun server 必须提供同源 `/api/frontend-performance`,记录 webui 静态资源、登录/session、API 代理和 frontend->core 代理操作耗时。浏览器中的 `运行总览 / 性能面板` 必须把 frontend 与 backend-core 指标合并展示为 Bwebui 曲线、组件汇总、最近失败请求、内部操作汇总和最近慢操作;完整性能 JSON 只能通过显式 `查看原始JSON` 打开。 +## Node Resource Status + +节点 CPU、内存、磁盘和进程资源指标的实时真相来自 provider-gateway 上报的 `system_status`,Docker 资源摘要来自 `docker_status`;backend-core 负责落库、历史采样和 `/api/nodes/system-status` 聚合。排查资源面板不同步时,必须同时对照 provider-gateway 日志里的 `system_status_sent` / `docker_status_sent`、backend-core 日志里的 `provider_system_status` / `provider_docker_status`、以及 backend-core 内部 API,而不能只看前端旧值或浏览器缓存。 + +provider 上报的 `collectedAt` 在 backend-core 入库前必须解析为 typed timestamp。Rust backend-core 使用 PostgreSQL 参数时不得把 RFC3339 字符串传给 `$n::timestamptz` 这类 SQL cast;`tokio-postgres` 会按目标 PostgreSQL 类型序列化参数,字符串参数可能在序列化阶段失败,导致 provider 已发送但数据库仍停在旧采样。等价实现应先解析为 `DateTime` 或目标驱动支持的时间类型,再传入 SQL 参数。 + +`/api/nodes/system-status` 必须区分当前指标和最后已知指标。超过 backend stale window 的采样不得继续作为 `current` 冒充实时状态;接口和前端应暴露 `stale`、`currentCollectedAt` 和 `lastKnown`,并在指标过期时显示过期状态。运维验证优先使用 backend-core 内部只读入口:`docker exec unidesk-backend-core sh -lc 'backend-core --fetch-json http://127.0.0.1:8080/api/nodes/system-status?limit=5'`。外部 frontend 同源 API 可能受登录 session 保护,不应把未登录请求的 401 当成资源同步失败。 + ## Low-Memory Diagnostics 主 server 是低资源、低抖动控制面,排查内存时必须先区分共享内存、容器 cgroup 占用和进程私有占用。PostgreSQL 后端进程的 RSS 会重复显示 `shared_buffers` 等共享映射,不能把多个 `postgres` 进程 RSS 简单相加当成真实内存消耗;优先看 `docker stats unidesk-database`、cgroup memory、`/proc//smaps_rollup` 的 PSS/USS、`pg_stat_activity` 连接数和 `pg_settings` 中的 `shared_buffers`/`work_mem`。