5.0 KiB
5.0 KiB
应用健康监控设计
1. Architecture and Boundaries
首版由三个独立部分组成:
- 仓库内的 Python 探测器:从 ARM 发起公网 HTTPS
/ready请求,验证传输、状态码和最小 JSON 合同,维护连续失败计数,并生成只含状态/类别/计数的 0600 摘要文件。 - 现有
scripts/send-wecom-group-alert.py:扩展应用健康允许状态,继续负责 webhook 文件校验、脱敏消息、同类故障降噪和恢复通知。 - 独立 ARM systemd 安装器:复制探测器和本次已通过备份回归的共用告警 helper 修订,引用既有 root-owned 0600 webhook,写入 oneshot service/timer;
install默认只安装 disabled units,enable才启用,uninstall只删除应用健康组件并保留共用 helper 与状态证据。
不修改 Fastify /ready,不修改 Compose 拓扑,不引入 Prometheus/Alertmanager,不把应用监控并入备份 receiver 的生命周期。
2. Probe Contract
Input
- 固定要求
httpsURL,拒绝 userinfo、fragment、非预期 query;默认目标为项目公开 OA 的/ready。 - 连接与读取均有短超时,单次 timer 不得长期占用。
- 状态目录、摘要、探测状态和告警状态均由 root 持有,目录 0700、文件 0600,拒绝符号链接和宽权限输入。
Success
- TLS 证书链和主机名校验通过。
- HTTP 2xx。
- 响应是受大小限制的 JSON,且
data.ok === true。 - 不要求固定
buildSha,避免正常发布触发误报;不持久化完整响应。
Failure categories
只输出稳定 token,不输出异常原文:
dns_or_connect_failedtls_validation_failedrequest_timeouthttp_unavailableresponse_too_largeresponse_contract_invalidlocal_state_invalidalert_evaluation_failed
HTTP 503 不解析并转发数据库错误详情,只归类为 http_unavailable。日志和企微消息不得包含地址解析结果、IP、请求/响应 payload、凭证或绝对路径。
3. Failure Confirmation and Alert State
探测器维护独立 probe state:schemaVersion、consecutiveFailures、lastCategory。告警 helper 继续维护自己的 alert state。
状态转换:
healthy ──首次失败──> pending_failure(记录,非零退出,不发消息)
pending_failure ──再次失败──> alerting(调用 helper)
alerting ──相同失败──> helper 降噪
alerting ──类别变化──> helper 发送新类别告警
pending_failure ──成功──> healthy(不发送恢复消息)
alerting ──成功──> healthy(helper 发送一次恢复通知)
连续失败按“任意失败”累计,第二次使用当前类别告警;这样不会因 DNS、连接、HTTP 类别在同一事故中抖动而无限推迟。达到阈值后每次都调用 helper,由 helper 根据状态和类别决定是否发送。状态采用同目录临时文件 + 原子替换。
若真实消息发送失败,helper 不更新 alert state,下一次 timer 会重试。探测 service 保持非零退出,便于 systemctl status/journal 只读检查。
4. Systemd Design
- service:
Type=oneshot、UMask=0077、依赖network-online.target,以 root 运行以读取现有 root-owned webhook;不加载 OA.env。 - timer:每 5 分钟执行,
Persistent=true,开机后补一次错过的执行;不启用随机延迟,以便最长发现时间可预测。 - 安装器校验源文件、目标 URL、状态目录、webhook/helper 权限和依赖;
install与enable分离,避免未经真实告警批准就自动发送。 - timer 位于 ARM,因此可发现 OA 主机整体不可达;ARM 自身宕机仍会导致探测失声,首版通过 runbook 中的定期
systemctl list-timers检查记录该剩余风险,不新增第三方 dead-man。
5. Compatibility and Reuse
send-wecom-group-alert.py仅新增FAIL_APP_HEALTH与PASS_APP_HEALTH_READY允许状态;现有FAIL_*/健康恢复逻辑保持不变。- 现有自动备份契约测试必须继续通过,证明 allowlist 扩展未改变备份消息行为。
- 应用监控使用独立 alert state 文件,不与自动备份或 WARCH3 的降噪状态互相覆盖。
6. Rollout and Rollback
实现阶段只产出脚本、测试和现有运维文档更新。远端 rollout 是后续独立批准动作:
- 在非真实发送测试模式运行健康/失败/恢复状态机。
- ARM 执行安装但不启用,检查 unit 内容、文件权限和手动健康探测。
- 另获批准后启用 timer,并进行一次受控失败演练,确认只出现一条告警和一条恢复通知。
- 只读核对 timer 最近执行与下一次计划时间。
回滚时 disable/stop 并卸载应用健康 units/探测器;不触碰备份 receiver、归档、共用 webhook 和 helper。若 helper 已被其他能力共用,不在应用监控卸载中删除。
7. Deferred Items
- 证书到期前 N 天预警。
- 登录或报销等业务合成事务。
- 5xx 比率、延迟分位数和趋势图。
- ARM timer 自身的第三方 dead-man。