前言git
爲了保證應用的可靠運行,須要對系統創建完善的應用監控,實時獲取應用信息和運行狀態。在以前的文章裏,咱們經過介紹MOF中的CaptureFramework框架和InterceptFramework框架,分別闡述了應用實時數據和畫像數據的採集方法。github
然而僅僅採集是不夠的,還須要對應用數據進行歸集和處理,並提供相應的信息存儲和查詢能力。瀏覽器
在UAVStack中,應用數據的歸集功能經過MA來實現。MA能夠定時抓取MOF中的實時信息,自動發現Tomcat、MSCP、JavaSE中的信息,並經過數據分析得出監控信息,經過RocketMQ將歸集後的數據發送到HM進行存儲,並提供查詢功能。緩存
MA架構服務器
在介紹應用數據歸集以前,首先介紹監控代理程序MonitorAgent。架構
MonitorAgent是在應用外獨立運行的MSCP程序,提供數據採集功能、節點容器控制功能以及應用數據歸集功能。MonitorAgent的架構如圖所示:框架
MonitorAgent具備如下特色:運維
MonitorAgent應用數據歸集的啓動過程以下:分佈式
應用數據歸集工具
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進行存儲。
歸集的畫像數據包含如下信息:
歸集的實時數據包含如下信息:
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應用的實時數據包括:
JSE應用的實時數據包括:
應用實例組件(畫像信息)包括:
3.組件實例信息
點擊應用實例的組件,能夠獲取應用組件的詳情信息。服務組件和客戶端的指標包括訪問計數、響應時間和錯誤計數。點擊日誌組件則進入應用日誌搜索界面。
4.服務圖譜
點擊應用集羣的詳情按鈕,能夠查看應用實例的服務圖譜。服務圖譜不只能夠可視化展現應用/服務之間的調用關係,描述服務與服務的靜態拓撲和運行時特性的圖譜;還可以對存在問題的服務或調用關係進行標註。
在服務圖譜中點擊各組件,能夠得到組件的實例信息。點擊組件之間相連的調用關係,能夠得到應用服務做爲客戶端對URL的調用情況,服務圖譜會針對存在問題的組件或調用關係(如響應時間過長)進行提示。
5.時空沙盤
經過上帝之眼→時空沙盤能夠查詢應用實例和容器組件的歷史數據。
總結
UAVStack的應用數據歸集功能已在宜信公司內部普遍使用,是具有較高可用性和可靠性的分佈式服務。運維人員能夠經過APPHUB獲取應用畫像數據和實時數據,瞭解應用運行情況,定位系統的運行問題,是保障系統可靠運行的強力助手。
UAVStack已在Github上開放源碼,並提供了安裝部署、架構說明和用戶指南等雙語文檔,歡迎訪問-給星-拉取~~~
掃一掃下方二維碼,關注一個不會讓你失望的公衆號