Some checks failed
CD Pipeline / build-and-deploy (push) Has been cancelled
ADR-073 Phase 2-3: _try_auto_repair_background() 修復執行後寫入 Incident.outcome - effectiveness_score: 5(成功) / 2(失敗) - human_feedback: auto_repair:<playbook_id>:success|failed - should_remember: True(成功) → KMConversionService 飛輪入口 - 讓 KMConversionService 可依 outcome 判斷 EXECUTION_SUCCESS ADR-073 Phase 2-5: scripts/backfill_alertname.py - UPDATE incidents SET alertname = COALESCE(signals->0->>'alertname', signals->0->>'alert_name') - 已在 Pod 執行:134 筆 NULL → 0 筆 (2026-04-12 ogt) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
"""
|
|
ADR-073 Phase 2-5: 回填 incidents.alertname 欄位
|
|
2026-04-12 ogt: 舊資料 signals JSONB 用 alert_name key (非 alertname alias)
|
|
新資料 (Phase 2-1 修復後) 已有 alertname alias
|
|
|
|
執行方式:
|
|
kubectl exec -n awoooi-prod <api-pod> -- python3 scripts/backfill_alertname.py
|
|
"""
|
|
import asyncio
|
|
import sys
|
|
sys.path.insert(0, "/app")
|
|
|
|
from sqlalchemy import text
|
|
|
|
from src.db.base import get_db_context
|
|
|
|
|
|
async def main() -> None:
|
|
async with get_db_context() as db:
|
|
# 先查有多少需要回填
|
|
count_r = await db.execute(
|
|
text("SELECT COUNT(*) FROM incidents WHERE alertname IS NULL")
|
|
)
|
|
total = count_r.scalar()
|
|
print(f"待回填: {total} 筆")
|
|
|
|
# 優先用 signals->0->>'alertname' (Phase 2-1 修復後的新寫法)
|
|
# fallback: signals->0->>'alert_name' (舊寫法)
|
|
result = await db.execute(
|
|
text("""
|
|
UPDATE incidents
|
|
SET alertname = COALESCE(
|
|
signals->0->>'alertname',
|
|
signals->0->>'alert_name'
|
|
)
|
|
WHERE alertname IS NULL
|
|
AND (
|
|
signals->0->>'alertname' IS NOT NULL
|
|
OR signals->0->>'alert_name' IS NOT NULL
|
|
)
|
|
""")
|
|
)
|
|
await db.commit()
|
|
print(f"已回填: {result.rowcount} 筆")
|
|
|
|
# 剩餘無法回填的
|
|
remain_r = await db.execute(
|
|
text("SELECT COUNT(*) FROM incidents WHERE alertname IS NULL")
|
|
)
|
|
remain = remain_r.scalar()
|
|
print(f"仍為 NULL: {remain} 筆 (signals 無 alert_name 欄位,無法回填)")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|