Grafana告警配置:Loki日志触发,单主机单日仅告警一次且实时通知
实现实时触发且单主机每日仅一次告警的配置方案
要同时满足1分钟内实时触发和单主机每日仅推送一次告警的需求,需结合查询逻辑、告警规则与通知组件配置实现,具体步骤如下:
1. 编写核心查询语句
使用组合条件的查询语句,同时检测实时错误日志和该主机近24小时内的告警触发历史:
count_over_time({syslog_identifier="my_service", level="error"} |= `my_log_entry1` |= `my_log_entry2`[1m]) by (host) > 0 AND count_over_time({syslog_identifier="my_service", level="error"} |= `my_log_entry1` |= `my_log_entry2`[24h] offset 1m) by (host) == 0
逻辑说明:
- 第一个条件
count_over_time(...) [1m] >0:确保最近1分钟内出现目标错误日志,实现实时触发 - 第二个条件
count_over_time(...) [24h] offset 1m ==0:排除“1分钟前到24小时前”已触发过告警的主机,确保每日仅触发一次
2. 配置告警规则(以Loki/Prometheus为例)
将上述查询写入告警规则文件(如alerts.yml),定义告警的基础属性:
groups: - name: my_service_error_alerts rules: - alert: MyServiceCriticalError expr: | count_over_time({syslog_identifier="my_service", level="error"} |= `my_log_entry1` |= `my_log_entry2`[1m]) by (host) > 0 AND count_over_time({syslog_identifier="my_service", level="error"} |= `my_log_entry1` |= `my_log_entry2`[24h] offset 1m) by (host) == 0 for: 1m labels: severity: critical annotations: summary: "主机{{ $labels.host }}出现MyService错误日志" description: "主机{{ $labels.host }}在1分钟内检测到错误日志:my_log_entry1或my_log_entry2,且今日未触发过该告警"
3. 通知组件配置强化去重
为避免时间窗口边界问题导致的重复告警,在Alertmanager配置中设置分组与间隔规则,确保相同主机的告警24小时内仅推送一次:
route: group_by: ['host', 'alertname'] group_wait: 30s group_interval: 24h # 同一分组的告警间隔24小时再推送 repeat_interval: 24h # 同一告警重复推送间隔24小时 receiver: 'your_notification_channel' receivers: - name: 'your_notification_channel' # 配置你的通知方式(邮件、Slack等)
补充说明:
offset 1m用于避免1分钟窗口与24小时窗口重叠,防止刚触发的实时日志被计入历史统计导致告警被屏蔽- 若需按自然日(而非滚动24小时)触发,可结合
day_of_month等时间函数调整查询逻辑,滚动24小时方案更简单通用
内容的提问来源于stack exchange,提问作者LeifSec
相关产品推荐
相关产品推荐

