七12、告警系统邮件引擎、运行告警系统linux
1、告警系统邮件引擎git
mail.sh内容 //其中mail.py内容到这里下载https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.pybash
邮件要有一个mail.py,以前用到过:服务器
[root@MRX shares]# cp /usr/lib/zabbix/alertscripts/mail.py ../mail/mail.pyide
mail.py的内容不需关注,spa
gserver = 'smtp.163.com' //发邮件的服务器域名.net
mail.sh内容 路径:/usr/local/sbin/mon/mail/mail.sh调试
log=$1 日志
t_s=`date +%s`server
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的目的是为了作告警收敛
概括:
场景一:没有超过一小时,不告警。
场景二:超过一小时,告警。
场景三:连续告警十分钟,就发邮件,要么就是不到十分钟正常了一小时又不正常了,就直接告警发邮件。
2、运行告警系统
总结:
执行告警系统:每分钟一次
# 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`
把文件的内容做为第三个参数。