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.py的3个参数:
./mail.py $1 $2 $3
$1:发送给谁
$2:邮件主题
$3:邮件内容