七十二、告警系統郵件引擎、運行告警系統
一、告警系統郵件引擎
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`
把文件的內容作為第三個參數。
七十二、告警系統郵件引擎、運行告警系統