fix(flywheel): 自動修復後移除 Telegram 按鈕 + 心跳告警排除飛輪
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 6m56s

問題: 自動修復成功後 Telegram 卡片仍顯示批准/拒絕/靜默按鈕

Fix 1 — Telegram 卡片回饋閉環 (積木化合規):
- telegram_gateway.send_approval_card: 發送後自動存 tg_approval:{id} 到 Redis
- telegram_gateway.mark_auto_repaired(): 新方法 — 移除按鈕 + reply 結果
- _try_auto_repair_background: 改呼叫 gateway.mark_auto_repaired() (Service 層)

Fix 2 — 心跳/看門狗告警排除飛輪:
- constants.py: is_heartbeat_alertname() + HEARTBEAT_ALERT_NAMES
- NoAlertsReceived2Hours 等不觸發 _try_auto_repair_background

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-04-10 11:52:04 +08:00
parent a42e9f6c8f
commit 7768924fea
3 changed files with 109 additions and 15 deletions

View File

@@ -85,6 +85,34 @@ CICD_ALERT_SUFFIXES = (
# CI/CD 告警關鍵字 (不區分大小寫)
CICD_ALERT_KEYWORDS = ("CI/CD", "cicd")
# =============================================================================
# Heartbeat/Watchdog Alert Detection (2026-04-10 Claude Sonnet 4.6 Asia/Taipei)
# 心跳/看門狗告警不觸發自動修復飛輪 — 這類告警代表監控系統狀態,不是服務故障
# =============================================================================
HEARTBEAT_ALERT_NAMES = frozenset({
"Watchdog",
"DeadMansSwitch",
"NoAlertsReceived",
"NoAlertsReceived2Hours",
"AlertmanagerDown",
"PrometheusNotConnectedToAlertmanager",
})
HEARTBEAT_ALERT_KEYWORDS = ("NoAlertsReceived", "Watchdog", "DeadMansSwitch", "Heartbeat")
def is_heartbeat_alertname(alertname: str) -> bool:
"""
判斷 alertname 是否為心跳/看門狗告警
心跳告警代表監控系統自身健康狀態,不是服務故障,
不應進入自動修復飛輪(不存在對應的 Playbook 修復動作)。
"""
return (
alertname in HEARTBEAT_ALERT_NAMES
or any(kw in alertname for kw in HEARTBEAT_ALERT_KEYWORDS)
)
def is_cicd_alertname(alertname: str) -> bool:
"""