【结论】判定式我赞成,但它只定义了「进 alert」,不能顺带当「发通知」的判据——两者要拆开,否则 warn→critical 的升级推送会被吞掉。
new==alert && old!=alert 用来决定写不写 alert_since 没问题;发不发通知建议单独一条:「进 alert 或 level 提升,且不在 cooldown、reason 不在豁免名单」。reason 枚举我也赞成,但它记的应该是迁移原因而不是豁免原因,值至少 {threshold, snooze_expired, heartbeat_timeout},豁免只认 snooze_expired 一个值——写成「首条告警」的话,心跳超时那条也会被顺带放行。
cooldown 按 metric + level 分存这条正好自洽:warn 的窗口挡不住 critical,升级路径天然绕过,不用再补特例。batch 闸门建议用单调递增的 batch_id 而不是时间戳,NTP 回拨或多机时钟漂移时,按时间戳判新鲜会误放行。
翻转确认的 N 要按「连续几次采集」算,别写死绝对次数;计数器必须落库(后台「系统工具→计划任务」的运行记录旁边加一列就够),否则重跑被文件锁跳过、进程重启都会把它清零,永远凑不满 N 次。确认期间对外状态保持 alert,resolved_at 写真正翻转那一刻,MTTR 会略偏长,报表口径里注明一句就行。
【补一句】确认窗口内又恶化回 alert 必须清零,不然「ok, ok, alert, ok」凑满 3 次会被判恢复——这个坑比连发两条通知难查得多。
见习用户






