異常,不應(yīng)該存在崇棠,但是我們有時(shí)候會(huì)遇到這樣的情況咽袜,比如我們監(jiān)控服務(wù)器的時(shí)候,每一秒去采集一次信息枕稀,那么有一秒沒有采集到我們想要的信息询刹,但是下一秒采集到了, 而后每次的采集都能采集到萎坷,就那么一次采集不到凹联,我們應(yīng)該針對(duì)這一次采集不到進(jìn)行分析嗎,這種的情況可以說無法重復(fù)出現(xiàn)哆档,我們也無法避免蔽挠,因?yàn)橥饨绲囊蛩靥嗵啵覀儫o法去控制這些外面的因素瓜浸,所以我們會(huì)有這樣的需求澳淑,一段時(shí)間內(nèi)出現(xiàn)頻率多少次,我們才能顯示一次報(bào)警插佛,或者說杠巡,一段時(shí)間內(nèi)出現(xiàn)的頻率達(dá)到我們的異常許可范圍我們認(rèn)為這樣的屬于異常,我們可以發(fā)出報(bào)警雇寇。
那么我們?cè)趺磥韺?shí)現(xiàn)呢忽孽,我想到了裝飾器,當(dāng)程序執(zhí)行到異常后谢床,我記錄時(shí)間,寫入文件厘线,然后讀取最近的第五次的判斷识腿,兩者時(shí)間戳的只差小于60s,我認(rèn)為這樣的可以發(fā)送警報(bào)造壮,如果大于60s渡讼,則認(rèn)為不足以發(fā)出我們的警告骂束,
那么我們來看看我們的代碼應(yīng)該怎么寫。
1.實(shí)現(xiàn)裝飾器
import datetime,time,random
def make(func):
def mak(*args,**kwargs):
try:
func(*args,**kwargs)
except:
with open('except.txt','a+') as f:
except_time=datetime.datetime.now()
f.writelines(except_time.strftime('%Y-%m-%d %H:%M:%S')+'\n')
f.close()
with open('except.txt','rb') as m:
try:
date=m.readlines()[-5].decode('utf-8')
ne=(date.split('\r\n')[0])
f1=datetime.datetime.strptime(ne,'%Y-%m-%d %H:%M:%S')
if (except_time-f1).seconds<6:
print('異常3审铩U瓜洹!fail')
else:
print('正常蹬昌!')
m.close()
except:
print('越界代表著我們的實(shí)驗(yàn)是成功的')
return mak
2.具體調(diào)用
@make
def beijing(i,m):
print(i/m)
if __name__=="__main__":
while True:
f=random.choice([0,1,2,3])
n=random.choice([0,1,2,3])
beijing(f,n)
time.sleep(0.3)
這樣我們針對(duì)一個(gè)程序的異常監(jiān)控就實(shí)現(xiàn)了混驰,我們來運(yùn)行下這個(gè)異常監(jiān)控的代碼。皂贩,
我們可以看到我們的代碼可以正常運(yùn)行栖榨,那么我們來試試,我們對(duì)多個(gè)程序的代碼進(jìn)行監(jiān)控明刷,我們的腳本可不可以實(shí)現(xiàn)呢婴栽。
@make
def shanghai(i,m):
print(i/m)
@make
def rizhao(i,m):
print(i/m)
@make
def zhengzhou(i,m):
print(i/m)
我們看下最后的執(zhí)行的結(jié)果
我們可以看到,只要有異常辈末,我們的程序都會(huì)記錄愚争,當(dāng)然了,這樣的還不能正常利用到我們的工作中挤聘。我們可以根據(jù)實(shí)際的項(xiàng)目去驗(yàn)證轰枝。 這樣的一段代碼呢,我在寫過的一個(gè)線上的接口的監(jiān)控中有用到檬洞。我的做法呢狸膏,是對(duì)于結(jié)果中的某個(gè)字段做了一次監(jiān)控,最后如果5min超過10個(gè)就直接報(bào)警添怔。