郭 茜,劉國強(qiáng),李從英,支亞京,彭宇翔,金石聲
(1.貴州省氣象信息中心,貴州 貴陽 550002;2.貴州省人工影響天氣辦公室,貴州 貴陽 550081)
近年來,氣象信息化高速發(fā)展,通過大數(shù)據(jù)、云計(jì)算等現(xiàn)代科技信息技術(shù)在氣象領(lǐng)域的應(yīng)用與發(fā)展,目前氣象行業(yè)已進(jìn)入建設(shè)智慧氣象的新階段。貴州省氣象信息中心在氣象信息化建設(shè)基礎(chǔ)上,進(jìn)一步升級擴(kuò)展,形成國家級設(shè)計(jì),升級CIMISS分布式數(shù)據(jù)存儲,在多中心協(xié)同的氣象云數(shù)據(jù)管理能力建設(shè),氣象服務(wù)大數(shù)據(jù)平臺、支撐精準(zhǔn)預(yù)報(bào)的眾創(chuàng)業(yè)務(wù)平臺,基礎(chǔ)設(shè)施資源監(jiān)控和氣象預(yù)報(bào)預(yù)測業(yè)務(wù)評估信息化系統(tǒng)建設(shè)等方面開展工作,建立了基于混合云結(jié)構(gòu)及標(biāo)準(zhǔn)化體系的氣象數(shù)據(jù)分布式存儲系統(tǒng),完成CIMISS系統(tǒng)的云化升級,提供高效的數(shù)據(jù)支撐。并建立國省數(shù)據(jù)協(xié)同、服務(wù)協(xié)同流程以及專有云、公有云同步的數(shù)據(jù)流程,整體提升了氣象數(shù)據(jù)的服務(wù)能力和氣象業(yè)務(wù)服務(wù)的能力[2]。
數(shù)十年來,氣象信息化基礎(chǔ)資源建設(shè)得到大力發(fā)展,計(jì)算資源、數(shù)據(jù)資源在各行各業(yè)廣泛應(yīng)用,大量的數(shù)據(jù)傳輸給氣象系統(tǒng)運(yùn)維人員帶來了巨大的挑戰(zhàn),為了提高氣象數(shù)據(jù)傳輸?shù)募皶r(shí)率、緩解系統(tǒng)運(yùn)維人員監(jiān)控和維護(hù)氣象業(yè)務(wù)數(shù)據(jù)傳輸?shù)木薮髩毫Γ疚母鶕?jù)省級氣象系統(tǒng)維護(hù)的實(shí)際需要,在前期貴州省氣象信息中心搭建的Zabbix氣象業(yè)務(wù)系統(tǒng)監(jiān)控框架的基礎(chǔ)之上,通過使用編程語言開發(fā)相應(yīng)的程序模塊,使Zabbix框架對接企業(yè)微信、睿象云等社交軟件,便于監(jiān)控維護(hù)人員實(shí)時(shí)了解當(dāng)前被監(jiān)控對象的運(yùn)行情況,并及時(shí)接收告警通知,以實(shí)現(xiàn)高效處理故障和縮短維護(hù)響應(yīng)時(shí)間。
Zabbix監(jiān)控框架支持的插件多、組件多,集成了多種告警推送的方式,但是郵件告警信息常因沒有專門的郵件應(yīng)用分類,容易被運(yùn)維人員忽略未及時(shí)查看,錯(cuò)過解決問題的最佳時(shí)機(jī);短信告警的內(nèi)容不僅不全面還容易被忽略,且通信資費(fèi)高昂[3]。微信目前是國內(nèi)最受歡迎的即時(shí)通訊軟件,因其體積小、速度快、功能多的特點(diǎn)、用戶超十億人,涵蓋社會各類人群。企業(yè)微信在微信的用戶群基礎(chǔ)上建立,保留了用戶對微信的使用習(xí)慣,在服務(wù)、功能和使用目的上區(qū)別于微信,使工作團(tuán)體間能便利地溝通與應(yīng)用,使企業(yè)和組織能夠提高整體運(yùn)營效率。大量的企業(yè)通過使用企業(yè)微信豐富、免費(fèi)、多樣化的第三方接口對接監(jiān)控應(yīng)用軟件來推送告警信息,這樣可以方便系統(tǒng)和數(shù)據(jù)運(yùn)維人員及時(shí)查看告警信息,得以高效處理故障[4]。
因此,本文在貴州省氣象信息中心初步搭建的Zabbix監(jiān)控氣象數(shù)據(jù)傳輸框架的基礎(chǔ)上進(jìn)行企業(yè)微信告警推送功能的探索和研究[5]。
貴州省氣象信息中心搭建的Zabbix采用的是分布式的分層架構(gòu):客戶端采集數(shù)據(jù)在服務(wù)器端進(jìn)行處理后通過Web前端交互界面以圖表等方式展示給用戶,代理服務(wù)器做代理,圖1展示了Zabbix監(jiān)控報(bào)警流程。告警觸發(fā)是Zabbix監(jiān)控報(bào)警流程中的關(guān)鍵環(huán)節(jié),監(jiān)控平臺能夠根據(jù)告警級別區(qū)分發(fā)送對象和范圍[6]。Zabbix可以通過Zabbix服務(wù)器到客戶端主動采集數(shù)據(jù),也可以通過安裝Zabbix監(jiān)控代理后將數(shù)據(jù)由代理推送至Zabbix-Server的方式獲取。通過配置監(jiān)控項(xiàng)Item周期性地從主機(jī)里采集數(shù)據(jù),并存到其對應(yīng)的數(shù)據(jù)庫中,同時(shí)將所采集到的數(shù)據(jù)信息通知到框架觸發(fā)器Trigger,由Trigger進(jìn)行采集值與告警閾值的比較判斷。若采集到的監(jiān)控項(xiàng)數(shù)據(jù)超過觸發(fā)器閾值,達(dá)到觸發(fā)條件則產(chǎn)生告警事件Event,Zabbix將按照該告警事件所對應(yīng)的Action(動作)來進(jìn)行處理。Action會根據(jù)預(yù)設(shè)流程,利用Zabbix框架通過告警狀態(tài)體形成相應(yīng)告警信息,將告警推送給數(shù)據(jù)系統(tǒng)維護(hù)人員。產(chǎn)生的該事件可以通過多種方式,例如:企業(yè)微信告警、短信、郵件等方式通知觸發(fā)器所屬的主機(jī)組負(fù)責(zé)人;若監(jiān)控項(xiàng)數(shù)據(jù)未超過觸發(fā)器閾值,則不產(chǎn)生告警事件,監(jiān)控項(xiàng)Item將繼續(xù)進(jìn)行該主機(jī)監(jiān)控?cái)?shù)據(jù)采集工作[7]。
圖1 Zabbix監(jiān)控報(bào)警流程
企業(yè)微信區(qū)別于個(gè)人微信的優(yōu)勢在于它支持一鍵群發(fā)、標(biāo)簽群發(fā),并且客戶資源屬于企業(yè),以便員工利用社交賬號專門處理企業(yè)工作內(nèi)容。同時(shí)企業(yè)微信的后臺開放API接口,可以通過專門的企業(yè)微信ID號對接各開源告警平臺,將公眾號、小程序等流量池?cái)?shù)據(jù)打通,實(shí)現(xiàn)精細(xì)化的運(yùn)營管理。大多數(shù)故障是通過監(jiān)控系統(tǒng)發(fā)現(xiàn)、推送告警信息給系統(tǒng)維護(hù)人員,由運(yùn)維人員及時(shí)處理以避免造成重大損失。因此,及時(shí)、準(zhǔn)確地分析和處理各類告警成為系統(tǒng)運(yùn)維重中之重的工作內(nèi)容。在系統(tǒng)監(jiān)控運(yùn)維工作中,傳統(tǒng)告警方式是郵件和短信,但郵件告警的及時(shí)性比較差,告警郵件容易被忽略;短信告警及時(shí)性比較強(qiáng),但告警內(nèi)容單一,維護(hù)人員不能夠及時(shí)精確地判斷故障的具體情況。另一種告警方式就是通過企業(yè)微信進(jìn)行監(jiān)控告警,保證運(yùn)維人員日常使用社交軟件的同時(shí),也能夠關(guān)注到監(jiān)控系統(tǒng)的告警信息,并及時(shí)進(jìn)行維護(hù)和處理[8]。本文基于Zabbix監(jiān)控框架與企業(yè)微信進(jìn)行關(guān)聯(lián),利用Python語言開發(fā)相應(yīng)的功能模塊實(shí)現(xiàn)企業(yè)微信應(yīng)用推送運(yùn)維告警信息。
通過企業(yè)微信創(chuàng)建Zabbix應(yīng)用,并添加氣象業(yè)務(wù)系統(tǒng)的運(yùn)維成員賬戶,所有與Zabbix相關(guān)的告警信息將通過該應(yīng)用進(jìn)行推送。
創(chuàng)建成功后,企業(yè)微信會分配出每個(gè)成員的賬號,AgentID(應(yīng)用ID)、CorpID(企業(yè)ID)和CorpSecret(秘鑰),Zabbix框架在調(diào)用API接口時(shí)用以上信息作為身份ID識別碼。企業(yè)微信告警模塊是基于Python環(huán)境開發(fā)的,該P(yáng)ython程序主要是用于對接Zabbix框架與企業(yè)微信中建立的Zabbix應(yīng)用,以實(shí)現(xiàn)通過Zabbix監(jiān)控目標(biāo)主機(jī)數(shù)據(jù)觸發(fā)告警,并通過企業(yè)微信應(yīng)用推送到系統(tǒng)運(yùn)維人員。將編寫好的模塊.py放入Zabbix服務(wù)器端/etc/Zabbix/alertscripts目錄下,并賦予權(quán)限,使Zabbix用戶能夠執(zhí)行該程序。測試該模塊是否能夠正常與企業(yè)微信對接時(shí),可以在Zabbix服務(wù)端bin目錄下進(jìn)行,通過命令行對已編譯的WXAlert.py進(jìn)行測試,若能夠正常在企業(yè)微信中收到消息,證明該程序運(yùn)行正常,測試命令如下:
[root@localhost alertscripts]# ./WXAlert.py username test 1615helloZabbixTest https://qyapi.weixin.qq.com/cgi-bin/- gettoken?corpid=ww1***cd&corpsecret=1wV5***ZywVEW2dIac。
在企業(yè)微信告警核心代碼程序中,主要?jiǎng)?chuàng)建2個(gè)函數(shù):Gettoken函數(shù)與Senddata函數(shù)。Gettoken函數(shù)用于創(chuàng)建令牌。從已注冊的企業(yè)微信中獲取CorpID(企業(yè)號標(biāo)識)、CorpSecret(企業(yè)號秘鑰)并對2個(gè)參數(shù)進(jìn)行編碼后一并存入Token中。創(chuàng)建Token令牌主要是用于企業(yè)微信客戶端訪問服務(wù)端時(shí)的身份驗(yàn)證,當(dāng)客戶端第一次訪問服務(wù)端時(shí),服務(wù)端生成Token后返回給客戶端,之后客戶端無需重復(fù)輸入用戶名和密碼,只需攜帶身份令牌Token便可頻繁地訪問企業(yè)微信服務(wù)端。否則每次發(fā)送告警信息時(shí)客戶端都需輸入賬戶密碼,造成服務(wù)端訪問壓力過大,客戶端發(fā)送告警通知的流程變復(fù)雜,同時(shí)賬戶和密碼泄漏風(fēng)險(xiǎn)增大,增加了黑客截取賬戶的機(jī)會。因此,在核心程序中,使用Token令牌進(jìn)行身份驗(yàn)證,而非將賬戶密碼存儲于Session中。Gettoken函數(shù)如下:
def gettoken(corpid,corpsecret):
gettoken_url=
'https://qyapi.weixin.qq.com/cgi-bin/gettoken ?corpid='+corpid+'&corpsecret='+corpsecret
print gettoken_url
try:
token_file=urllib2.urlopen(gettoken_url)
except urllib2.HTTPError as e:
print e.code
print e.read().decode("utf8")
sys.exit()
token_data=token_file.read().decode('utf-8')
token_json=json.loads(token_data)
token_json.keys()
token=token_json['access_token']
return token
函數(shù)Senddata用于傳送企業(yè)微信告警接收用戶(企業(yè)微信用戶賬號touser:aa、bb、cc、dd)、Toparty是企業(yè)微信中的部門ID:8、agentid是企業(yè)微信中的應(yīng)用ID:100003、告警主題Subject以及告警內(nèi)容Content。
def senddata(access_token,user,subject,content):
send_url=
'https://qyapi.weixin.qq.com/cgi-bin/message/send ?access_token='+access_token
send_values={
"touser":"aa|bb|cc|dd",
"toparty":"8"
"msgtype":"text"
"agentid":"1000003"
"text":{
"content":subject+' '+content
}
"safe":"0"
}
主程序接收以上程序傳遞過來的3個(gè)數(shù)組:企業(yè)微信接收用戶、企業(yè)微信告警主題、企業(yè)微信告警內(nèi)容。
if_name_=='_main_':user=str(sys.argv[1])
subject=str(sys.argv[2])
content=str(sys.argv[3])
從企業(yè)微信號中找到企業(yè)號標(biāo)識ww1***cd、企業(yè)號秘鑰1wV5***ZywVEW2dIac,并在程序中分別賦值給CorpID、CorpSecret參數(shù),將Gettoken令牌函數(shù)獲取到的參數(shù)賦值給Accesstoken參數(shù),并將以上形成的實(shí)際參數(shù)全部賦予Senddata函數(shù)進(jìn)行處理。
在Zabbix網(wǎng)頁顯示端,對報(bào)警媒介和觸發(fā)報(bào)警動作進(jìn)行配置,使得Zabbix框架網(wǎng)頁顯示端與WXAlert.py程序關(guān)聯(lián)起來。Web端配置報(bào)警媒介:點(diǎn)擊管理→報(bào)警媒介→創(chuàng)建報(bào)警媒介→設(shè)置用戶。
Web端配置觸發(fā)報(bào)警動作:點(diǎn)擊配置→動作→創(chuàng)建動作→編輯告警信息狀態(tài)體,動作的事件源為觸發(fā)器,可以設(shè)置發(fā)送告警的時(shí)間間隔等。
本文以設(shè)置某主機(jī)CPU負(fù)載率超過1%作為觸發(fā)告警事件項(xiàng)測試企業(yè)微信告警。當(dāng)該主機(jī)CPU負(fù)載率超過1%時(shí),在企業(yè)微信Zabbix應(yīng)用中產(chǎn)生了準(zhǔn)確的告警信息。至此,Zabbix框架對接企業(yè)微信告警模塊的開發(fā)和部署已完成,運(yùn)維人員可在Zabbix創(chuàng)建的企業(yè)微信Zabbix應(yīng)用信息對話框中看到Zabbix框架監(jiān)控到的測試主機(jī)項(xiàng)目告警信息:當(dāng)該主機(jī)CPU負(fù)載>1%時(shí)告警,并且當(dāng)該故障及時(shí)得到恢復(fù)的時(shí)候,Zabbix同樣也將已恢復(fù)的告警信息發(fā)送至該企業(yè)微信應(yīng)用。
Zabbix雖然能夠直接推送告警至企業(yè)微信平臺,但如遇到網(wǎng)絡(luò)中斷、閃斷,監(jiān)控內(nèi)容多、設(shè)備多的情況下,會產(chǎn)生海量的告警信息,從而導(dǎo)致告警風(fēng)暴,運(yùn)維人員很難從海量告警中篩選出重要告警信息。Zabbix框架推送的告警信息經(jīng)過睿象云智能告警平臺可以實(shí)現(xiàn)告警壓縮與降噪,在不遺漏重要告警的前提下,通過聚類算法快速智能合并重復(fù)信息,減少告警。本文利用睿象云智能告警平臺CloudAlert對接Zabbix框架進(jìn)行企業(yè)微信的告警推送。首先,通過睿象云平臺集成Zabbix框架,并在Zabbix-Server服務(wù)端安裝睿象云采集告警的代理AGENT,并得到代理安裝秘鑰:ec1ec423***ce050cc。
在睿象云平臺集成企業(yè)微信應(yīng)用,獲取企業(yè)微信機(jī)器人webhook url:https://qyapi. weixin.qq.com/cgi-bin/webhook/send?key=7a493f1d-***1d1e2 在企業(yè)微信Zabbix應(yīng)用中點(diǎn)擊添加群機(jī)器人→添加機(jī)器人→輸入機(jī)器人名字→填寫webhook url。睿象云智能告警平臺通過告警機(jī)器人集成推送告警信息至企業(yè)微信。
本文利用Zabbix開源監(jiān)控框架監(jiān)測氣象核心業(yè)務(wù)系統(tǒng)的運(yùn)行狀況,并開發(fā)框架內(nèi)相應(yīng)程序模塊,通過企業(yè)微信成功實(shí)現(xiàn)告警推送,同時(shí)通過搭建睿象云智能告警平臺對Zabbix框架內(nèi)告警信息進(jìn)行降噪、壓縮后再推送告警至企業(yè)微信。在Zabbix框架內(nèi)配置各個(gè)監(jiān)控項(xiàng)對應(yīng)采集值的觸發(fā)策略以及告警動作,根據(jù)對告警信息的不同等級的綜合分級及判定,利用程序模塊對接企業(yè)微信開源API接口高效、及時(shí)推送告警信息以便運(yùn)維人員及時(shí)處理,實(shí)現(xiàn)對氣象核心系統(tǒng)進(jìn)程的自動化運(yùn)維。利用企業(yè)微信推送基于Zabbix框架的告警信息,既有效地控制運(yùn)維的成本,又能保障氣象IT系統(tǒng)業(yè)務(wù)正常、安全、有效運(yùn)行。