基礎(chǔ)監(jiān)控的同比告警主要是針對(duì)服務(wù)器監(jiān)控采集的指標(biāo),包括負(fù)載(load1/load5/load15)、平均CPU使用率、內(nèi)存使用率、內(nèi)外網(wǎng)流量、端口數(shù)量等,具體采集方法可參考《基礎(chǔ)監(jiān)控-服務(wù)器監(jiān)控》。
一、告警原理
多個(gè)指標(biāo)每分鐘1個(gè)數(shù)據(jù),比較當(dāng)前分鐘的前10分鐘的7天平均值,如果幅度超過100%并且絕對(duì)值相差達(dá)到M則算是一次異常,包括上升/下降異常,如果一個(gè)指標(biāo)持續(xù)兩次上升異常或者持續(xù)兩次下降異常(不包括先上升后下降或者先下降后上升情況)則開始告警給機(jī)器的對(duì)應(yīng)負(fù)責(zé)人(運(yùn)維/開發(fā))。例如當(dāng)前是10號(hào)11:00,則比較的是10:59,10:58...10:50共10分鐘的最近7天的平均值,例如10:59則是10號(hào)、9、8...4共7天的10:59這個(gè)點(diǎn)的數(shù)據(jù)的平均值。實(shí)際情況一般是第二分鐘才解析了前一分鐘的數(shù)據(jù),相當(dāng)于當(dāng)前是11點(diǎn),則解析的是10:59這個(gè)點(diǎn)和它之前的10分鐘的7天平均值的比較。
二、數(shù)據(jù)來源
基礎(chǔ)監(jiān)控-服務(wù)器監(jiān)控每分鐘會(huì)采集一份數(shù)據(jù)保存到Redis中,保存格式是 reportTime - hash,hash的格式是{ip1:{item1:value, item2:value2...}, ip2:{item1:value, item2:value2...}, ip3...},則每分鐘一個(gè)redis hash,共7天 7*1440=10080個(gè)數(shù)據(jù)。實(shí)際情況保存的時(shí)候會(huì)多保留10分鐘的數(shù)據(jù),即7天+10分鐘;由于reportTime是根據(jù)機(jī)器的實(shí)際時(shí)間來上報(bào)(這樣畫圖才能保證是準(zhǔn)確的),而某些機(jī)器沒有NTP服務(wù)器或者其他原因?qū)е聲r(shí)間不準(zhǔn),則reportTime則又會(huì)多種多樣,所以導(dǎo)致的結(jié)果是redis的hash會(huì)變多一些,當(dāng)然這并不影響我們的數(shù)據(jù)獲取,因?yàn)檎麄€(gè)同比告警就是根據(jù)畫圖來比較的,畫圖采用的是reportTime。采用hash保存到redis則不用每個(gè)ip讀取一次redis,可以減少N次網(wǎng)絡(luò)IO,大大提高程序速度。由于redis占據(jù)內(nèi)存較多,大概10G左右,需要調(diào)整redis配置文件maxmemory的大小,不然redis會(huì)隨機(jī)刪除設(shè)置自動(dòng)過期的key。
三、程序設(shè)計(jì)
1、DB設(shè)計(jì)
需要數(shù)據(jù)來源保存(redis)、異常展示表(mysql)、閾值配置表(mysql)、上次狀態(tài)(redis)。異常展示表保存所有ip的異常描述信息、異常持續(xù)時(shí)間,可在頁(yè)面展示;閾值配置表保存所有ip的閾值配置信息,每個(gè)ip的異常比率、各個(gè)指標(biāo)的絕對(duì)值差、是否需要監(jiān)控等;上次狀態(tài)則用來判斷是否需要告警的,持續(xù)2次同類異常則告警,使用redis保存即可。
mysql> show tables; +-----------------------------------+ | Tables_in_machineMon