七十二、告警系统邮件引擎、运行告警系统

七十二、告警系统邮件引擎、运行告警系统

一、告警系统邮件引擎

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 [email protected] "$addr\_load:$load" `cat ../log/load.tmp`

把文件的内容作为第三个参数。


猜你喜欢

转载自blog.51cto.com/13576245/2152872