歡迎光臨
每天分享高質量文章

如何實現多站點運維監控?

來源:python運維技術

ID:python運維技術

在小型公司裡如果產品線單一的話,比如就一個app,  一般1~2個運維就夠用了,如果產品過於龐大,就需要多個運維人員,但對於多產品線的公司來說,運維人員就要必須分多個人負責,因為超過200個站點讓1個人維護,那工作量是巨大的,就單單給開發的溝通時間,估計就要佔用一整天時間了,目前我所在的公司站點非常多,為管理方便,之前我們這裡是實行過一段叫站長制的方式,就是不同人承擔不同的專案維護,每個人就是自己所負責專案的站長,這個站長制實行完後,就有個監控問題,之前只要站點有問題,是每個人都可以收到,但為了防止報警泛濫,所以就需要把監控改成故障站點只發給負責該站點的站長,有了這個背景,我們今天就來實現這個需求,指令碼基本實現首先要有一個能夠報警的函式,還需要一個檢查站點是否故障的函式,最後一個函式是如果站點恢復後,要重新加入要監控的串列中,到這基本差不多了,但如果站點太多,用迴圈去檢查還是效率太低了點,所以我們考慮採用執行緒併發執行, 如果都想清楚了,就可以開始著手我們程式碼的編寫了:

首先匯入我們所需要的模組:

from threading import Thread

import requests

import time

import smtplib

然後定義要檢查的站點串列和報警郵件傳送人:


clients = {“http://www.mindg.cn”:”xxx@xx.com”,

“http://www.google.com”:”gg@gg.com”,

“http://www.baidu.com”:”cc@cc.com”}


接下來實現檢查是否站點故障函式:


temp_dic = {}

def site_up():

    while True:

        for client, email in clients.items():

            try:

                r = requests.get(client)

                if r.status_code == 200:

                    print client, ‘Site ok’

                    time.sleep(60) 

                else:

                    print client, ‘Site first registered as down – added to the “site down” monitoring’

                    temp_dic[client]=email

                    del clients[client]

            except requests.ConnectionError:

                print client, ‘Site first registered as down – added to the “site down” monitoring’

                temp_dic[client]=email

                del clients[client]


這個函式就是用requests檢查站點傳回的狀態碼,如果是200就認為正常,否則就把該站點加到臨時的一個字典中,然後從檢查字典中刪除該站點。

因為站點偶爾出現問題不代表是站點問題,也可能是網路抖動,所以重新檢查站點是否故障要等待一個固定時間,實現如下:

## site ‘down’ function

def site_down():

    while True:

        time.sleep(900) 

        for client, email in temp_dic.items():

            try:

                r = requests.get(client)

                if r.status_code == 200:

                    print client, ‘Site is back up!!’

                    email_sender(‘Site back up!! ‘, email, client)

                    clients[client]=email

                    del temp_dic[client]

                else:

                    email_sender(‘Site down!! ‘, email, client)

                    print client, ‘Site Currently down – email sent’

            except requests.ConnectionError:

                email_sender(‘Site down!! ‘, email, client)

                print client, ‘Site Currently down – email sent’


這個函式就是從臨時字典中取出第一次檢查出有問題的站點,15分鐘後再次檢查,如果傳回200,就傳送郵件,並從臨時字典中移除,重新加入監控串列中,如果仍然未恢復,就要傳送報警郵件了。

最後,我們採用併發的方式執行函式:

t1 = Thread(target = site_up)

t2 = Thread(target = site_down)

t1.start()

t2.start()

如果到這裡就算結束這篇文章, 大家拿著指令碼肯定是不能執行的,因為少程式碼,有興趣的也可以sleep 2分鐘,仔細再看看,是否發現漏掉了什麼,是的,我還沒給出發報警郵件的函式程式碼,不但沒貼而且不妨告訴大家我是故意的,之所以沒直接給呢, 第一:是因為現在報警方式太多了,我建議大家在這個指令碼基礎上進行修改實現自己想要的報警方式,第二:就當是留個作業吧,畢竟多動手才能提高程式設計水平,其它不多說了,最重要的是第三點:請幫忙轉發,:), 呵呵。

《Linux雲端計算及運維架構師高薪實戰班》2018年08月27日即將開課中,120天衝擊Linux運維年薪30萬,改變速約~~~~

    *宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。

    – END –


    更多Linux好文請點選【閱讀原文】

    ↓↓↓

    贊(0)

    分享創造快樂