告警監控系統的構建(下)

[toc]python

shell項目-告警系統

  • [ ] 要求:咱們的機器角色多種多樣,可是全部機器上都要部署一樣的監控系統,也就說全部機器無論什麼角色,整個程序框架都是一致的,不一樣的地方在於根據不一樣的角色,定製不一樣的配置文件。
  • [ ] 程序架構:

mark

  • [x] bin下是主程序;
  • [x] conf下是配置文件;
  • [x] shares下是各個監控腳本;
  • [x] mail下是郵件引擎;
  • [x] log下是日誌。

5、郵件引擎

一旦以前所設定的部分監控腳本超出了設定的值,咱們須要進行報警。shell

5.1 告警系統(核心配置) mail.sh(告警收斂)

log=$1          //log做爲一個變量,接收來自第一個參數的值
t_s=`date +%s`      //時間戳
t_s2=`date -d "2 hours ago" +%s`    //兩個小時前的時間戳
if [ ! -f /tmp/$log ]       //若是日誌文件不存在
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 ]  //此處的if判斷是,當過了1小時若是仍是沒有恢復再次發告警郵件。調用mail.py(若是沒有恢復,每1小時發一次)
then
    ./mail.py  $1  $2  $3 //告警
    echo "0" > /tmp/$log.txt        //生成一個新的.txt日誌。用來記錄告警
else
    if [ ! -f /tmp/$log.txt ]       //判斷有沒有這個日誌文件(計數器文件)
    then
    echo "0" > /tmp/$log.txt        //計數器歸零
    fi
    nu=`cat /tmp/$log.txt`          //查看計數器的數字
    nu2=$[$nu+1]                    //計數器+1
    echo $nu2>/tmp/$log.txt         //把計數器寫入日誌文件(重置)
    if [ $nu2 -gt 10 ]              
    then
        ./mail.py  $1 "trouble continue 10 min $2" "$3"         //表明着已經持續了10分鐘了
        echo "0" > /tmp/$log.txt    //從新歸零開始計數
    fi
fi

5.2 腳本詳細解析:

  • [ ] ① 爲何以秒爲單位呢?這就涉及到了「告警收斂」,腳本是每隔一分鐘執行一次的,若是觸發了就告警,若是短期搞定或者告警數量不少,告警信息就會影響你解決分析判斷問題,若是成千上百臺機器,那就是太多了bash

  • [ ] ② 若是腳本開始報警,log 的$1是什麼?還記得上篇文章當報警的時候執行mail.sh 緊接着給了個參數,那個參數就是所謂的$1。t_s 時間戳 t_s2 2小時以前的時間戳,定義兩小時的緣由就是爲了執行下面的if語句,條件成立就實現了我們的報警條件,開始報警。架構

  • [ ] ③ 發了郵件後,寫一個計數器在log.txt中,else咱們如今就不執行了,由於那是小於3600才執行的東西。框架

  • [ ] ④ 腳本每分鐘執行一次,第二次開始,log,t_s,t_s2相對於第一次只是增長了一分鐘,判斷文件是否存在,由於上一次剛剛執行過,因此必定是存在的,t_s2就只是增長了60s 因此通過提取給變量v,判斷不超過3600,開始執行else的內容,第一次執行的時候已經建立了log.txt 因此是有的且nu爲0 nu2爲1,nu2不大於10,因此就是再次循環 。運維

  • [ ] ⑤ 直到執行到最後一步nu2爲11了,那也就是到了10分鐘了,若是故障仍是存在,運維再次收到一個告警郵件,故障已經持續10分鐘了。這樣就實現了我們所說的「告警收斂」ide

  • [ ] ⑥ 若是超過10分鐘再次發了郵件,而後執行計數器歸0,再次開始從新循環計數。測試

  • [ ] ⑦ 最後告警解除了,再也不調用mail.sh,也就恢復了,不在執行mail.sh了。debug

  • [ ] ⑧ 假如腳本在執行3分鐘的時候,忽然故障恢復了,腳本也就不會再次執行,而後計數器保持在2,在計數週期內若是恢復,不告警即不發郵件,但只有在一個小時之後故障纔會消失,大於3600的,若是在一個小時內再次報警,仍是按照以前的計數器繼續執行!

5.3 發郵件python腳本 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 sendqqmail(username,password,mailfrom,mailto,subject,content):
    gserver = 'smtp.qq.com'
    gport = 25
    try:
        msg = MIMEText(unicode(content).encode('utf-8'))
        msg['from'] = mailfrom
        msg['to'] = mailto
        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郵箱的帳號和密碼,你須要修改爲你本身的帳號和密碼(請不要把真實的用戶名和密碼放到網上公開,不然你會死的很慘)
    sendqqmail('1234567@qq.com','aaaaaaaaaa','1234567@qq.com',to,subject,content)
if __name__ == "__main__":
    main()

#####腳本使用說明######
#1. 首先定義好腳本中的郵箱帳號和密碼
#2. 腳本執行命令爲:python mail.py 目標郵箱 "郵件主題" "郵件內容"

5.4 運行告警系統

5.4.1 腳本加入crontab 每分鐘執行一次

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

mark

mark

5.4.2 執行main.sh,肯定最終結果

[root@xavi mail]# cd /usr/local/sbin/mon/bin/
[root@xavi bin]# sh -x main.sh
+ export send=1
+ send=1
++ grep -A1 'ens33: '
++ /sbin/ifconfig
++ awk '/inet/ {print $2}'
+ export addr=192.168.72.130
+ addr=192.168.72.130
++ pwd
+ dir=/usr/local/sbin/mon/bin
++ echo /usr/local/sbin/mon/bin
++ awk -F/ '{print $NF}'
+ last_dir=bin
+ '[' bin == bin ']'
+ conf_file=../conf/mon.conf
+ exec

查看錯誤日誌:日誌

[root@xavi bin]# cat ../log/err.log
++ date '+%F %T'
+ echo '2018-04-25 23:40:33 load average'
+ /bin/bash ../shares/load.sh
+ grep -q to_mon_502=1 ../conf/mon.conf
++ grep logfile= ../conf/mon.conf
++ awk -F = '{print $2}'
++ sed 's/ //g'
+ export log=/data/log/xxx.xxx.com/access.log
+ log=/data/log/xxx.xxx.com/access.log
+ /bin/bash ../shares/502.sh
grep: /data/log/xxx.xxx.com/access.log: 沒有那個文件或目錄

根據錯誤提醒修改部分參數設置:

[root@xavi bin]# vi ../conf/mon.conf

mark

[root@xavi bin]# vi main.sh

mark

  • load的測試已經成功
    mark

郵件發送再也不演示了,在配置到線上過程時,必定要保持各項的參數配置符合現場的需求或者設置

相關文章
相關標籤/搜索