已删除Kafka Topic后Prometheus过期告警重复触发问题咨询
问题背景
我们的AlertManager中有如下Kafka告警规则:
- alert: NoMessageForTooLong expr: > changes(kafka_topic_partition_current_offset{ topic!="__consumer_offsets", topic!~"^(strimzi\.cruisecontrol\.partitionmetricsamples|strimzi\.cruisecontrol\.modeltrainingsamples|__strimzi-topic-operator-kstreams-topic-store-changelog|__strimzi_store_topic).*" }[10m]) == 0 for: 10s labels: severity: warning annotations: summary: "No message for 10 minutes" description: "There are no messages in topic {{ $labels.topic}}/partition {{ $labels.partition }} for 10 minutes"
该告警曾针对topic-1触发,在告警活跃时我们删除了这个Topic。目前AlertManager中看不到该告警处于活跃状态,但它仍会每24小时重复发送到Slack频道。我们配置的repeatInterval是12h,这个间隔也不符合预期。
原因分析
你的推测完全正确:当topic-1被删除后,对应的kafka_topic_partition_current_offset指标会从Prometheus中消失,导致Prometheus无法生成恢复信号(resolved event)。AlertManager会将这类告警标记为inactive,但由于没有明确的恢复事件,它不会停止重复发送通知,而是按照内部逻辑继续触发。
至于重复间隔变成24h,大概率是因为告警处于inactive状态时,AlertManager的重复通知逻辑和活跃状态不同,可能和分组等待、间隔的叠加有关,核心还是缺少恢复信号导致的状态异常。
解决办法
1. 修改告警规则(推荐)
在告警规则中添加keep_firing_for参数,让Prometheus在指标消失后,继续维持告警状态一段时间,之后自动发送恢复信号。这样AlertManager就能正常结束告警的通知周期。
修改后的规则示例:
- alert: NoMessageForTooLong expr: > changes(kafka_topic_partition_current_offset{ topic!="__consumer_offsets", topic!~"^(strimzi\.cruisecontrol\.partitionmetricsamples|strimzi\.cruisecontrol\.modeltrainingsamples|__strimzi-topic-operator-kstreams-topic-store-changelog|__strimzi_store_topic).*" }[10m]) == 0 for: 10s keep_firing_for: 15m # 添加这一行 labels: severity: warning annotations: summary: "No message for 10 minutes" description: "There are no messages in topic {{ $labels.topic}}/partition {{ $labels.partition }} for 10 minutes"
keep_firing_for的时长可以根据运维节奏调整,比如15分钟到1小时都合理,确保有足够时间处理删除Topic后的告警收尾。
2. 手动清理现有异常告警
如果不想修改规则,可以直接在AlertManager中手动标记该告警为已解决:
- 打开AlertManager的UI,找到对应的
NoMessageForTooLong告警(过滤topic="topic-1"),点击Resolve按钮。 - 或者通过API批量清理,执行如下命令(替换AlertManager地址和标签信息):
curl -X POST http://<alertmanager-ip>:<port>/api/v2/alerts -d '[ { "labels": { "alertname": "NoMessageForTooLong", "topic": "topic-1", "partition": "<对应分区号>" } } ]' -H "Content-Type: application/json"
3. 关于重复间隔的修正
当告警能正常收到恢复信号后,AlertManager就会按照你配置的repeatInterval:12h来执行,之前的24h异常会自动消失。
内容的提问来源于stack exchange,提问作者Johnathan

