6.2 KiB
6.2 KiB
应用健康监控
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 状态。