郭 茜,劉國強,李從英,支亞京,彭宇翔,金石聲
(1.貴州省氣象信息中心,貴州 貴陽 550002;2.貴州省人工影響天氣辦公室,貴州 貴陽 550081)
近年來,氣象信息化高速發展,通過大數據、云計算等現代科技信息技術在氣象領域的應用與發展,目前氣象行業已進入建設智慧氣象的新階段。貴州省氣象信息中心在氣象信息化建設基礎上,進一步升級擴展,形成國家級設計,升級CIMISS分布式數據存儲,在多中心協同的氣象云數據管理能力建設,氣象服務大數據平臺、支撐精準預報的眾創業務平臺,基礎設施資源監控和氣象預報預測業務評估信息化系統建設等方面開展工作,建立了基于混合云結構及標準化體系的氣象數據分布式存儲系統,完成CIMISS系統的云化升級,提供高效的數據支撐。并建立國省數據協同、服務協同流程以及專有云、公有云同步的數據流程,整體提升了氣象數據的服務能力和氣象業務服務的能力[2]。
數十年來,氣象信息化基礎資源建設得到大力發展,計算資源、數據資源在各行各業廣泛應用,大量的數據傳輸給氣象系統運維人員帶來了巨大的挑戰,為了提高氣象數據傳輸的及時率、緩解系統運維人員監控和維護氣象業務數據傳輸的巨大壓力,本文根據省級氣象系統維護的實際需要,在前期貴州省氣象信息中心搭建的Zabbix氣象業務系統監控框架的基礎之上,通過使用編程語言開發相應的程序模塊,使Zabbix框架對接企業微信、睿象云等社交軟件,便于監控維護人員實時了解當前被監控對象的運行情況,并及時接收告警通知,以實現高效處理故障和縮短維護響應時間。
Zabbix監控框架支持的插件多、組件多,集成了多種告警推送的方式,但是郵件告警信息常因沒有專門的郵件應用分類,容易被運維人員忽略未及時查看,錯過解決問題的最佳時機;短信告警的內容不僅不全面還容易被忽略,且通信資費高昂[3]。微信目前是國內最受歡迎的即時通訊軟件,因其體積小、速度快、功能多的特點、用戶超十億人,涵蓋社會各類人群。企業微信在微信的用戶群基礎上建立,保留了用戶對微信的使用習慣,在服務、功能和使用目的上區別于微信,使工作團體間能便利地溝通與應用,使企業和組織能夠提高整體運營效率。大量的企業通過使用企業微信豐富、免費、多樣化的第三方接口對接監控應用軟件來推送告警信息,這樣可以方便系統和數據運維人員及時查看告警信息,得以高效處理故障[4]。
因此,本文在貴州省氣象信息中心初步搭建的Zabbix監控氣象數據傳輸框架的基礎上進行企業微信告警推送功能的探索和研究[5]。
貴州省氣象信息中心搭建的Zabbix采用的是分布式的分層架構:客戶端采集數據在服務器端進行處理后通過Web前端交互界面以圖表等方式展示給用戶,代理服務器做代理,圖1展示了Zabbix監控報警流程。告警觸發是Zabbix監控報警流程中的關鍵環節,監控平臺能夠根據告警級別區分發送對象和范圍[6]。Zabbix可以通過Zabbix服務器到客戶端主動采集數據,也可以通過安裝Zabbix監控代理后將數據由代理推送至Zabbix-Server的方式獲取。通過配置監控項Item周期性地從主機里采集數據,并存到其對應的數據庫中,同時將所采集到的數據信息通知到框架觸發器Trigger,由Trigger進行采集值與告警閾值的比較判斷。若采集到的監控項數據超過觸發器閾值,達到觸發條件則產生告警事件Event,Zabbix將按照該告警事件所對應的Action(動作)來進行處理。Action會根據預設流程,利用Zabbix框架通過告警狀態體形成相應告警信息,將告警推送給數據系統維護人員。產生的該事件可以通過多種方式,例如:企業微信告警、短信、郵件等方式通知觸發器所屬的主機組負責人;若監控項數據未超過觸發器閾值,則不產生告警事件,監控項Item將繼續進行該主機監控數據采集工作[7]。

圖1 Zabbix監控報警流程
企業微信區別于個人微信的優勢在于它支持一鍵群發、標簽群發,并且客戶資源屬于企業,以便員工利用社交賬號專門處理企業工作內容。同時企業微信的后臺開放API接口,可以通過專門的企業微信ID號對接各開源告警平臺,將公眾號、小程序等流量池數據打通,實現精細化的運營管理。大多數故障是通過監控系統發現、推送告警信息給系統維護人員,由運維人員及時處理以避免造成重大損失。因此,及時、準確地分析和處理各類告警成為系統運維重中之重的工作內容。在系統監控運維工作中,傳統告警方式是郵件和短信,但郵件告警的及時性比較差,告警郵件容易被忽略;短信告警及時性比較強,但告警內容單一,維護人員不能夠及時精確地判斷故障的具體情況。另一種告警方式就是通過企業微信進行監控告警,保證運維人員日常使用社交軟件的同時,也能夠關注到監控系統的告警信息,并及時進行維護和處理[8]。本文基于Zabbix監控框架與企業微信進行關聯,利用Python語言開發相應的功能模塊實現企業微信應用推送運維告警信息。
通過企業微信創建Zabbix應用,并添加氣象業務系統的運維成員賬戶,所有與Zabbix相關的告警信息將通過該應用進行推送。
創建成功后,企業微信會分配出每個成員的賬號,AgentID(應用ID)、CorpID(企業ID)和CorpSecret(秘鑰),Zabbix框架在調用API接口時用以上信息作為身份ID識別碼。企業微信告警模塊是基于Python環境開發的,該Python程序主要是用于對接Zabbix框架與企業微信中建立的Zabbix應用,以實現通過Zabbix監控目標主機數據觸發告警,并通過企業微信應用推送到系統運維人員。將編寫好的模塊.py放入Zabbix服務器端/etc/Zabbix/alertscripts目錄下,并賦予權限,使Zabbix用戶能夠執行該程序。測試該模塊是否能夠正常與企業微信對接時,可以在Zabbix服務端bin目錄下進行,通過命令行對已編譯的WXAlert.py進行測試,若能夠正常在企業微信中收到消息,證明該程序運行正常,測試命令如下:
[root@localhost alertscripts]# ./WXAlert.py username test 1615helloZabbixTest https://qyapi.weixin.qq.com/cgi-bin/- gettoken?corpid=ww1***cd&corpsecret=1wV5***ZywVEW2dIac。
在企業微信告警核心代碼程序中,主要創建2個函數:Gettoken函數與Senddata函數。Gettoken函數用于創建令牌。從已注冊的企業微信中獲取CorpID(企業號標識)、CorpSecret(企業號秘鑰)并對2個參數進行編碼后一并存入Token中。創建Token令牌主要是用于企業微信客戶端訪問服務端時的身份驗證,當客戶端第一次訪問服務端時,服務端生成Token后返回給客戶端,之后客戶端無需重復輸入用戶名和密碼,只需攜帶身份令牌Token便可頻繁地訪問企業微信服務端。否則每次發送告警信息時客戶端都需輸入賬戶密碼,造成服務端訪問壓力過大,客戶端發送告警通知的流程變復雜,同時賬戶和密碼泄漏風險增大,增加了黑客截取賬戶的機會。因此,在核心程序中,使用Token令牌進行身份驗證,而非將賬戶密碼存儲于Session中。Gettoken函數如下:
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
函數Senddata用于傳送企業微信告警接收用戶(企業微信用戶賬號touser:aa、bb、cc、dd)、Toparty是企業微信中的部門ID:8、agentid是企業微信中的應用ID:100003、告警主題Subject以及告警內容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個數組:企業微信接收用戶、企業微信告警主題、企業微信告警內容。
if_name_=='_main_':user=str(sys.argv[1])
subject=str(sys.argv[2])
content=str(sys.argv[3])
從企業微信號中找到企業號標識ww1***cd、企業號秘鑰1wV5***ZywVEW2dIac,并在程序中分別賦值給CorpID、CorpSecret參數,將Gettoken令牌函數獲取到的參數賦值給Accesstoken參數,并將以上形成的實際參數全部賦予Senddata函數進行處理。
在Zabbix網頁顯示端,對報警媒介和觸發報警動作進行配置,使得Zabbix框架網頁顯示端與WXAlert.py程序關聯起來。Web端配置報警媒介:點擊管理→報警媒介→創建報警媒介→設置用戶。
Web端配置觸發報警動作:點擊配置→動作→創建動作→編輯告警信息狀態體,動作的事件源為觸發器,可以設置發送告警的時間間隔等。
本文以設置某主機CPU負載率超過1%作為觸發告警事件項測試企業微信告警。當該主機CPU負載率超過1%時,在企業微信Zabbix應用中產生了準確的告警信息。至此,Zabbix框架對接企業微信告警模塊的開發和部署已完成,運維人員可在Zabbix創建的企業微信Zabbix應用信息對話框中看到Zabbix框架監控到的測試主機項目告警信息:當該主機CPU負載>1%時告警,并且當該故障及時得到恢復的時候,Zabbix同樣也將已恢復的告警信息發送至該企業微信應用。
Zabbix雖然能夠直接推送告警至企業微信平臺,但如遇到網絡中斷、閃斷,監控內容多、設備多的情況下,會產生海量的告警信息,從而導致告警風暴,運維人員很難從海量告警中篩選出重要告警信息。Zabbix框架推送的告警信息經過睿象云智能告警平臺可以實現告警壓縮與降噪,在不遺漏重要告警的前提下,通過聚類算法快速智能合并重復信息,減少告警。本文利用睿象云智能告警平臺CloudAlert對接Zabbix框架進行企業微信的告警推送。首先,通過睿象云平臺集成Zabbix框架,并在Zabbix-Server服務端安裝睿象云采集告警的代理AGENT,并得到代理安裝秘鑰:ec1ec423***ce050cc。
在睿象云平臺集成企業微信應用,獲取企業微信機器人webhook url:https://qyapi. weixin.qq.com/cgi-bin/webhook/send?key=7a493f1d-***1d1e2 在企業微信Zabbix應用中點擊添加群機器人→添加機器人→輸入機器人名字→填寫webhook url。睿象云智能告警平臺通過告警機器人集成推送告警信息至企業微信。
本文利用Zabbix開源監控框架監測氣象核心業務系統的運行狀況,并開發框架內相應程序模塊,通過企業微信成功實現告警推送,同時通過搭建睿象云智能告警平臺對Zabbix框架內告警信息進行降噪、壓縮后再推送告警至企業微信。在Zabbix框架內配置各個監控項對應采集值的觸發策略以及告警動作,根據對告警信息的不同等級的綜合分級及判定,利用程序模塊對接企業微信開源API接口高效、及時推送告警信息以便運維人員及時處理,實現對氣象核心系統進程的自動化運維。利用企業微信推送基于Zabbix框架的告警信息,既有效地控制運維的成本,又能保障氣象IT系統業務正常、安全、有效運行。