在《利用Pycurl庫(kù)監(jiān)控WEB訪問(wèn)質(zhì)量(三)》(鏈接:http://www.reibang.com/p/96f18e83c8e9)中已經(jīng)能夠檢測(cè)狀態(tài)碼是否為200陆错,響應(yīng)時(shí)間是否在5秒內(nèi)灯抛,如果上述任何一個(gè)條件都不滿足,則發(fā)報(bào)警郵件危号,同時(shí)報(bào)警郵件也變得更漂亮了牧愁。但是上述的監(jiān)控方式還是顯示比較死板素邪,有點(diǎn)硬編碼的感覺(jué)外莲,一點(diǎn)都不靈活,比如有些網(wǎng)站兔朦,我們是做了正常跳轉(zhuǎn)的(HTTP CODE 302),由于302不是200偷线,所以我們的腳本會(huì)發(fā)警報(bào)郵件,同時(shí)響應(yīng)時(shí)間我需要根據(jù)不同的網(wǎng)站設(shè)置不同的響應(yīng)時(shí)間沽甥,而不是一成不變的5秒声邦。
動(dòng)起手來(lái)
監(jiān)控指標(biāo)我們需要通過(guò)配置文件來(lái)加載,而不是定死要代碼里摆舟,設(shè)計(jì)如下:
#配置文件
{'url':'http://www.baidu.com','title':'百度','code':[200], 'time':5}
{'url':'http://www.google.com','title':'google','code':[200,302], 'time':10}
可以看到亥曹,配置文件中每個(gè)網(wǎng)站都有一系列的監(jiān)控指標(biāo)邓了,比如code可以是200,也可以是200或302媳瞪,響應(yīng)時(shí)間是5秒骗炉,或者10秒。下面讓腳本加載這些監(jiān)控指標(biāo):
#片斷代碼
with open("sites.txt") as f:
list_of_sites = f.readlines()
for element in list_of_sites:
dict_of_sites = eval(element) # 將str 轉(zhuǎn)換成 dict
# 處理代碼......
上述代碼極其簡(jiǎn)單蛇受,不再過(guò)多解釋了句葵。
直接上最終代碼:
# coding: utf-8
import pycurl
try:
from io import BytesIO
except ImportError:
from StringIO import StringIO as BytesIO
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
import jinja2
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
templateLoader = jinja2.FileSystemLoader(searchpath=".")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = 'mail.html'
template = templateEnv.get_template(TEMPLATE_FILE)
templateVars = {'title': 'XX監(jiān)控郵件',
'subtitle': 'XX網(wǎng)站監(jiān)控信息記錄',
'location': 'XX數(shù)據(jù)中心',
'jftel': '1381XXX',
'username': 'XXX',
'telephone': '13XXX/186XXX9',
'email': 'XXX@XXX.NET',
'status': [],
'num_sites': 0}
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr(( \
Header(name, 'utf-8').encode(), \
addr.encode("utf-8") if isinstance(addr, unicode) else addr))
from_addr = "XXX@XXX.com"
to_addr = "XXX@XXX.net" # 發(fā)送給多個(gè)用戶,使用逗號(hào)分隔
password = "XXX"
smtp_server = "smtp.XXXX.com"
def format_msg(s):
# type: (object) -> object
msg = MIMEText(s, _subtype='html', _charset='utf-8')
msg['From'] = _format_addr(from_addr)
msg['To'] = _format_addr(to_addr)
msg['Subject'] = Header(u'來(lái)自XXX的監(jiān)控小黑屋', 'utf-8').encode()
return msg.as_string()
def send_email(s):
server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(0)
server.login(from_addr, password)
server.sendmail(from_addr, ["XXX@XXX.net"], s)
server.quit()
flag = False # 決定是否發(fā)報(bào)警郵件的標(biāo)志
list_of_sites = []
outputText = ''
with open("sites.txt") as f:
list_of_sites = f.readlines()
num_sites = len(list_of_sites) # 計(jì)算所有站點(diǎn)的數(shù)量
templateVars['num_sites'] = num_sites
buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.FRESH_CONNECT, 1)
for element in list_of_sites:
dict_of_sites = eval(element) # 將str 轉(zhuǎn)換成 dict
c.setopt(c.URL, dict_of_sites['url'].replace('\n', ''))
c.setopt(c.WRITEFUNCTION, buffer.write)
try:
c.perform()
http_code = c.getinfo(c.HTTP_CODE)
total_time = c.getinfo(c.TOTAL_TIME)
if http_code in dict_of_sites['code']:
if total_time <= dict_of_sites['time']:
templateVars['status'].append([dict_of_sites['url'], http_code, total_time])
# outputText = template.render(templateVars)
else:
templateVars['status'].append([dict_of_sites['url'], http_code, total_time])
# outputText = template.render(templateVars)
flag = True
else:
templateVars['status'].append([dict_of_sites['url'], http_code, total_time])
# outputText = template.render(templateVars)
flag = True
except pycurl.error, error:
errno, errstr = error
# print errno, errstr
templateVars['status'].append([dict_of_sites['url'], errno, errstr])
# outputText = template.render(templateVars)
flag = True
c.close()
# print templateVars
outputText = template.render(templateVars)
msg = format_msg(outputText)
if flag:
send_email(msg)
Paste_Image.png