从Prometheus迁移至vmalert/VictoriaMetrics时指标缺失查询适配问题
解决vmalert中指标缺失告警无法定位站点的问题
问题背景
原有Prometheus环境中,通过以下告警规则检测site_result_time指标缺失:
- alert: no_data_metric_alert expr: rate(site_result_time[3m]) == 0 for: 5m labels: site_id: '{{$labels.site_id}}_no_data_metric' alertType: No Data Alert
Prometheus会返回序列的最后已知数据,因此rate查询能正常执行并触发告警。但迁移到vmalert+VictoriaMetrics后,由于vmalert采用即时查询逻辑,指标无新数据时rate查询无返回结果,且absent/absent_over_time等函数无法保留site_id标签,无法定位具体无数据的站点。
可行解决方案
方案1:通过记录规则留存活跃序列,对比检测缺失
- 创建记录规则,标记活跃站点
定期生成带有site_id标签的序列,标记过去1分钟内有数据的站点:
- record: site_result_time:active expr: count_over_time(site_result_time[1m]) > 0 labels: type: active_series
- 生成预期站点序列
基于历史数据留存所有曾出现过的站点标签,避免遗漏长时间无数据的站点:
- record: site_result_time:expected expr: last_over_time(site_result_time:active[24h])
可根据业务调整窗口时长(如7天),确保覆盖所有新增站点的周期。
- 编写告警规则,对比活跃与预期序列
找出预期存在但当前无活跃数据的站点,同时保留site_id标签:
- alert: no_data_metric_alert expr: absent(site_result_time:active) unless absent(site_result_time:expected) for: 5m labels: site_id: '{{$labels.site_id}}_no_data_metric' alertType: No Data Alert
方案2:利用VictoriaMetrics专属函数模拟Prometheus行为
VictoriaMetrics提供keep_last_value函数,可强制返回序列的最后已知值,复刻Prometheus的旧逻辑:
- alert: no_data_metric_alert expr: rate(keep_last_value(site_result_time)[3m]) == 0 for: 5m labels: site_id: '{{$labels.site_id}}_no_data_metric' alertType: No Data Alert
该方案适用于已有过数据的站点,若站点从未产生过数据则无法检测。
方案3:直接通过数据量判断缺失
用count_over_time统计窗口内的数据点数量,结合unless排除从未出现的站点:
- alert: no_data_metric_alert expr: count_over_time(site_result_time[5m]) == 0 unless absent(site_result_time) for: 0m labels: site_id: '{{$labels.site_id}}_no_data_metric' alertType: No Data Alert
注意:若站点长时间无数据,VictoriaMetrics可能清理该序列,此时需结合方案1的记录规则留存标签。
注意事项
- 若站点动态新增,需调整预期序列的时间窗口,确保覆盖新增站点的出现周期。
- 需关注VictoriaMetrics的序列清理配置,避免因数据过期导致标签丢失,影响告警准确性。
内容的提问来源于stack exchange,提问作者j1t3ndr6
相关产品推荐
相关产品推荐

