20.23 告警系统邮件引擎(上)

 

[root@hyc-01-01 mail]# cp hyc.py /usr/local/sbin/mon/mail

[root@hyc-01-01 mail]# vim mail.py

 

#!/usr/bin/env python

#-*- coding: UTF-8 -*-

import os,sys

reload(sys)

sys.setdefaultencoding('utf8')

import getopt

import smtplib

from email.MIMEText import MIMEText

from email.MIMEMultipart import MIMEMultipart

from  subprocess import *

 

def send163mail(username,password,mailfrom,mailto,subject,content):

    gserver = 'smtp.163.com' 发邮件服务器的域名

    gport = 25

 

    try:

        msg = MIMEText(content,'plan','utf-8')

        msg['Reply-To'] = mailfrom

        msg['Subject'] = subject

 

        smtp = smtplib.SMTP(gserver, gport)

        smtp.set_debuglevel(0)

        smtp.ehlo()

        smtp.login(username,password)

 

        smtp.sendmail(mailfrom, mailto, msg.as_string())

        smtp.close()

    except Exception,err:

        print "Send mail failed. Error: %s" % err

 

 

def main():

    to=sys.argv[1]

    subject=sys.argv[2]

    content=sys.argv[3]

##定义QQ邮箱的账号和密码,你需要修改成你自己的账号和密码(请不要把真实的用户名和密码放到网上公开,否则你会死的很惨)

    send163mail('j180_364_1160@163.com','hYc7085620011','j180_364_1160@163.com',to,subject,content)

163发邮件的用户名、密码、收件人

 

if __name__ == "__main__":

main()

 

用于告警收敛:

[root@hyc-01-01 bin]# vim mail.sh

log=$1

每次发邮件都要找到一个与监控项对应的日志,这样才能区分出特定的监控项,该log最终的值会在maill中作为前缀

t_s=`date +%s`

用户定义的时间戳

t_s2=`date -d "2 hours ago" +%s`

2个小时前的时间戳,第一次执行脚本时必须报警,要保证两个时间戳的差值足够大可以满足报警条件

if [ ! -f /tmp/$log ]

then

echo $t_s2 > /tmp/$log

若日志文件不存在,则创建日志并在日志第一行写入2小时前的时间戳

fi

t_s2=`tail -1 /tmp/$log|awk '{print $1}'`

该步将文件中最后一行的内容作为t_s2的值(2小时前的时间戳)

echo $t_s>>/tmp/$log

将当前时间的时间戳追加到/tmp/$log

v=$[$t_s-$t_s2]

比较两次的时间戳

echo $v

打印出上次告警和本次告警时间戳的差值

if [ $v -gt 3600 ]

判断差值是否大于3600,若大于则执行后续操作

then

    ./mail.py  $1  $2  $3

    echo "0" > /tmp/$log.txt

else

若差值不大于3600,则执行以下操作

if [ ! -f /tmp/$log.txt ]

log.txt是计数器,记录从首次告警1小时内服务被判断为非正常的次数

    then

        echo "0" > /tmp/$log.txt

    fi

    nu=`cat /tmp/$log.txt`

    nu2=$[$nu+1]

    echo $nu2>/tmp/$log.txt

if [ $nu2 -gt 10 ]

若计数器的值超过10,再次发出告警

    then

         ./mail.py  $1 "trouble continue 10 min $2" "$3"

         echo "0" > /tmp/$log.txt

这里发出告警后将计数器$log.txt重新计数,重置为0

    fi

fi  

 

20.24 告警系统邮件引擎(中)

 

 

 

20.25 告警系统邮件引擎(下)

 

当在计数器周期内,故障恢复,则此时计数器不会被清空,假如下次故障的时间戳与本次故障的时间戳差值小于等于3600,此时计数器的值会被加1,但由于计数器值未超过10,此时会告警收敛,所以不会告警;

只有当两个时间戳差值小于等于3600且计数器的值大于10时才会发出告警,然后计数器被清0,进入下一个告警收敛周期;

 

20.26 运行告警系统

 

设置定时任务:

[root@hyc-01-01 ~]# crontab -e

crontab: installing new crontab

* * * * * cd /usr/local/sbin/mon/bin; bash main.sh

 

mail.py3个参数:

./mail.py  $1  $2  $3

$1:发送给谁

$2:邮件主题

$3:邮件内容