D2执行前最后修正(最终确认版)
日期: 2026-09-14
状态: 等待用户最终确认
关键发现:Dead-Man测试机制确认
heartbeat_watchdog.py不检查alert_channel_health ✅
# heartbeat_watchdog.py关键代码
TASKS_FILE = "heartbeat_watchdog_tasks.json" # 自定义任务列表
STATE_FILE = "heartbeat_watchdog_state.json"
# 它检查的是TASKS_FILE中定义的任务
# 不是channel_health表
# 不监控alert_channel_health本身
Dead-Man测试的实际逻辑
alert_channel_health.py:
- 每15分钟检查5个任务的心跳
- 写入channel_health表(自己的心跳)
- 检查超时/死人的任务并写入alerts表
heartbeat_watchdog.py:
- 每小时运行一次
- 检查TASKS_FILE中定义的任务
- 不检查alert_channel_health的心跳
结论:
- 暂停alert_channel_health → channel_health停止更新
- 但heartbeat_watchdog不会检测这个
- 需要验证alert_channel_health自己是否检查"死机"
任务1:修正Dead-Man测试方案 ⚠️
问题
原方案假设:
暂停alert_channel_health → heartbeat_watchdog检测到心跳停止 → 触发告警
实际情况:
heartbeat_watchdog不监控alert_channel_health
暂停alert_channel_health不会触发heartbeat_watchdog告警
修正方案
方案A:直接修改alert_channel_health的心跳记录
步骤:
1. 手动将channel_health表中alert_channel_health的last_check_time设为2小时前
2. 等待下一次alert_channel_health运行(每15分钟)
3. 验证是否触发Dead-Man告警(检查alerts表)
优点: 无需暂停cron,安全可控
缺点: 需要直接操作数据库
方案B:验证alert_channel_health的自检测能力
步骤:
1. 检查alert_channel_health.py是否有"检查自己心跳"的逻辑
2. 如果有,暂停cron 30分钟即可触发
3. 如果没有,使用方案A
建议: 先读取alert_channel_health.py确认
任务2:修正Dead-Man触发时间 ✅
当前时间线
17:25 准备测试(打印时间戳)
17:26 决定方案(A或B)
17:27 执行方案
↓
[等待15-30分钟]
↓
17:45 验证告警结果
17:50 恢复状态(清理测试数据)
18:00 测试完成
任务3:21:00任务冲突确认 ⚠️
共振桥接器和选股台账
21:00运行的任务:
- 共振桥接器每日流水线 (725902f0)
- 选股台账静默检查 (6b235078)
风险:
- 如果它们读写alert_state.db的channel_health表,可能干扰测试
- 如果它们只读不写,则无冲突
建议:
- 受控测试推迟到21:45后(避开21:00任务)
- 或先确认这两个脚本的行为
任务4:D2最终时间表(修正版)
| 时段 | 任务 | 内容 |
|---|---|---|
| 17:25-18:00 | Dead-Man测试 | 方案确认→执行→验证→恢复 |
| 21:45-22:30 | 受控测试前3项 | 告警路径、超时路径、通道健康 |
| 22:30-23:00 | 影子cron集成 | B3临时替换 |
| 23:00-23:30 | 回归验证 | 清理+确认 |
待确认问题
□ 1. Dead-Man测试用方案A(改DB)还是方案B(确认自检测能力)?
□ 2. 共振桥接器和选股台账是否读写alert_state.db?
□ 3. 受控测试是否推迟到21:45后?
⏳ 等待用户确认...
请确认以上修正,回复"进入D2"启动明天执行。