You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已删除Kafka Topic后Prometheus过期告警重复触发问题咨询

Kafka告警重复发送问题的分析与解决

问题背景

我们的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:33:18