文件
hyb-oa/.trellis/tasks/archive/2026-07/07-27-app-health-monitoring/prd.md
T

6.2 KiB
原始文件 Blame 文件历史

应用健康监控

Goal

为内部 OA 建立低维护、可降噪、可恢复通知的持续健康探测,使应用不可用、数据库不可达或公网 HTTPS 链路异常能够在无人访问时被及时发现,而不引入 Prometheus 等不符合 5–10 人团队维护成本的基础设施。

Scope

  • 在现有 ARM 异机侧每 5 分钟从公网探测 OA /ready。
  • 新增独立探测脚本、独立 systemd 安装器和无需真实企微的契约测试。
  • 小范围扩展现有企微群机器人 helper,使其支持应用健康故障、降噪与恢复状态。
  • 更新现有试运行手册、部署 runbook/checklist;代码实现完成后,远端安装、启用和真实告警演练仍需单独批准。

Background and Confirmed Facts

  • server/src/app.js 已提供 /health、/ready 和按配置启用的 /metrics;/ready 会查询数据库,失败时返回 503,成功响应包含脱敏的构建标识。
  • deploy/trialrun/docker-compose.yml 已有数据库与应用容器 healthcheck,但容器 healthcheck 本身不会向管理员发送通知。
  • deploy/prometheus/alerts-slo.yml 已定义可用性、延迟和 5xx 告警规则,但当前试运行 Compose 未部署 Prometheus/Alertmanager,因此规则没有持续执行者。
  • 现有部署、live smoke、WARCH3/WAUTO1 等脚本会调用公网 /ready,但它们是发布验证或每日业务/归档巡检,不是高频、独立的应用可用性看门狗。
  • scripts/send-wecom-group-alert.py 已实现 webhook 文件权限校验、脱敏状态消息、相同故障降噪和故障恢复通知;当前允许的状态类别仅覆盖备份/异机 dead-man,需要为应用健康状态显式扩展或抽取兼容合同。
  • deploy/trialrun/install-warch3-ops-timer.sh 和 deploy/trialrun/install-automatic-backup-timer.sh 提供了 systemd oneshot/timer、安装/卸载、路径校验和运行账户边界的可复用模式。
  • OA 主机上的 timer 无法在整机宕机、主机断网或 timer 自身停止时发出告警;异机 ARM 探测可覆盖这些故障,但属于外部运行配置,实际安装与启用需要另行明确批准。

Requirements

  • R1:以公网 HTTPS /ready 为主要可用性信号,校验 HTTP 状态与响应中的 data.ok=true,不得记录完整响应或敏感 payload。
  • R2:探测失败时生成有限、稳定、脱敏的故障类别,至少区分连接/TLS/HTTP/响应契约异常;不得把域名解析结果、地址、凭证、绝对路径或原始日志发送到群内。
  • R3:相同故障连续发生时只发送一次告警;故障类别变化时允许重新告警;恢复后发送一次恢复通知。
  • R4:使用 systemd oneshot + timer 运行,提供安全的安装、启用、状态检查和卸载路径;探测进程不得写 OA 数据库或企业微信业务数据。
  • R5:告警复用现有企微群机器人安全入口及 0600 webhook 文件合同,不新增新的消息供应商或时序数据库。
  • R6:提供无需真实 webhook 的契约测试,覆盖健康、连续相同故障降噪、故障变化、恢复通知、异常状态文件和隐私输出。
  • R7:实际公网安装、systemd 变更、真实企微消息发送和远端配置不属于规划批准;执行前必须再次取得明确批准。
  • R8:首版探测固定运行在现有 ARM 异机侧,每 5 分钟执行一次;连续两次失败才发送故障告警,一次成功即恢复并在此前确有已发送故障时发送一次恢复通知。

Acceptance Criteria

  • AC1:定时探测可对健康公网 /ready 返回成功,并保留不含敏感信息的本地状态。
  • AC2:连接失败、TLS 校验失败、非 2xx/503、非法 JSON 或 data.ok!=true 均进入稳定的脱敏失败类别并使 oneshot 非零退出。
  • AC3:同一失败重复执行不会重复发送;失败类别变化会发送新告警;恢复后只发送一次恢复通知。
  • AC4:ARM timer 每 5 分钟执行,单次探测有明确连接/总超时;持续故障在约 10 分钟内告警;安装后可用只读命令核对 enabled/active 及最近执行结果。
  • AC5:测试模式不访问真实企微,自动验证覆盖告警与恢复状态机、输入文件权限和消息脱敏。
  • AC6:现有备份告警、WARCH3 巡检、部署脚本和 /ready 合同不被破坏。
  • AC7:规划阶段不修改生产配置;若后续获批部署,公网独立探测和真实告警演练通过后才宣告监控可用。

本地实现已完成;AC4 保持未勾选并标记为 EXTERNAL_GATED,因为本任务未获 ARM 写入、timer 启用、真实企微消息或故障演练批准。仓库契约通过不代表监控已在运行。

Out of Scope

  • 部署 Prometheus、Alertmanager、Grafana 或通用可观测性平台。
  • 业务登录、审批、报销等合成事务监控;首版只判断基础可用性。
  • 自动重启、自动回滚、数据库修复或流量切换。
  • TLS 证书提前到期提醒;首版通过标准 HTTPS 校验发现已经无效或不受信任的证书,提前到期预警留给后续独立评估。
  • 收集或长期存储访问日志、响应 payload、主机地址及其他敏感运行数据。
  • 本任务不处理组织架构、真实账号导入、发票图片附件或 OCR。

Key Decisions

  • 探测运行在现有 ARM 异机侧,而非 OA 主机,以覆盖 OA 整机、主机网络和本机 timer 同时失效。
  • 每 5 分钟探测,连续两次失败确认持续故障;恢复只需一次成功。
  • 首版复用现有企微群机器人告警入口,不部署 Prometheus,也不执行自动恢复。
  • 应用健康安装器独立于备份 receiver 安装器,避免卸载或升级一个能力时意外影响另一个能力。

Test Plan

  • 静态检查 Python 与 shell 语法。
  • 运行新增应用健康契约测试,覆盖健康、首次失败、持续失败、类别变化、重复降噪、恢复、异常状态和隐私边界。
  • 复跑自动备份契约,证明共用企微 helper 行为未回归。
  • 运行部署 env contract、流程基线、文档审计、Trellis 治理、task validate 与 git diff --check。
  • 远端阶段另获批准后,先安装 disabled units,再手工健康探测,最后执行一次受控失败/恢复演练并核对 timer 状态。