? ? ? ? 商業(yè)版的性能監(jiān)控平臺確實強大,但是對于很多初創(chuàng)公司來說,一般不會選擇昂貴的商業(yè)監(jiān)控平臺,更多的是選用開源的監(jiān)控系統(tǒng),比如Zabbix。但是無論多么強大的開源監(jiān)控平臺,基本都不能滿足所有的監(jiān)控需求,比如沒有APM監(jiān)控,不方便監(jiān)控mysql、Postgresql等數(shù)據(jù)庫,所以集成化開發(fā)是一種可行的選項,只要做好前期技術(shù)選型,選好要被集成的監(jiān)控工具,我們就可以邁出第一步。
由于一直對Telegraf + Influxdb +?Grafana有比較多的實踐經(jīng)驗,并且這種監(jiān)控組合已經(jīng)被很多人大量的采用,原因是輕量化、部署快捷、自由配置監(jiān)控面板、豐富的圖形化展現(xiàn),最最重要一點是Telegraf能配置出多達幾十種監(jiān)控模型(并且Telegraf的監(jiān)控插件還在不斷擴展中),提供一下官網(wǎng)的Telegraf監(jiān)控配置說明:https://github.com/influxdata/telegraf/tree/release-1.9/plugins/inputs,細看就能發(fā)現(xiàn)其對大量監(jiān)控指標的支持(包括支持docker的監(jiān)控)。除了Telegraf,結(jié)合Jmxtrans還可以對所有Java服務(wù)進行全面的監(jiān)控(參考我的另一篇文章https://blog.csdn.net/smooth00/article/details/90399528),如果需要有APM監(jiān)控,那選用Skywalking是最明智的,原因是它具有良好的擴展性,并且還在不斷演繹和發(fā)展中,只要解決好數(shù)據(jù)存儲的問題,就可以被我們所用(關(guān)于這塊可以參考我的文章https://blog.csdn.net/smooth00/article/details/96479544)。
以下是我根據(jù)這些設(shè)想編制的架構(gòu)圖,整體來說已經(jīng)按照這個圖在一步步的實現(xiàn):
? ? ? ?由于是集成的,所以平臺的整體性能將取決于Influxdb、Grafana、Skywalking本身的性能,但開源技術(shù)的好處就是可以無限擴展,Influxdb和Skywalking都支持高可用的集群化部署,想做多大的生意就看你愿意裝多大的門店了。另外監(jiān)控平臺的數(shù)據(jù)傳輸性能,也會受制于推拉模式原理的限制,如下圖所示:
? ? ? ?這兩種模式的的特點如下:
推模式(Push):是指由監(jiān)控客戶端主動將監(jiān)控數(shù)據(jù)推送給監(jiān)控服務(wù)器。Push模式的實時性和數(shù)據(jù)一致性較好,但是效率較低。Push操作的頻率一般由設(shè)定好的時間間隔觸發(fā),一旦時間間隔設(shè)置不當,可能會造成丟失監(jiān)控數(shù)據(jù)的現(xiàn)象,或者是推送的數(shù)據(jù)過多,前者影響了監(jiān)控系統(tǒng)的準確性,而后者則增加了通信開銷。
拉模式(Pull):是指由監(jiān)控服務(wù)器端采用輪詢的方式通知客戶端,將被請求的監(jiān)控數(shù)據(jù)項發(fā)送給服務(wù)器端。Pull模式的針對性強,能夠滿足個性化需求,并可以減少通信開銷,但是一致性和實時性一般。如果輪詢的次數(shù)頻繁,以及需要輪詢的客戶端較多,則服務(wù)器端的壓力就會變大。
毫無疑問的是我們所采用的telegraf + influxdb;jmxtrans + influxdb;skywalking 三個監(jiān)控都是基于推模式(Push),好處就是實時性和數(shù)據(jù)一致性好,適合于在壓測時的監(jiān)控(這也是為什么我采用它們來集成到監(jiān)控平臺,因為本人就是個性能測試工程師,關(guān)注的當然是監(jiān)控的準確性和實效性)。但是這樣很可能就不太適用于大批量服務(wù)器部署情況下的運維監(jiān)控了,因為推模式需要在大量客戶端中配置數(shù)據(jù)發(fā)送的時間間隔,這本身會很麻煩,時間設(shè)小了通信開銷太大,數(shù)據(jù)庫的寫入壓力過大,時間設(shè)大了可能又不滿足監(jiān)控的個性需求;相對來說拉模式適合于運維監(jiān)控,因為運維監(jiān)控都是7*24小時監(jiān)控,時間粒度不大基本上不用頻繁輪詢,通信開銷可控,數(shù)據(jù)庫的寫入壓力較小,監(jiān)控平臺的穩(wěn)定性自然就高。所以以上的架構(gòu)設(shè)計,對于運維性監(jiān)控可能不夠滿足,在實踐中還需要加入通過遠程來配置各個監(jiān)控代理的Push時間間隔的功能,這就加大了操作的麻煩度。從開源集成來說,如果要采用拉模式(Pull),通過Prometheus +exporter的模式(與傳統(tǒng)的數(shù)據(jù)采集組件不同的是,exporter并不向中央服務(wù)器發(fā)送數(shù)據(jù),而是等待中央服務(wù)器主動前來抓?。┛梢詫崿F(xiàn)。不過從安裝部署來看,面對大量不同類exporter組件的部署和配置,不少人還是會心生恐懼,所以集成telegraf + influxdb的方式雖然不是最好的選擇,但就眼下來說,卻是最經(jīng)濟的選擇(不過網(wǎng)上有人愿意基于Prometheus開發(fā)自已的exporter,能駕馭就是好,開發(fā)自己的監(jiān)控平臺無需排斥任何一種開源技術(shù))。
另外以上架構(gòu)還有個有問題是不好解決的,那就是如何管理監(jiān)控的報警。作為監(jiān)控平臺的核心功能之一,報警和預(yù)警無疑是衡量監(jiān)控平臺好壞的點。Grafana本身可以配置報警功能,但這種報警是被動式的(就是dashboards中查詢到的值超過了閥值才觸發(fā)報警),談不上好,但至少能用,可是專業(yè)性有點強,一般人還配不明白;另外就是Skywalking也有告警模塊,功能不直觀,需要在application.yml配置文件中配(配置參考官網(wǎng)說明),支持通過webhooks來發(fā)送notify、go-wechat、mail??吹竭@,我們也明白了,報警功能差異化大根本集成不到一塊,對于易用性和擴展性上來說,這塊暫時無解,除非能介入到數(shù)據(jù)層,獨立開發(fā)出一套分析報警的功能,那這個工作量就大大超過了原來的預(yù)計,失去了集成平臺的意義了。
說了這么多,也展示一下集成后的界面效果:
1、監(jiān)控模型管理
? ? ? ?通過上傳監(jiān)控模板?(監(jiān)控代理的配置文件+使用說明),自動集成到telegraf、jmxtrans、skywalking agent的包中生成zip壓縮文件,以提供下載,由于下載的包中已經(jīng)帶有配好的配置文件和啟動腳本及初始化配置文件的腳本。所以在遠程啟動監(jiān)控代理時,就會自動配置好,并開啟監(jiān)控進程(好處當然就是增強了易用性,因為一般人是配不明白這些配置文件的)。
? ? ? ?創(chuàng)建監(jiān)控包來說最大的工作量還在于使用大量批處理腳本,就以Windws下創(chuàng)建Telegraf服務(wù)來說,需要調(diào)用SetACL修改注冊表權(quán)限(以便WMI能遠程調(diào)用服務(wù)),需要以最高權(quán)限注冊服務(wù),所以腳本就很復(fù)雜,如下所示:



2、監(jiān)控節(jié)點管理
? ? ? ?首先就是新增或修改節(jié)點,把需要監(jiān)控的節(jié)點信息配置好,而這些配置信息將會作為同步到監(jiān)控代理配置文件的依據(jù):
? ? ? ?然后在節(jié)點管理界面,點擊啟用或配置,相關(guān)的IP、端口、節(jié)點名稱等信息就會自動通過遠程執(zhí)行腳本的方式,替換到監(jiān)控代理的配置文件中,并完成代理的啟動。
? ? ? ? ? ?啟動完后,通過監(jiān)控【視圖】(配置了動態(tài)router實現(xiàn)鏈接)可以看到監(jiān)控的結(jié)果(Grafana面板示例):
以下為Skywalking監(jiān)控面板示例(Skywalking UI做了Router和數(shù)據(jù)過濾改造,只顯示當前節(jié)點的監(jiān)控數(shù)據(jù)):
再放一張炫酷一點的,這就是Skywalking的魅力:
3、監(jiān)控數(shù)據(jù)管理
? ? ? ?這塊還沒開發(fā),思路就是通過Java連接influxdb、ES、Mysql,對監(jiān)控的數(shù)據(jù)進行清理,比如監(jiān)控節(jié)點刪除后,相關(guān)的關(guān)聯(lián)數(shù)據(jù)可以做個刪除操作,或者修改influxdb的數(shù)據(jù)保留策略(例如保留最近2天的數(shù)據(jù))。
4、Vue Router配置
? ? ? ?由于涉及鏈接到grafana(不同類型的監(jiān)控配置了不同的面板)和Skywalking UI,所以需要配置Router。主要有兩種方式,一種是菜單的形式調(diào)用。比如菜單的URL配置為http://${skywalking}/和http://${grafana}/d/PGoagxIWk/postgresql-server?orgId=1,在${skywalking}和${grafana}作為參數(shù)變量進行替換,節(jié)選代碼如下:

另一種是以iframe的形式,動態(tài)的調(diào)用Router:

5、一鍵啟動
? ? ? 為什么要集成,除了方便使用,還有個原因當然是為了方便部署,無論是在linux下,還是windows下,都要求無障礙部署。
(1)要求平臺的前端niginx要自動安裝部署,自動修改配置文件,自動將dist頁面文件拷入到html目錄;windows自帶有7zip解壓zip安裝文件的組件。
(2)后端以jar服務(wù)啟動,windows下要求以JavaService.exe創(chuàng)建widnows服務(wù)并自啟動,另外windows下啟動服務(wù)要通過vbs等操作獲取管理員權(quán)限啟動。
(3)管理平臺的數(shù)據(jù)庫環(huán)境以mysql或postgresql?,做成一鍵部署(可以將帶初始化數(shù)據(jù)的庫文件一起打入安裝包,這樣再次安裝解壓數(shù)據(jù)庫時就不需要導(dǎo)入初始數(shù)據(jù)了),linux下是tar.gz的二進制安裝文件,windows下是zip綠色包文件。
(4)influxdb和grafana也是一鍵部署,基于官網(wǎng)的tar.gz或zip包解壓運行,可以先將初始數(shù)據(jù)打入安裝包中。
(5)skywalking官網(wǎng)的集成包,就帶有一鍵啟動,只需要做少量改動,將ES或tcp h2的啟動也加入到一鍵啟動中(需要加個端口啟動判斷,必須等數(shù)據(jù)庫端口啟動后,再啟動OAP服務(wù),否則OAP服務(wù)啟動后會再次關(guān)閉)。
(6)有了一鍵啟動,還要有一鍵殺進程及卸載服務(wù)的功能。并且要避免重復(fù)啟動進程。
? ? ? ?雖然可以按以上要求做成一鍵啟動監(jiān)控平臺,但還算不上真正的一鍵部署,除非加入配置的一步步輸入提示,自動安裝JRE及環(huán)境變量等基礎(chǔ)環(huán)境,但這樣一來安裝包的大小將很大,對于集成系統(tǒng)來說,這是很難理想化的,畢竟各個模塊也都推薦分布式部署,非要做成單機版一鍵安裝,有點本末倒置。
未完待續(xù)......(后續(xù)涉及到監(jiān)控數(shù)據(jù)管理功能的開發(fā),和整合所有監(jiān)控節(jié)點的健康狀態(tài)展示,由于工作量較大,還沒能力在短期內(nèi)落實)