Prometheus指标约5分钟后消失,服务宕机无法触发告警
问题分析与解决方案
问题根源
你的配置存在核心矛盾:
- Oracle-DB的抓取间隔设为
10m,意味着Prometheus每10分钟才会对该Exporter执行一次抓取,生成up指标样本(成功时为1,失败时为0)。 - 告警规则要求
up == 0持续5m才触发告警,但两次抓取的间隔(10m)远大于告警等待时长(5m)。
当Exporter宕机后,第一次抓取失败会生成up=0的样本,但下一次抓取要10分钟后才会执行。在这中间,当距离上次生成up=0样本超过5分钟时,Prometheus会认为该时间序列已“过期”(超出了抓取间隔的有效检测窗口),此时up == 0的表达式将没有匹配结果,导致告警无法触发。
修复方案
方案1:缩短抓取间隔(推荐)
将Oracle-DB的scrape_interval调整为小于告警for时长的值,比如3m,确保Prometheus能在5分钟内多次检测到up=0的状态,满足告警触发条件。修改后的prometheus.yml相关配置:
scrape_configs: - job_name: 'Oracle-DB' scrape_interval: 3m # 改为小于5m的值 scrape_timeout: 1m scheme: http static_configs: - targets: ['localhost:9161'] labels: instance: 'DB'
方案2:延长告警等待时长
如果无法缩短抓取间隔,可将告警规则的for时长调整为略小于抓取间隔,比如9m,但这会导致告警触发延迟变长,仅适用于对响应时效要求不高的场景。修改后的rules.yml相关配置:
groups: - name: General rules: - alert: Running expr: up == 0 for: 9m # 改为小于10m的值 annotations: summary: "Instance {{ $labels.job }} - {{ $labels.instance }} down." description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 9 minutes."
额外说明
- 当前
evaluation_interval: 30s的规则评估频率配置合理,无需修改。 - 需保证
scrape_timeout(当前为1m)始终小于scrape_interval,避免超时判断覆盖下一次抓取窗口。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

