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

用Python實現多站點運維監控

來源: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就認為正常,否則就把該站點加到臨時的一個字典中,然後從檢查字典中刪除該站點。


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

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分鐘,仔細再看看,是否發現漏掉了什麼?是的,我還沒給出發報警郵件的函式代碼,不但沒貼而且不妨告訴大家我是故意的,之所以沒直接給呢

是因為現在報警方式太多了,我建議大家在這個腳本基礎上進行修改實現自己想要的報警方式

就當是留個作業吧,畢竟多動手才能提高編程水平,其它不多說了



●編號201,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

 

Python編程

更多推薦18個技術類微信公眾號

涵蓋:程式人生、演算法與資料結構、黑客技術與網絡安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

赞(0)

分享創造快樂