如何在发送邮件告警前设置条件评估时长,实现类似Prometheus的for子句效果
实现方案
核心逻辑:通过本地临时文件记录CPU阈值命中的连续次数,配合crontab每分钟执行一次脚本,连续5次(对应5分钟)命中阈值才触发告警,同时新增告警已发送标记避免重复推送。
修改后的完整脚本如下:
#!/bin/bash # 配置项 THRESHOLD=20 # CPU空闲率阈值(低于此值视为使用率过高,和原脚本逻辑一致) DURATION_MIN=5 # 要求连续异常的分钟数 ALERT_FLAG="/tmp/cpu_alert_sent.flag" # 告警已发送标记文件 COUNT_FILE="/tmp/cpu_abnormal_count.tmp" # 连续异常计数文件 # 计算当前CPU空闲率5秒平均值 CPU_IDLE=$(sar 1 5 | grep "Average" | sed 's/^.* //') CPU_IDLE=$( printf "%.0f" "$CPU_IDLE" ) if [ "$CPU_IDLE" -lt "$THRESHOLD" ]; then # 异常状态,计数+1,文件不存在则初始化为1 if [ -f "$COUNT_FILE" ]; then COUNT=$(<"$COUNT_FILE") COUNT=$((COUNT + 1)) else COUNT=1 fi echo "$COUNT" > "$COUNT_FILE" # 达到连续时长要求且未发送过告警则触发邮件 if [ "$COUNT" -ge "$DURATION_MIN" ] && [ ! -f "$ALERT_FLAG" ]; then echo "CPU usage is high!" | sendmail admin@example.com # 生成告警标记,避免持续异常时重复发信 touch "$ALERT_FLAG" fi else # 状态恢复正常,清零计数和告警标记 rm -f "$COUNT_FILE" "$ALERT_FLAG" fi
部署步骤
- 给脚本添加执行权限:
chmod +x /path/to/your/cpu_monitor.sh - 添加定时执行规则:执行
crontab -e后新增如下配置,设置脚本每分钟运行一次* * * * * /path/to/your/cpu_monitor.sh >/dev/null 2>&1
效果说明
完全对齐Prometheus for 子句的逻辑:只有告警条件连续5分钟每分钟检测都满足时才会触发一次告警,异常状态持续期间不会重复发信,CPU恢复正常后再出现异常会重新开始计时评估。
内容的提问来源于stack exchange,提问作者Raghu
相关产品推荐
相关产品推荐

