标签:脚本 res smtp 记录 系统邮件 文件的 关注 pts cat
七十二、告警系统邮件引擎、运行告警系统一、告警系统邮件引擎
mail.sh内容 //其中mail.py内容到这里下载https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py
邮件要有一个mail.py,之前用到过:
[root@MRX shares]# cp /usr/lib/zabbix/alertscripts/mail.py ../mail/mail.py
mail.py的内容不需关注,
gserver = 'smtp.163.com' //发邮件的服务器域名
mail.sh内容 路径:/usr/local/sbin/mon/mail/mail.sh
log=$1
t_s=`date +%s`
t_s2=`date -d "2 hours ago" +%s` #这两个t_s是时间戳,时间戳和两小时前的时间戳
if [ ! -f /tmp/$log ] #运行监控脚本时就会生成监控日志,日志名字是ip地址下划线+监控项目
then
echo $t_s2 > /tmp/$log #判断日志是否存在,不存在就记录两小时前的时间戳的日志
fi
t_s2=`tail -1 /tmp/$log|awk '{print $1}'`
echo $t_s>>/tmp/$log
v=$[$t_s-$t_s2] #两个时间戳的比值差,通过上一次告警和这一次告警的时间戳比值来计算, 然后决定是否告警。
echo $v
if [ $v -gt 3600 ] #如果大于3600秒了,就告警。
then
./mail.py $1 $2 $3 #大于3600,直接执行mail.py告警。
echo "0" > /tmp/$log.txt #在前面日志名字的基础上加一个.txt,叫计数器的文件。
else
if [ ! -f /tmp/$log.txt ] #反之,如果小于3600,判断,如果这个计数器文件不存在。
then
echo "0" > /tmp/$log.txt #然后echo 0到计数器文件。
fi
nu=`cat /tmp/$log.txt` #定义新变量,查看计数器里的数字,如果计数器文件不存在,nu就等于0了
nu2=$[$nu+1] #原变量基础上+1。
echo $nu2>/tmp/$log.txt
if [ $nu2 -gt 10 ] #当变量大于10以后,才告警。就是告警到第10分钟了,这个变量+1=11,就开始告警了,发完邮件,文件又清空了,又从头再来。持续十分钟,十分钟后继续发邮件。
then
./mail.py $1 "trouble continue 10 min $2" "$3"
echo "0" > /tmp/$log.txt #告警完后,重新计数,又变为0
fi
fi
场景:监控502,告警了两分钟,第三分钟好了,业务恢复时间持续了一个小时(3600s),超过一个小时以后又发现了异常,这时候就会直接发一封邮件,因为大于3600了,然后清空计数器。10分钟以内连续发告警,然后就去收敛,哪怕10分钟以内不连续告警,每隔一两分钟都需要去收敛。
核心:周期,十分钟。
3600秒为一个周期;计数器,10分钟计数,连续十分钟,就告警,十分钟以内,就不告警。
mail.sh的目的是为了做告警收敛
归纳:
场景一:没有超过一小时,不告警。
场景二:超过一小时,告警。
场景三:连续告警十分钟,就发邮件,要么就是不到十分钟正常了一小时又不正常了,就直接告警发邮件。
二、运行告警系统
总结:
执行告警系统:每分钟一次
# crontab -e
* * * * * cd /usr/local/sbin/mon/bin; bash main.sh
加入这一条,不然没有办法正常的执行成功。
# sh -x main.sh 可以执行这条看过程。
502的脚本如果不能执行的话,可以不监控,在mon.conf里面讲502开关关闭:to_mon_502=1,改为0。
在调试时,将main.sh中的这一步先注释掉:
exec 1>>../log/mon.log 2>>../log/err.log
先不将日志写进去。
mail.py发送文件的内容:
/bin/bash ../mail/mail.sh aaa@163.com "$addr\_load:$load" `cat ../log/load.tmp`
把文件的内容作为第三个参数。
标签:脚本 res smtp 记录 系统邮件 文件的 关注 pts cat
原文地址:http://blog.51cto.com/13576245/2152872