如何在Loki中基于日志触发告警并基于另一日志关闭告警
实现Loki告警的触发与自动清除逻辑
你可以通过组合两个日志计数查询,构造一个仅当"New alarm"出现且"Deleted alarm"未出现时触发的告警规则,具体方案如下:
核心PromQL查询
直接对比两个count_over_time的结果,判断触发条件:
count_over_time({app="alarm-handler"} | json | message="New alarm" [1m]) > 0 AND count_over_time({app="alarm-handler"} | json | message="Deleted alarm" [1m]) == 0
这个表达式的逻辑是:
- 最近1分钟内出现过"New alarm"日志
- 且最近1分钟内没有出现过"Deleted alarm"日志
只要满足这两个条件,告警就会被触发;当"Deleted alarm"日志出现后,第二个条件不满足,告警会自动恢复。
告警规则配置示例
把上面的查询放到你的Prometheus/Loki告警规则文件中(比如alerts.yaml),注意要给告警设置唯一的标识标签(如果日志里有alarm_id这类唯一字段,一定要加到labels里,避免不同告警混淆):
groups: - name: alarm-handler-alerts rules: - alert: ActiveAlarmTriggered expr: | count_over_time({app="alarm-handler"} | json | message="New alarm" [1m]) > 0 AND count_over_time({app="alarm-handler"} | json | message="Deleted alarm" [1m]) == 0 for: 30s # 可选,延迟30秒触发,避免日志抖动 labels: severity: critical # 如果日志里有唯一的alarm_id,这里要加上: # alarm_id: "{{ $labels.alarm_id }}" annotations: summary: "新告警触发" description: "检测到New alarm日志,且未收到对应的Deleted alarm日志"
关键注意事项
- 时间窗口一致性:两个
count_over_time的时间窗口([1m])要保持一致,避免逻辑判断出错 - 日志字段解析:确保
json解析能正确提取message字段,如果日志格式有变动,要调整解析规则 - 唯一标识:如果你的业务里有多条不同的告警,一定要把日志里的唯一标识(比如alarm_id)作为告警标签,这样AlertManager才能准确区分和清除对应的告警,不会出现误关其他告警的情况
内容的提问来源于stack exchange,提问作者jerem0808
相关产品推荐
相关产品推荐

