文/馬永 吳躍 何李囡 程航
Prometheus是一套開源的系統(tǒng)監(jiān)控報警解決框架,它源于SoundCloud公司的開源監(jiān)控告警解決方案。作為新一代的云原生監(jiān)控系統(tǒng),擁有易管理性、高效、良好可視化等優(yōu)點(diǎn),旨在為集團(tuán)內(nèi)部提供更成熟的監(jiān)控與告警服務(wù)。
國網(wǎng)安徽公司各信息系統(tǒng)自上線至今已穩(wěn)定運(yùn)行多年,得益于國網(wǎng)公司統(tǒng)推的I6000監(jiān)控平臺、性能監(jiān)測等,主機(jī)、中間件、網(wǎng)絡(luò)等方面得到了有效的監(jiān)控。但隨著國網(wǎng)安徽公司承載業(yè)務(wù)量的增加以及系統(tǒng)規(guī)模的擴(kuò)大,對于容器層級、業(yè)務(wù)層級以及內(nèi)部資源對象上的監(jiān)控和問題排查變得越發(fā)復(fù)雜和困難。
針對該情況,我們結(jié)合運(yùn)維場景,提出了基于Prometheus監(jiān)控工具的全鏈路監(jiān)控、告警,搭載Grafana軟件統(tǒng)一展示的解決方案。
與傳統(tǒng)監(jiān)控相比,電力企業(yè)級系統(tǒng)監(jiān)控面臨著許多難點(diǎn):
(1)監(jiān)控資源對象動態(tài)可變,無法進(jìn)行預(yù)先配置;
(2)涉及系統(tǒng)多、監(jiān)控范圍繁雜,各類監(jiān)控融合難度大;
(3)各個實(shí)例間的調(diào)用關(guān)系復(fù)雜,故障排查更困難。
在工程角度也面臨著不少考驗(yàn),監(jiān)控系統(tǒng)必須要保證可靠性,同時監(jiān)控數(shù)據(jù)也要保證有備份機(jī)制;監(jiān)控系統(tǒng)必須支持快速部署及水平擴(kuò)容,這既是云原生的基本要求,也符合企業(yè)系統(tǒng)容器化演進(jìn)的實(shí)際情況。
監(jiān)控的諸多問題讓選型變得非常慎重,經(jīng)過調(diào)研和部署測試,決定采用開源監(jiān)控方案Prometheus。其具有以下優(yōu)勢:
(1)靈活的數(shù)據(jù)模型。在Prometheus里,監(jiān)控數(shù)據(jù)是由值、時間戳和標(biāo)簽表組成的;同時Prometheus支持在監(jiān)控數(shù)據(jù)采集階段對監(jiān)控數(shù)據(jù)的標(biāo)簽表進(jìn)行修改,這使其具備強(qiáng)大的擴(kuò)展能力。
(2)更契合的架構(gòu)。采用Kubernetes作為容器編排工具,支持Prometheus無縫部署和擴(kuò)展。
(3)Prometheus提供有數(shù)據(jù)查詢語言PromQL。大部分情況下都可以直接通過PromQL從Prometheus里查詢到需要的聚合數(shù)據(jù),便于快速獲取監(jiān)控數(shù)據(jù)。
(4)豐富的組件支持。Prometheus監(jiān)控主體是Prometheus Operator。除此以外,Prometheus方案加入了多種組件滿足Kubernetes的監(jiān)控場景,極大地豐富了Prometheus方案的功能。
(5)成熟的社區(qū)。Prometheus擁有成熟的開源社區(qū),有豐富的參考文檔,便于快速的搭建監(jiān)控系統(tǒng)。
監(jiān)控系統(tǒng)需要能夠有效的了解其實(shí)際運(yùn)行狀態(tài),通過對監(jiān)控指標(biāo)的觀察能夠預(yù)判可能出現(xiàn)的問題,從而對潛在的不確定因素進(jìn)行優(yōu)化。通過建立完善的監(jiān)控體系,從而達(dá)到以下目的:
監(jiān)控數(shù)據(jù)獲?。褐芷谛缘膹膶?shí)例中獲取監(jiān)控樣本,并保存到基于本地磁盤實(shí)現(xiàn)的時間序列數(shù)據(jù)庫中。
告警:當(dāng)系統(tǒng)出現(xiàn)或者即將出現(xiàn)故障時,監(jiān)控系統(tǒng)需要迅速反應(yīng)并通知管理員,從而能夠?qū)栴}進(jìn)行快速的處理或提前預(yù)防問題的發(fā)生,避免出現(xiàn)對業(yè)務(wù)的影響。
故障分析與定位:當(dāng)問題發(fā)生后,需要對問題進(jìn)行調(diào)查和處理。通過對不同監(jiān)控指標(biāo)以及歷史數(shù)據(jù)的分析,能夠找到并解決根源問題。
數(shù)據(jù)可視化:通過Grafana可視化工具能夠直接展示獲取的系統(tǒng)運(yùn)行狀態(tài)、資源使用情況、以及服務(wù)運(yùn)行狀態(tài)等直觀的信息。
國網(wǎng)安徽公司Prometheus監(jiān)控的物理架構(gòu),具體包括數(shù)據(jù)采集模塊、數(shù)據(jù)存儲模塊、告警上報模塊、數(shù)據(jù)可視化模塊四大模塊。
主要采用Prometheus擴(kuò)展組件Nodeexporter采集底層服務(wù)器的各種運(yùn)行參數(shù),如CPU、內(nèi)存使用率,主機(jī)運(yùn)行時長,分區(qū)使用率,網(wǎng)絡(luò)狀態(tài),數(shù)據(jù)IO吞吐量等信息。
為數(shù)據(jù)的可視化呈現(xiàn)提供有效的數(shù)據(jù)支持,需要對采集到的數(shù)據(jù)進(jìn)行存儲,Prometheus將采集到的監(jiān)控數(shù)據(jù)按照時間序列的方式存儲在本地磁盤當(dāng)中。
當(dāng)出現(xiàn)異常情況時,Prometheus首先推送單條異常告警,如果異常情況大于1條,會同時觸發(fā)過濾規(guī)則,此時Prometheus會將所有的告警合并成一條Json數(shù)據(jù)推送出來。根據(jù)這一特點(diǎn),Prometheus可以有效減少告警數(shù)量。
采用Grafana可視化工具,提供面向集群級的數(shù)據(jù)展示服務(wù),圖標(biāo)可定制化,兼容多種數(shù)據(jù)源,便于用戶監(jiān)控管理。
Prometheus作為一個基于指標(biāo)的監(jiān)控系統(tǒng),在設(shè)計(jì)上放棄了一部分?jǐn)?shù)據(jù)準(zhǔn)確性。比如在兩次采樣的間隔中,內(nèi)存用量有一個瞬時小尖峰,那么此時小尖峰是觀察不到的。
放棄一點(diǎn)準(zhǔn)確性得到的是更高的可靠性,這里的可靠性體現(xiàn)為架構(gòu)簡單、數(shù)據(jù)簡單、運(yùn)維簡單。比如ELK或其它日志架構(gòu),日志系統(tǒng)想要穩(wěn)定需要付出多倍的硬件成本與人力成本。
Prometheus本身可以由另一個Prometheus進(jìn)行監(jiān)控。按照官方部署的Prometheus單實(shí)例做好自身監(jiān)控。因此建議在生產(chǎn)環(huán)境上,要確保至少有兩個獨(dú)立的Prometheus實(shí)例做交叉監(jiān)控。
另一個點(diǎn)是警報系統(tǒng)(Alertmanager),Prometheus可以監(jiān)控到警報系統(tǒng)出現(xiàn)了問題,但是因?yàn)榫瘓蠊δ墚惓?,所以警報無法正常發(fā)出。這個問題可以通過給警報系統(tǒng)做HA來應(yīng)對。
Prometheus里50%以上的存儲空間和80%以上的計(jì)算資源(CPU、內(nèi)存)都是被兩三個維度超高的指標(biāo)用掉。而且這類指標(biāo)由于數(shù)據(jù)量很大,時間久了就會導(dǎo)致Prometheus實(shí)例出問題。有效的解決辦法是用警報規(guī)則找出維度過高的指標(biāo),然后在Scrape配置里Drop掉導(dǎo)致維度過高的label。
監(jiān)控的核心目標(biāo)是保障業(yè)務(wù)系統(tǒng)穩(wěn)定。追求“監(jiān)控的覆蓋率”,所有系統(tǒng)所有層面要有指標(biāo),太多監(jiān)控項(xiàng)讓Prometheus負(fù)載加重;追求“警報的覆蓋率”,事無巨細(xì)必須要有警報,最后“告警風(fēng)暴”讓大家都對警報產(chǎn)生疲勞。
監(jiān)控的目標(biāo)絕對不是為了達(dá)到多少個指標(biāo),多少條警報規(guī)則,不要為監(jiān)控系統(tǒng)的功能或覆蓋面負(fù)責(zé),而要為整個系統(tǒng)的業(yè)務(wù)穩(wěn)定性負(fù)責(zé)。
主機(jī)資源對象監(jiān)控主要依賴Prometheus實(shí)現(xiàn),既適用于面向服務(wù)器等硬件指標(biāo)的監(jiān)控,也適用于高動態(tài)的面向服務(wù)架構(gòu)的監(jiān)控。但容器監(jiān)測上還有所欠缺,如需做到監(jiān)控的立體化,cAdvisor是專門用來分析運(yùn)行中的Docker容器的資源占用以及性能特性的工具,能夠收集、聚集、處理并導(dǎo)出運(yùn)行中容器的信息。
Prometheus不支持日志監(jiān)控及分布式追蹤等功能,加入ELK實(shí)用化日志平臺,進(jìn)行日志監(jiān)控,對服務(wù)器操作系統(tǒng)、數(shù)據(jù)庫、中間件、應(yīng)用程序等文件型日志采集和集中展示。
IPMItool是一個遠(yuǎn)程管理方案。它能夠用于IPMI接口管理和配置,支持本地操作和遠(yuǎn)端操作,支持智能平臺接口管理,可以獨(dú)立于服務(wù)器的CPU、內(nèi)存、存儲、電源而工作。
IPMI是一個開放的標(biāo)準(zhǔn)、監(jiān)控、記錄、回收,庫存和硬件實(shí)現(xiàn)獨(dú)立于主CPU、BIOS以及操作系統(tǒng)的控制權(quán)。服務(wù)處理器的背后是平臺管理的大腦,其主要目的是處理自主傳感器監(jiān)控和事件記錄功能。
IPMItool提供了一個簡單的命令行接口(BMC)。它具有讀取傳感器數(shù)據(jù)存儲庫(SDR)和打印傳感器值,顯示系統(tǒng)事件日志內(nèi)容的功能。IPMItool工具的應(yīng)用,使信息運(yùn)維可以做到遠(yuǎn)程主機(jī)電源的開關(guān)、重啟,服務(wù)器硬件告警的自動發(fā)送,大大節(jié)約了現(xiàn)場運(yùn)維人力的投入。
安徽公司信通公司運(yùn)檢中心的全體開發(fā)人員,為了實(shí)現(xiàn)當(dāng)前一個微服務(wù)的應(yīng)用指標(biāo),采用了Prometheus對開源監(jiān)控進(jìn)行指標(biāo)采集與分析,并在國網(wǎng)公司和網(wǎng)省公司各領(lǐng)導(dǎo)的正確帶領(lǐng)下,厲兵秣馬、夯實(shí)基礎(chǔ),為建設(shè)國際一流電網(wǎng)、世界一流企業(yè),落實(shí)“一強(qiáng)三優(yōu)”的現(xiàn)代化公司的企業(yè)戰(zhàn)略努力前行。對于此項(xiàng)實(shí)例,可以描述微服務(wù)監(jiān)控解決的主流程,能夠有效地提高監(jiān)控預(yù)警系統(tǒng)可靠性?;赑rometheus則需要使用多臺服務(wù)器拉取標(biāo)簽,分別存儲,同時根據(jù)Gossip機(jī)制去完成過濾、去噪等操作。在此過程中,由于迭代速度較快,如果需要有自動化服務(wù)發(fā)現(xiàn)(如Consul)配置來替代當(dāng)前的手動配置。