前言
為了保證應用的可靠執行,需要對系統建立完善的應用監控,實時獲取應用資訊和執行狀態。在之前的文章裡,我們通過介紹MOF中的CaptureFramework框架和InterceptFramework框架,分別闡述了應用實時資料和畫像資料的採集方法。
然而僅僅採集是不夠的,還需要對應用資料進行歸集和處理,並提供相應的資訊儲存和查詢能力。
在UAVStack中,應用資料的歸集功能通過MA來實現。MA可以定時抓取MOF中的實時資訊,自動發現Tomcat、MSCP、JavaSE中的資訊,並通過資料分析得出監控資訊,通過RocketMQ將歸集後的資料傳送到HM進行儲存,並提供查詢功能。
MA架構
在介紹應用資料歸集之前,首先介紹監控代理程式MonitorAgent。
MonitorAgent是在應用外獨立執行的MSCP程式,提供資料採集功能、節點容器控制功能以及應用資料歸集功能。MonitorAgent的架構如圖所示:
MonitorAgent具有以下特點:
- 每個host machine只有一個監控代理程式程式。作為心跳客戶端,MA提供host心跳資訊和當前節點容器控制功能,歸集容器與程式的資訊,使得當前host能夠被HM發現和控制。
- MA被設定為守護程式,掛掉後可自重啟。
- MA負責抓取並歸集當前host上所有應用的監控資料,包括從MOF定時抓取的資料和第三方推送的資料。
MonitorAgent應用資料歸集的啟動過程如下:
- 啟動AppServerMonitorDetector例項,查詢執行在宿主機系統和容器中所有的JVM程式,呼叫指定的MonitorDataCatchWork來獲取抓取實時資料。
- 建立AppServerProfileDataCatchWorker例項並開啟一個執行緒採集profile資料。
- 啟動MDFListener來接收第三方推送的應用資料進行歸集。
- 啟動MonitorDataProcessor用於計算增量資料。
應用資料歸集
MOF裡的DataObserver提供了JMX和HTTP兩種模式來暴露應用資料,供AppServerMonitorDetector進行採集。AppServerMonitorDetector的層次結構如下圖所示:
AppServerMonitorDetector:定時任務,用於註冊、管理Detector並定時執行。如果執行時效能損耗過高,AppServerMonitorDetector會進行自殺,然後註冊並執行JVMLocalOSDetector和JVMContainerOSDetector。
OSDetector:用於自動發現JVM程式並指定DataCatchWorker歸集程式的應用資訊,包括JVMLocalOSDetector和JVMContainerOSDetector兩種。
JVMLocalOSDetector:用於自動發現執行宿主機系統上的所有JVM程式。首先通過JVM工具掃描本地作業系統上所有JVM程式的資訊,根據程式ID判斷是否需要指定新的DataCatchWorker。
如果需要,則利用JVM systemProperties中的uav.engine.vendor欄位判斷當前應用型別,並利用JVM程式資訊生成特定的JMXMonitorDataCatchWorker例項,將DataCatchWorker的JVMAccessURL欄位設定為JMX_CONNECTOR_ADDRESS。MonitorDataCatchWorker可以利用JVMAccessURL以JMX的方式歸集該JVM程式產生的實時資料。
JVMContainerOSDetector:用於自動發現容器(Docker)中的JVM程式。容器通過namespace對執行環境進行了隔離,因此Detector通過Http方式獲取容器內部的JVM程式資訊。JVMContainerOSDetector首先通過掃描找到所有安裝了MOF的Docker程式,通過ping來判斷容器是否包含JVM程式。
如果發現JVM程式,則再次通過Http請求JVM程式的SystemProperties資訊,生成新的HttpMonitorDataCatchWorker例項,並與程式的url和UAV_MOF_ROOT拼接成JVMAccessURL。MonitorDataCatchWorker可以利用JVMAccessURL以Http方式對該JVM程式的應用資料進行歸集。
MonitorDataCatchWorker:用於歸集程式內的應用資料。DataCatchWorker會依據不同的服務型別(AppServer、MSCP、JSE)以JMX或Http方式採集應用資料並進行處理。
以歸集AppServer和MSCP應用資訊的JMXAppServerMonitorDataCatchWorker為例,DataCatchWorker通過JMXConnector和jmxurl連線MOF上的MBeanServer,採集MOF暴露的MBean,建立MonitorDataFrame(MDF)和ProfileMonitorDataFrame(PMDF)用於儲存MBean中的實時資訊和畫像資訊,並利用MonitorDataProcessor計算實時資訊的增量資料。歸集到的應用資訊在PublishHandler上通過RocketMQ傳送給HM進行儲存。
歸集的畫像資料包含以下資訊:
- 應用服務的基本資訊,包括系統資訊和所在容器的資訊。
- 應用服務內部的元件,包括服務元件、客戶端元件、日誌元件等。
- 應用服務的呼叫關係(溯源資訊)。
歸集的實時資料包含以下資訊:
- JEE服務,MSCP服務端採集應用叢集、應用例項、以及特定URL的響應時間、載入計數、錯誤計數等。
- JSE服務會採集JVM狀態,包括Heap使用、GC計數、執行緒計數、CPU、class計數等資料。
- 客戶端採集客戶端的訪問計數、響應時間、錯誤計數等資料。
MDFListenServer的執行機制則較為簡單,指定了IP與埠,以Http的形式接收第三方推送的MDF資訊,將其傳送到MonitorDataPublishHandler進行傳送。
應用資料儲存
HM包含畫像資料服務和實時資料服務,負責消費並儲存RocketMQ中的應用資料。HealthManager在啟動時註冊DataMessageHandler,負責處理MQ收到的資訊。MonitorDataMessageHandler會將收到的實時資料儲存到Redis中並設定過期時間,歷史資料會通過Http方式儲存於OpenTSDB中。
同時,實時資料服務還會將監控資料重新傳送至RocketMQ中,該資料最終會被實時預警服務進一步消費,用以計算預警資訊。ProfileDataMessageHandler會將收到的畫像儲存到Redis中,並開啟定時任務,清理未定時更新的畫像資訊。歷史畫像資料過期後會以文件的形式通過MongoDBClient儲存於MongoDB中。
整個應用資訊採集和儲存的流程如圖所示:
應用資料的展示
HM對外暴露查詢介面,支援對5分鐘內的應用資料和歷史應用資料進行查詢。UAV APPHUB利用查詢介面提供以下功能:
1.應用叢集資訊
通過上帝之眼→應用監控可以瞭解應用叢集及叢集下所有應用的相關資訊。HM中的定時元件HealthManagerProfileDataLifeKeeper會定時檢查應用例項畫像資料的狀態。
如果畫像資料在指定時間內未更新,HM會將應用例項設定為瀕死狀態;如果超過指定時間兩倍後畫像資料仍未更新,HM會將應用例項設定為死亡狀態;超過指定時間三倍後,HM會在快取中清除該應用例項的畫像資訊並不予顯示。
2.應用例項資訊
應用可以分為JEE應用、MSCP應用和JSE應用。在應用叢集中點選應用例項,可以獲取例項的詳細資訊,包括:
-
應用例項效能:顯示應用的實時資料。其中,
JEE應用和MSCP應用的實時資料包括:
- 訪問計數:總計數、錯誤計數、警告計數。
- 響應時間:最長響應時間、最短響應時間、平均響應時間。
- 響應程式碼計數:RC+HTTP響應碼,如RC200表示HTTP響應碼是200。
JSE應用的實時資料包括:
- TPM:每分鐘新啟執行緒數。
- HPM:每分鐘Heap變化。
-
應用例項元件(畫像資訊)包括:
- 服務資訊:包含服務元件、客戶端元件、日誌元件等。
- 應用執行環境:包括應用的執行伺服器、容器資訊、程式資訊。
- 應用例項工具:支援呼叫鏈跟蹤、瀏覽器跟蹤、執行緒分析。
3.元件例項資訊
點選應用例項的元件,可以獲取應用元件的詳情資訊。服務元件和客戶端的指標包括訪問計數、響應時間和錯誤計數。點選日誌元件則進入應用日誌搜尋介面。
4.服務圖譜
點選應用叢集的詳情按鈕,可以檢視應用例項的服務圖譜。服務圖譜不僅可以視覺化展示應用/服務之間的呼叫關係,描述服務與服務的靜態拓撲和執行時特性的圖譜;還能夠對存在問題的服務或呼叫關係進行標註。
在服務圖譜中點選各元件,可以獲得元件的例項資訊。點選元件之間相連的呼叫關係,可以獲得應用服務作為客戶端對URL的呼叫狀況,服務圖譜會針對存在問題的元件或呼叫關係(如響應時間過長)進行提示。
5.時空沙盤
通過上帝之眼→時空沙盤可以查詢應用例項和容器元件的歷史資料。
總結
UAVStack的應用資料歸集功能已在宜信公司內部廣泛使用,是具備較高可用性和可靠性的分散式服務。運維人員可以通過APPHUB獲取應用畫像資料和實時資料,瞭解應用執行狀況,定位系統的執行問題,是保障系統可靠執行的強力助手。
UAVStack已在Github上開放原始碼,並提供了安裝部署、架構說明和使用者指南等雙語文件,歡迎訪問-給星-拉取~~~
掃一掃下方二維碼,關注一個不會讓你失望的公眾號