摘要:介紹了一種在QT4、C++語言環(huán)境下開發(fā)的綜合監(jiān)控系統(tǒng)事件查詢工具軟件。該軟件支持歷史事件和實時事件兩種查詢模式。與一般的查詢工具軟件不同,該軟件以動態(tài)庫的模式嵌入到圖形用戶界面(GUI)程序中,它不僅能滿足在大數(shù)據(jù)量環(huán)境中對查詢效率的要求,而且操作簡單。
關(guān)鍵詞:綜合監(jiān)控系統(tǒng);事件查詢;GUI;Qt
0 引言
事件查詢是綜合監(jiān)控系統(tǒng)的一個重要功能。綜合監(jiān)控系統(tǒng)中的保存的歷史事件數(shù)據(jù)非常多,以北京地鐵5號線綜合監(jiān)控系統(tǒng)為例,每天保存的事件有二十多萬條,一年的數(shù)據(jù)有將近一億條,要快速準(zhǔn)確地查找出用戶所需的數(shù)據(jù)是非常困難的。綜合監(jiān)控系統(tǒng)除了要檢索歷史事件外,還要檢索實時發(fā)生的事件。為了與其他GUI顯示保持一致性,事件查詢工具軟件需要嵌入到GUI中,不能作為—個獨立的程序運(yùn)行。本文提出了一種新的方案,將事件查詢工具生成一個動態(tài)庫。嵌入到GUI程序中,同時對查詢進(jìn)行優(yōu)化,以在節(jié)約系統(tǒng)資源的同時滿足查詢效率的需求。
1 功能分析
綜合監(jiān)控系統(tǒng)是一個多專業(yè)、多域的系統(tǒng)。其事件來源于多個不同的系統(tǒng)消息,這些消息包括:①狀態(tài)變位事件,包括數(shù)字量的狀態(tài)變化和模擬量越限報警,這是歷史事件中最主要的內(nèi)容;②各種操作記錄,包括控制操作是否成功、報警確認(rèn)、用戶登錄和注銷登錄;③綜合監(jiān)控系統(tǒng)設(shè)備狀態(tài)的變化,包括計算機(jī)故障(包括內(nèi)存、CPU、硬盤),網(wǎng)絡(luò)設(shè)備故障。
綜合監(jiān)控系統(tǒng)中事件查詢功能包括兩部分:歷史事件查詢和實時事件查詢。歷史事件查詢是根據(jù)用戶設(shè)定的查詢條件從數(shù)據(jù)庫中讀取歷史事件然后在GUI上展示給用戶;這種查詢方式是被動式的,先由用戶提交查詢需求,然后顯示結(jié)果。實時事件查詢是將系統(tǒng)中實時發(fā)生的事件實時地展示給用戶;這種方式是主動式的,用戶設(shè)定條件之后:當(dāng)系統(tǒng)中有符合設(shè)定條件的新事件發(fā)生時,GUI上能實時刷新。
綜合監(jiān)控系統(tǒng)客戶端一般是多屏工作站,同一工作站上不同的屏幕上顯示的內(nèi)容不一定相同,而且要求互不影響。因此操作員在不同屏幕上設(shè)置的查詢條件只能在本屏幕上有效。GUI顯示的事件只能顯示符合當(dāng)前屏幕設(shè)置查詢條件的記錄。操作員在查詢歷史事件時,如果查詢條件嚴(yán)格而且歷史數(shù)據(jù)量非常多(如總的數(shù)據(jù)記錄達(dá)到1億條記錄),事件查詢工具軟件必須保證不能影響操作員在該工作站的其它工作,如GUI上的數(shù)據(jù)刷新、告警的刷新以及控制操作等。
2 模塊設(shè)計與實現(xiàn)
本查詢軟件的數(shù)據(jù)庫環(huán)境是ORACLE10.2,系統(tǒng)中的GUI主程序用QT4.5和C++實現(xiàn)。本軟件是以動態(tài)庫的形式給GUI主程序調(diào)用的。
2.1 設(shè)計思路
查詢軟件的設(shè)計采用QT提供的模型艦圖(Model/View)模式,結(jié)合過濾代理(QSortFilterProxyModel)控件實現(xiàn)數(shù)據(jù)的存儲、過濾和顯示。
由于歷史事件查詢的復(fù)雜多樣性,查詢過程會占有很多的系統(tǒng)資源,甚至造成GUI在短時間出現(xiàn)僵死狀態(tài),操作員不能在GUI上做任何操作,GUI上也看不到其它的數(shù)據(jù)刷新和新告警,這種現(xiàn)象會嚴(yán)重影響系統(tǒng)的安全性。因此,在軟件設(shè)計中將歷史事件查詢這種費時工作安排在子線程中完成,主線程在創(chuàng)建查詢子線程后并不等候結(jié)果返回,只是繼續(xù)做正常的處理,并定時監(jiān)視子線程查詢結(jié)果,當(dāng)子線程查詢結(jié)束時,返回結(jié)束標(biāo)記給主線程,主線程取到完成標(biāo)記時再把查詢結(jié)果顯示在GUI上。為了提高查詢性能,在優(yōu)化數(shù)據(jù)庫的設(shè)計同時另外采取了一些措施,即“先查到先顯示”,將先查到的一些結(jié)果先在GUI上展示,而不是等到所有查詢結(jié)束再一起顯示結(jié)果。
在實現(xiàn)實時事件功能時,為了節(jié)約系統(tǒng)資源,同時要做到在操作員頻繁修改過濾條件的情況下不影響顯示效率和多個GUI上的顯示互不影響,我們讓實時事件數(shù)據(jù)共用一個Model,該Model中只保存一份當(dāng)前用戶擁有的事件,通過QSortFilter-ProxyModel控件的過濾功能在不同GUI上顯示不同的事件內(nèi)容。為了實時刷新GUI上顯示的事件,以一個子線程接收系統(tǒng)服務(wù)發(fā)來的實時事件,當(dāng)該事件符合當(dāng)前用戶權(quán)限時,將該事件添加到Model中,否則就丟棄。
2.2 程序流程
本查詢工具軟件程序流程如圖1所示。
系統(tǒng)啟動并有用戶登錄時,首先做初始化,讀取當(dāng)前登錄用戶所具有的權(quán)限,根據(jù)該權(quán)限從數(shù)據(jù)庫中讀取最近的事伴,同時根據(jù)該權(quán)限接收從其他系統(tǒng)服務(wù)發(fā)來的實時事件。
接收實時事件子線程是常駐線程,直到GUI主程序退出。接收子線程負(fù)責(zé)接收系統(tǒng)其他服務(wù)程序發(fā)送來的實時事件,更新實時事件Model。
歷史事件查詢子線程是非常駐線程,當(dāng)查詢結(jié)束后,子線程就退出。
2.3 查詢界面
本查詢軟件以重慶軌道交通3號線系統(tǒng)為例,如圖2所示為一個簡單的事件查詢界面。
系統(tǒng)提供了多種過濾條件選擇,操作員可以通過以下操作設(shè)定事件過濾的條件:
(1)選擇報警等級,可以選擇多個報警等級或全部等級。
(2)選擇需要查看的車站,可以選擇多個車站或所有車站。
(3)選擇專業(yè)或系統(tǒng),可以選擇多個系統(tǒng),也可以全選。系統(tǒng)選擇完后,相應(yīng)的“設(shè)備類型”復(fù)選框中的“系統(tǒng)列表框”將相應(yīng)的改變,該列表框只顯示已選中的系統(tǒng)列表。
(4)選擇想要過濾的事件類型,可以單選或多選。
(5)可以使用“設(shè)備類型”過濾,選擇某系統(tǒng)下的某一類設(shè)備。
(6)可以按“關(guān)鍵字”查詢,在編輯框中輸入需要匹配的關(guān)鍵字,如“101”,可以查詢事件內(nèi)容中所有有“101”字樣的事件。
(7)點擊【報警確認(rèn)】按鈕,在新的事件過濾界面中,可以選擇某用戶組下某用戶確認(rèn)的報警,也可以查詢所有用戶確認(rèn)的報警。
(8)點擊【確定】按鈕后,設(shè)定的過濾條件即可生效,過濾界面關(guān)閉,系統(tǒng)在事件列表GUI中即刻顯示所過濾的信息。
點擊【應(yīng)用】按鈕后,設(shè)定的過濾條件即可生效,過濾界面關(guān)閉,在事件列表中即刻顯示所過濾的信息。重啟系統(tǒng)時,如果登錄用戶和本次用戶權(quán)限相同,則打開的“事件過濾”界面的設(shè)置條件與本次保存的條件相同;若權(quán)限不同,則條件清空。
點擊【取消】按鈕,系統(tǒng)將放棄所作的選擇,保持上次設(shè)置的過濾條件。過濾界面關(guān)閉。
本工具軟件的歷史事件和實時事件切換方便。當(dāng)選中“查詢時間設(shè)置”復(fù)選框,即表示將執(zhí)行歷史事件查詢,操作員輸入“開始時間”及“結(jié)束時間”,系統(tǒng)將根據(jù)上述過濾條件及此處設(shè)定的時間段進(jìn)行歷史事件的查詢及顯示。當(dāng)“查詢事件設(shè)置”復(fù)選框未選中時,即表示將執(zhí)行實時事件查詢,將顯示系統(tǒng)內(nèi)所有符合過濾條件的實時事件。
3 結(jié)束語
本查詢工具軟件綜合考慮了綜合監(jiān)控系統(tǒng)的特點,完全滿足操作人員對歷史事件和實時事件的查詢需求。本軟件嵌入GUI主程序后,運(yùn)行穩(wěn)定,而且效率高,可以在海量數(shù)據(jù)中查詢?nèi)我鈺r段、任意條件的事件。在有1.5億條歷史事件記錄的測試環(huán)境中,當(dāng)查詢時間跨度達(dá)一個月時,可以在3秒鐘內(nèi)返回查詢結(jié)果,而且不影響其它GUI的數(shù)據(jù)刷新。測試結(jié)果證明,本軟件運(yùn)行性能良好。