左晨歡, 張 磊, 褚 彪
(合肥水泥研究設(shè)計(jì)院有限公司, 安徽 合肥 230051)
隨著科技的飛速發(fā)展,數(shù)字化轉(zhuǎn)型已經(jīng)成為了當(dāng)今企業(yè)發(fā)展的重要趨勢(shì),自 “十四五” 以來,我國政府提出了加快數(shù)字化轉(zhuǎn)型部署的戰(zhàn)略,旨在推動(dòng)傳統(tǒng)產(chǎn)業(yè)與數(shù)字技術(shù)的深度融合,提升企業(yè)的競(jìng)爭(zhēng)力和創(chuàng)新能力[1]。
在數(shù)字化轉(zhuǎn)型過程中,企業(yè)需要投入大量資源在生產(chǎn)管理(MES)、企業(yè)資源計(jì)劃(ERP)等信息化軟件中,而這些信息化軟件的后續(xù)運(yùn)行和維護(hù)需要人力、時(shí)間和金錢等資源的持續(xù)投入。因此企業(yè)亟需一套高效可靠的軟件監(jiān)控系統(tǒng),該系統(tǒng)可以持續(xù)監(jiān)控其他軟件的運(yùn)行狀態(tài),并在目標(biāo)運(yùn)行出現(xiàn)異常時(shí)輸出警報(bào),從而減少系統(tǒng)監(jiān)控、故障排查、性能優(yōu)化等環(huán)節(jié)所需的人工操作,達(dá)到節(jié)約企業(yè)資源的效果。
以某傳統(tǒng)企業(yè)部署的數(shù)字化平臺(tái)為研究對(duì)象,該平臺(tái)搭建了一套分布式軟件用于企業(yè)生產(chǎn)數(shù)據(jù)的信息化,其中包括基于Java 的管理系統(tǒng)、基于Golang 的設(shè)備數(shù)據(jù)采集系統(tǒng)、基于Python 開發(fā)的機(jī)理模型系統(tǒng)等。平臺(tái)涉及了企業(yè)生產(chǎn)數(shù)據(jù)從源頭采集到聚合計(jì)算展示,以及深度學(xué)習(xí)模型開發(fā)等多個(gè)功能,不同模塊之間的數(shù)據(jù)調(diào)用相互依賴。信息化軟件監(jiān)控系統(tǒng)則以該平臺(tái)為監(jiān)控對(duì)象進(jìn)行統(tǒng)一的架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)[2],保證監(jiān)控系統(tǒng)的通用性與可參考性。
在監(jiān)控系統(tǒng)引入之前,該平臺(tái)的運(yùn)行和維護(hù)完全依賴人工,需要等用戶發(fā)現(xiàn)前端頁面狀態(tài)異常再去處理,技術(shù)人員每次都需要去逐個(gè)排查關(guān)聯(lián)系統(tǒng)之間的問題所在點(diǎn)。而軟件監(jiān)控系統(tǒng)的設(shè)計(jì)目標(biāo)恰恰是解決這種多軟件環(huán)境下運(yùn)行和維護(hù)難度大的問題,通過編寫軟件的狀態(tài)采集接口與展示界面,將信息化軟件的運(yùn)行狀態(tài)數(shù)據(jù)進(jìn)行采集和展示,配合告警模塊的警報(bào)輸出,可以達(dá)成提前預(yù)知故障信息的效果。以此為基礎(chǔ),可實(shí)時(shí)自動(dòng)監(jiān)控企業(yè)中各類信息化軟件的運(yùn)行狀態(tài),減少潛在的風(fēng)險(xiǎn)[3]。
由于信息化是一項(xiàng)持續(xù)改造的工作,監(jiān)控系統(tǒng)會(huì)逐步接入更多的軟件應(yīng)用,這將導(dǎo)致監(jiān)控系統(tǒng)的復(fù)雜度和流量逐漸增大。因此,為了應(yīng)對(duì)這一挑戰(zhàn),采用了基于構(gòu)件設(shè)計(jì)的架構(gòu)方法來構(gòu)建監(jiān)控系統(tǒng),將監(jiān)控系統(tǒng)分為多個(gè)構(gòu)件組合運(yùn)行,每個(gè)構(gòu)件可以獨(dú)立運(yùn)行,并通過接口進(jìn)行數(shù)據(jù)交互。根據(jù)流量分布和功能邊界,監(jiān)控系統(tǒng)的構(gòu)件劃分為數(shù)據(jù)采集模塊、數(shù)據(jù)存儲(chǔ)與管理模塊、數(shù)據(jù)展示模塊以及警報(bào)處理模塊。
在該架構(gòu)下,數(shù)據(jù)流量較大的數(shù)據(jù)采集器放置在各個(gè)目標(biāo)程序的服務(wù)器上,可分散監(jiān)控系統(tǒng)壓力,采集系統(tǒng)定時(shí)從各個(gè)目標(biāo)程序的接口采集狀態(tài)數(shù)據(jù),最終經(jīng)過匯總存儲(chǔ)在Prometheus 數(shù)據(jù)庫中。基于Grafana 的數(shù)據(jù)展示模塊和基于AlertManager 的告警模塊由于實(shí)時(shí)流量較小但更面向用戶,所以為了保障可用性,也單獨(dú)作為構(gòu)件與采集/存儲(chǔ)端分開部署。監(jiān)控系統(tǒng)的總體技術(shù)架構(gòu)見圖1。
圖1 技術(shù)架構(gòu)設(shè)計(jì)
2.2.1 數(shù)據(jù)采集模塊
監(jiān)控?cái)?shù)據(jù)的采集方式主要分為推送和拉取。推送模式是指由被監(jiān)控點(diǎn)位主動(dòng)向PushGateway 組件推送狀態(tài)數(shù)據(jù),而Prometheus Server 則定期從Push-Gateway 拉取指標(biāo)數(shù)據(jù);拉取模式是指采集器主動(dòng)去各個(gè)監(jiān)控節(jié)點(diǎn)上直接拉取數(shù)據(jù)。采集方式常見設(shè)計(jì)規(guī)則如下:
1)推送式采集:需要實(shí)時(shí)監(jiān)控的場(chǎng)景;數(shù)據(jù)量較小,但需要快速響應(yīng)的場(chǎng)景;臨時(shí)和批處理作業(yè)數(shù)據(jù)采集的場(chǎng)景。
2)拉取式采集:大量數(shù)據(jù)需要離線處理分析的場(chǎng)景;需要保持?jǐn)?shù)據(jù)完整且快速到達(dá)存儲(chǔ)模塊的場(chǎng)景。
隨著數(shù)字化業(yè)務(wù)的轉(zhuǎn)型和迭代,采集對(duì)象的信息也會(huì)產(chǎn)生變更,因此及時(shí)地維護(hù)監(jiān)控列表也是一項(xiàng)很重要的工作。每當(dāng)監(jiān)控目標(biāo)的信息產(chǎn)生變動(dòng)后,運(yùn)維人員都需要去Prometheus Server 監(jiān)控列表做更新。采集模塊的結(jié)構(gòu)設(shè)計(jì)見圖2。
圖2 數(shù)據(jù)采集模塊結(jié)構(gòu)設(shè)計(jì)
2.2.2 數(shù)據(jù)存儲(chǔ)模塊
在設(shè)計(jì)軟件監(jiān)控系統(tǒng)時(shí),考慮到軟件的狀態(tài)數(shù)據(jù)往往是按照時(shí)間序列進(jìn)行變化且采集頻率較高(對(duì)于監(jiān)控要求較高的可能達(dá)到1 s 一條),例如監(jiān)控應(yīng)用程序的響應(yīng)時(shí)間、程序的接口訪問頻次、存儲(chǔ)系統(tǒng)中磁盤的讀寫次數(shù)[4]等等。由于Prometheus 是開源且生態(tài)較為完善的時(shí)序數(shù)據(jù)庫,因此使用Prometheus 為核心模塊進(jìn)行存儲(chǔ),并實(shí)現(xiàn)了以下功能。數(shù)據(jù)存儲(chǔ)模塊功能結(jié)構(gòu)設(shè)計(jì)參考圖3。
圖3 數(shù)據(jù)存儲(chǔ)模塊結(jié)構(gòu)
1)數(shù)據(jù)存儲(chǔ)/規(guī)則引擎:數(shù)據(jù)存儲(chǔ)默認(rèn)選擇存儲(chǔ)在本地文件系統(tǒng)中,開發(fā)者也可選擇配置遠(yuǎn)程HTTP端口進(jìn)行讀寫,或者自主編寫格式轉(zhuǎn)換器存儲(chǔ)在其他的OLAP 數(shù)據(jù)庫中,轉(zhuǎn)換的方式需要依據(jù)規(guī)則引擎中的配置。
2)目標(biāo)/監(jiān)控/節(jié)點(diǎn)管理:用戶需要管理虛擬機(jī)、應(yīng)用程序或容器等對(duì)象的IP、URL、端口和節(jié)點(diǎn)關(guān)聯(lián)等信息。
3)用戶管理:系統(tǒng)管理員需要根據(jù)用戶工作內(nèi)容分配不同等級(jí)的讀寫權(quán)限。存儲(chǔ)模塊的用戶一般包括管理人員、監(jiān)控人員和運(yùn)維人員等。
4)警報(bào)管理:對(duì)于分布式軟件的集群來說,不同軟件的集群都需要單獨(dú)告警,因此需要進(jìn)行分組且在分組基礎(chǔ)上配置不同的閾值規(guī)則。
5)API 接口:用戶通過存儲(chǔ)系統(tǒng)的接口可對(duì)外開放數(shù)據(jù)查詢和數(shù)據(jù)接入功能。接口配置包括URL、數(shù)據(jù)格式、接口描述等字段。
2.2.3 數(shù)據(jù)展示模塊
Grafana 作為一款開源且成熟的數(shù)據(jù)展示軟件,在軟件開發(fā)者的一定配置下即可投入使用,因此選用Grafana 作為展示模塊的基礎(chǔ),在Grafana 軟件的后臺(tái)上編輯出符合用戶需求的監(jiān)控面板,這樣監(jiān)控系統(tǒng)既可以更快速展示監(jiān)控?cái)?shù)據(jù),又可以減少軟件監(jiān)控系統(tǒng)的開發(fā)量。監(jiān)控系統(tǒng)數(shù)據(jù)展示模塊具有以下功能:
1)數(shù)據(jù)導(dǎo)入/可視化數(shù)據(jù):導(dǎo)入多種數(shù)據(jù)源,包括數(shù)據(jù)庫、文件和API 等,將原始數(shù)據(jù)以圖表、表格、儀表板等形式進(jìn)行展示。
2)自定義報(bào)表/報(bào)表模塊化:用戶利用拖拉拽形式可自主修改報(bào)表樣式,修改完成后的圖表組件可以轉(zhuǎn)化為JSON 在模塊間復(fù)用。
3)實(shí)時(shí)數(shù)據(jù)分析/大屏輪播:數(shù)據(jù)面板以及報(bào)表可根據(jù)刷新頻率的設(shè)置實(shí)時(shí)更新數(shù)據(jù),并且面板可設(shè)置為大屏模式進(jìn)行輪播。
相比于寫代碼的方式編寫前端界面,低代碼操作的技術(shù)要求更低。在數(shù)據(jù)展示模塊中可采用低代碼的方式完成界面的編輯與發(fā)布,簡(jiǎn)化運(yùn)維人員修改監(jiān)控頁面的工作量。數(shù)據(jù)展示模塊功能結(jié)構(gòu)設(shè)計(jì)參考圖4。
圖4 數(shù)據(jù)展示模塊結(jié)構(gòu)設(shè)計(jì)
2.2.4 數(shù)據(jù)告警模塊
告警模塊負(fù)責(zé)異常信息的管理與發(fā)送,運(yùn)維人員可通過告警信息直接定位到問題軟件的IP、并發(fā)狀態(tài)和資源占用等信息,降低系統(tǒng)故障對(duì)業(yè)務(wù)的影響時(shí)長(zhǎng)[5]。
AlertManager 是Prometheus 的一個(gè)開源適配組件,可以負(fù)責(zé)處理和發(fā)送告警通知,當(dāng)Prometheus 收集到的數(shù)據(jù)滿足預(yù)設(shè)的告警規(guī)則時(shí),AlertManager 會(huì)處理并發(fā)送告警信息給指定的接收者,數(shù)據(jù)告警模塊功能結(jié)構(gòu)設(shè)計(jì)參考圖5。
圖5 數(shù)據(jù)告警模塊結(jié)構(gòu)設(shè)計(jì)
最終達(dá)到以下功能效果:
1)規(guī)則配置:規(guī)則指的是警報(bào)出現(xiàn)時(shí)告警系統(tǒng)針對(duì)警報(bào)的處理邏輯,配置方法包含規(guī)則配置文件、調(diào)用系統(tǒng)API 或終端客戶端。
2)監(jiān)控告警:告警系統(tǒng)從Prometheus 中持續(xù)獲取監(jiān)控?cái)?shù)據(jù),當(dāng)發(fā)現(xiàn)數(shù)據(jù)出現(xiàn)異常時(shí),將會(huì)按照告警規(guī)則進(jìn)行判斷并處理。
3)存儲(chǔ)歷史告警:告警記錄默認(rèn)存儲(chǔ)在內(nèi)存中,開發(fā)人員可以借助webhook 方式轉(zhuǎn)發(fā)至關(guān)系型數(shù)據(jù)庫存儲(chǔ)過去發(fā)生的告警記錄。
4)接收者配置:系統(tǒng)支持多種接收者類型,如郵件、短信、IM 軟件等,企業(yè)可以根據(jù)實(shí)際需求配置告警接收者。
5)分組和去重:分組機(jī)制可以將相似性質(zhì)的告警分類為單個(gè)通知,去重功能則有助于減少重復(fù)的告警,提高告警處理的效率。
6)抑制和靜默:抑制和靜默功能用于控制告警通知的發(fā)送。抑制的概念是指如果指定類型警報(bào)已經(jīng)觸發(fā),則抑制其他類型警報(bào)的通知,靜默是一種在給定時(shí)間內(nèi)使警報(bào)靜音的簡(jiǎn)單方法。
7)自動(dòng)化操作:聯(lián)動(dòng)自動(dòng)化工具在報(bào)警之后運(yùn)行一些應(yīng)急的腳本操作。
結(jié)合數(shù)據(jù)采集、存儲(chǔ)、展示和告警模塊的功能,軟件監(jiān)控系統(tǒng)可以實(shí)現(xiàn)信息化軟件的自動(dòng)監(jiān)控與告警,減少企業(yè)中信息化系統(tǒng)的運(yùn)維難度。
通過圖6 所示的監(jiān)控系統(tǒng)展示中心,用戶可觀察到各監(jiān)控目標(biāo)的歷史數(shù)據(jù)與實(shí)時(shí)數(shù)據(jù)。對(duì)于數(shù)字化平臺(tái)一類的分布式部署場(chǎng)景,展示中心可以匯總Java、Python、Mysql 等不同應(yīng)用的指標(biāo)進(jìn)行聚合展示,從而提升運(yùn)維的效率。
圖6 軟件監(jiān)控系統(tǒng)展示中心
通過圖7 中的警報(bào)管理中心,用戶可以查看警報(bào)的統(tǒng)計(jì)數(shù)據(jù)、詳細(xì)的警報(bào)內(nèi)容和管理告警消息模板。當(dāng)監(jiān)控目標(biāo)出現(xiàn)異常時(shí),警報(bào)中心會(huì)解析異常數(shù)據(jù)并填充消息模板,然后將加工后的告警消息發(fā)送給指定接收人。通過系統(tǒng)及時(shí)地發(fā)送告警信息,企業(yè)可以有效避免因軟件故障而導(dǎo)致的資產(chǎn)損失。
圖7 軟件監(jiān)控系統(tǒng)警報(bào)管理中心
隨著《中國制造2025》和 “數(shù)字化轉(zhuǎn)型” 戰(zhàn)略的推動(dòng),我國眾多傳統(tǒng)企業(yè)正在積極地邁向數(shù)字化的新階段,企業(yè)生產(chǎn)經(jīng)營(yíng)活動(dòng)也更加信息化與智能化[6]。軟件監(jiān)控系統(tǒng)旨在提升企業(yè)數(shù)字化轉(zhuǎn)型的軟件運(yùn)維效率,減少轉(zhuǎn)型帶來的成本,主要完成以下工作:
1)在充分調(diào)研的基礎(chǔ)上,對(duì)企業(yè)中常見信息化軟件的維護(hù)方式進(jìn)行了分析;對(duì)軟件監(jiān)控系統(tǒng)所需的關(guān)鍵功能進(jìn)行了深入調(diào)研,包括數(shù)據(jù)采集器選型規(guī)則、Prometheus 數(shù)據(jù)庫選型依據(jù)、展示模塊和告警模塊所需功能等;完成了軟件監(jiān)控系統(tǒng)的總體設(shè)計(jì),包括技術(shù)架構(gòu)設(shè)計(jì)和功能結(jié)構(gòu)設(shè)計(jì)。
2)根據(jù)信息化軟件的數(shù)據(jù)結(jié)構(gòu)和流向,選擇了某企業(yè)內(nèi)的數(shù)字化平臺(tái)作為監(jiān)測(cè)對(duì)象,詳細(xì)設(shè)計(jì)了數(shù)據(jù)采集、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)展示和數(shù)據(jù)告警功能模塊,并進(jìn)行了軟件監(jiān)控系統(tǒng)的開發(fā)和部署。
監(jiān)控系統(tǒng)目前在該企業(yè)的信息化部門運(yùn)維工作中得到了廣泛應(yīng)用,并取得了顯著的成果。通過精準(zhǔn)的數(shù)據(jù)監(jiān)控,運(yùn)維人員能夠及時(shí)發(fā)現(xiàn)和解決潛在的信息化系統(tǒng)問題,提高了工作效率,有效減輕了企業(yè)數(shù)字化轉(zhuǎn)型的負(fù)擔(dān)。