摘要:介紹宜信智能運維平臺UAVStack的設計思想、技術架構和核心功能,及落地實踐經驗。前端
內容來源:宜信技術學院第6期技術沙龍-線上直播|宜信智能監控平臺建設實踐ios
主講人:宜信高級架構師 & 智能監控平臺負責人謝知求git
目前業界經常使用的監控軟件有不少,主流產品或以監控深度見長、或以監控廣度見長。github
這些產品各有優點,也存在不足之處:web
爲了克服上述不足,同時知足公司多樣化和智能化的監控需求、下降二研的成本和難度,咱們自主研發了全維監控與智能運維基礎平臺(UAVStack)。算法
做爲智能監控平臺,監控僅僅是智能化運維的第一環。咱們認爲,智能運維(AIOps)能夠分三步走:全維監控、全維關聯和全維智能。數據庫
使用UAV的全維監控和應用性能管理工具集能夠搭建一站式全維度監控+應用運維解決方案。瀏覽器
首先,UAV在每一個物理機、虛擬機以及容器上部署一個監控代理程序(MonitorAgent,MA)。MA其實是部署在宿主機上的獨立JVM進程。緩存
其次,在每一個JEE中間件、JSE應用或其餘JVM語言應用中,可經過Java Agent的形式植入監控探針,監控探針會與應用在同一個JVM進程中一塊兒啓動。安全
監控探針啓動時,會自動對應用進行畫像和監控。應用畫像包括服務組件、客戶端組件和日誌組件的畫像。
除對以上三類組件進行自動畫像和實時數據採集外,監控探針也會記錄每一個請求/響應生成端到端的調用鏈路,繪製各個應用/服務之間的調用關係,並生成服務圖譜。
監控代理程序(MA進程)會定時拉取監控探針採集的數據,同時也會採集應用環境的性能指標(如CPU、內存、磁盤IO等)。此外,MA還提供了插件機制,支持個性化指標的採集。
最終,咱們採集到了包括指標Metrics、調用鏈Tracing及日誌Logging的全維度監控數據。其中:
UAV採集側主要包括監控Agent和監控探針兩部分。
上圖所示是監控探針的架構圖。隨着UAV功能的加強,探針已不只僅用於監控目的,如今已經更名爲中間件加強框架。
上圖左邊能夠看到,中間件加強框架位於應用服務器和應用之間,採用了中間件劫持技術,對應用服務器的代碼進行了類加載劫持和字節碼改寫,對上層應用代碼無侵入。
右邊是監控探針放大以後的架構圖,最底層是應用服務器適配層,對互聯網經常使用的開源中間件(如Tomcat、Jetty、SpringBoot)提供了適配支持,對其它服務器能夠相應地擴展一個Adapter適配器來進行支持。
在適配層之上,首先提供了一系列通用的擴展點SPI,再基於這些SPI,擴展出了與監控相關的畫像收集和指標採集功能;與問題診斷分析工具相關的調用鏈跟蹤、瀏覽器跟蹤、JVM線程分析、堆內存dump執行等功能;與服務治理相關的服務限流/降級以及服務安全管控等功能。此外,還提供了這些功能對Docker和K8s容器環境的適配。
最上層提供了應用對接API以及數據發佈API,支持經過HTTP和JMX兩種方式來獲取探針上的監控數據。
接下來將介紹UAV數據捕獲和傳輸的架構。
從上圖能夠看到,監控代理程序Agent數據傳輸採用了雙通道+雙心跳的方式:
1)雙通道是指HTTP心跳和MQ傳輸這兩條通道:
2)雙心跳是指無論來自Http通道仍是MQ通道的數據,實際上既能夠當作監控數據,也能夠當作心跳數據。來自每一個通道的數據都會到UAV監控後臺服務「簽到」。兩種通訊方式意味着更高的可靠性。
Agent經過雙通道的方式,將數據傳輸到UAV監控後臺,咱們稱之爲健康管理服務。
健康管理服務會根據數據類型對監控數據進行解析處理,並分別持久化到合適的數據源,好比OpenTSDB存儲時序指標數據;ES存儲日誌、調用鏈、JVM線程分析等APM數據。
AppHub是UAV的統一門戶,提供了監控數據的集中展現及用戶權限的管理功能。用戶能夠在PC端和移動端登陸UAV,得到隨時隨地的運維體驗。
健康管理服務也是採用微服務架構構建的,包括多個微服務,支持集羣部署和擴容。
上圖展現了目前UAVStack的核心功能,主要包括:應用監控、應用環境監控、服務流、調用鏈、JVM監控、數據庫監控、日誌監控、性能告警、瀏覽器跟蹤、配置中心、時空沙盤、上帝羅盤、服務治理、容器生態支持、業務監控、智能運維(AIOps)等。其中:
此外,還包括圖上未列出的一些運營支持的相關工具,如UAV統一升級中心;UAV監控日報、週報、月報;UAV使用狀況統計等。本次分享將重點介紹上圖中白色字樣的功能。
首先介紹UAV應用監控的核心原理。
UAV應用監控的核心原理是:對應用代碼無侵入技術。
UAV的代號是「無人機」的縮寫,寓意:無人機翱翔藍天,智能地、透明地完成任務。
其中用到的核心技術主要包括:
監控探針經過中間件劫持技術實現對應用/服務的自動畫像和監控。
以應用/服務畫像爲例:
與應用/服務畫像相似,應用/服務監控也是在加載服務器相關類時,經過字節碼改寫植入相應的監控代碼。
以Tomcat爲例:
上圖所示是應用監控的一個實際展現界面。
能夠從應用集羣的展現界面,鑽取到應用實例的監控展現界面,再鑽取到自動畫像出來的服務組件/客戶端組件和日誌組件的展現界面,最後再鑽取到服務組件/客戶端組件的每一個URI的監控指標界面以及日誌展現界面。能夠從全局鑽取到細節,獲取想看的監控數據。
此外,咱們還提供了服務URL監控報表和客戶端URL監控報表。
以服務URL監控報表爲例:
如上圖,點擊查看某個URL的詳情,能夠查看該URL在不一樣時間區間的詳細報表。
接下來介紹服務流相關的功能。基於應用/服務畫像和監控數據,UAV提供了服務流的功能。服務流涵蓋了應用拓撲的內容,但提供了比應用拓撲更豐富的運行時狀態的展現。
從上圖能夠看到,當前服務位於中間位置,左邊是調用當前服務的服務,右邊是當前服務調用的其它第三方服務。
在服務流圖上,連線的粗細表示調用量;連線的顏色表明健康情況,以響應時間和錯誤數爲參考:綠色表明健康、黃色表明警告、紅色表明嚴重。好比當連線爲粗紅線時,表明着有大量請求發生了錯誤。
如圖,咱們能夠從全局的服務流鑽取到某個業務線的服務流,再鑽取到該業務線下某個應用集羣/實例的服務流,進行全局範圍的性能追蹤。
調用鏈分爲輕調用鏈、重調用鏈和方法級調用鏈。
上圖展現的是一個調用鏈具體的生成流程。調用鏈節點主要是在服務接口代碼處和客戶端調用代碼處生成。若是開啓了方法級調用鏈,也會在過程方法代碼處生成調用鏈節點。
此外,介紹一下關於調用鏈上下文的傳遞。
服務內上下文的傳遞:同線程的狀況下使用了基本ThreadLocal;跨線程(池)的狀況下使用了可傳遞ThreadLocal(TTL)。
服務間上下文的傳遞:經過客戶端劫持(client hook)對原協議(如HTTP,RPC,MQ)進行適配,並在協議頭注入調用鏈上下文的元數據。傳輸到下一個服務接口的時候,會由下一個服務解析協議頭裏的調用鏈上下文元數據,從新構建調用鏈上下文,而後再繼續往下傳遞。
調用鏈的實現主要使用了4個關鍵技術。
這是調用鏈的實際展現界面。在調用鏈列表上,
開啓了重調用鏈的狀況下,咱們能夠查看請求/響應報文的詳細數據。
上圖中能夠看到,開啓了重調用鏈的狀況下,咱們能夠獲取到請求頭信息、請求內容、響應頭信息、響應內容等詳細數據。
上圖所示是UAV日誌功能的架構圖。UAV日誌功能採用了日誌管理系統流行的EKK架構,包括日誌的採集、上送Kafka、ES存儲/查詢、RAID歷史備份/下載以及基於異常/關鍵字和時間的統計和告警功能。
應用服務器上的Agent採集、讀取日誌,並把讀取到的數據發送到Kafka集羣上。
日誌的統計和告警功能:由logging-statistics程序從Kafka讀取異常、關鍵字、Nginx日誌,並以分鐘爲單位統計數量,保存到Redis中,供後續統計展現和告警。
具體日誌展現界面在介紹調用鏈關聯到日誌部分已出現過了,這裏就不贅述了。
UAV獲取到全維度的服務端指標集、客戶端指標集、日誌指標集和自定義指標以後,能夠設置多指標聯合告警條件,這些條件包括流式/同比/環比的條件(「同比」好比今天10點和昨天10點的對比;「環比」好比最近5分鐘和上一個5分鐘的對比),能夠混合使用構成聯合表達式。
爲避免告警轟炸,UAV提供了2種告警收斂策略:時間冷卻收斂和梯度收斂。梯度收斂策略上,咱們配置了「1」「5」「10」,即第1次、第5次、第10次知足告警條件時纔會發送告警提醒,其餘時間則進行壓制處理,不發送告警提醒。
告警可經過短信、郵件、微信及移動App推送通知到人,也能夠經過HTTP方式通知其餘系統。
建立預警策略時,可使用預警策略模板。上圖是系統裏的預警策略模板截圖。
選定策略類型以後,預警策略的規則和條件會根據咱們缺省推薦的套餐自動設置,用戶只要配置須要報警的目標範圍和通知方式,直接保存就能夠了。也能夠調整模板套餐裏的閾值和報警表達式。此外,告警也支持運行時動態啓用和禁用。
JVM監控分析工具基於UAVStack已有總體架構,如上圖所示。總體分爲前端、後臺及探針MOF部分。
其中在探針部分:
上圖是JVM監控分析工具的監控功能展現頁面。JVM監控分析工具的功能主要包括:
區別於傳統的數據庫端的監控,UAV的數據庫監控採用新的視角,從應用端切入分析,彌補了現有數據庫端監控的不足,增長了數據庫-應用的關聯分析能力。
數據庫監控目前已實現的功能包括:數據庫鏈接池監控、SQL分類統計、慢SQL統計、慢SQL耗時分佈統計、慢SQL追蹤以及與調用鏈/日誌關聯。
慢SQL的監控功能主要包括慢SQL統計+慢SQL追蹤。對慢SQL的監控,能夠自主設定閾值,界定多慢纔算是慢SQL。用戶能夠按具體應用和它操做的數據庫實例來設置,高於設置閾值的SQL操做才計入慢SQL。
在開啓調用鏈/日誌歸集的狀況下, 慢SQL操做可關聯至對應的調用鏈以及日誌,幫助咱們診斷和定位問題。
上圖是數據庫監控功能的慢SQL統計報表,展現了某段時間以內慢SQL的計數狀況。慢SQL分類統計根據SQL類型,包括I-插入、D-刪除、U-更新、Q-查詢、B-批量操做,對慢SQL進行分類統計。
圖中下方兩個報表中,一個是數據庫鏈接池監控,能夠查看鏈接池總鏈接數、活動鏈接數以及空閒鏈接數;另外一個是SQL分類統計,能夠根據SQL類型來分類統計。
經過某外購催收系統的數據庫監控案例來講明數據庫監控的使用方法。
催收系統在查詢催收歷史時,統計記錄數的count(*)語句,由於執行計劃異常,執行效率低,佔用了大量資源,致使數據庫服務器CPU資源耗盡,進而系統不可用。從圖上能夠看到,故障期間的慢SQL數目明顯變大,慢SQL具體爲count(*)語句。
上圖能夠查看到慢SQL的詳細SQL語句,得知故障期間的鏈接池資源被耗盡,活動鏈接數達到峯值,而空閒鏈接數爲0;SQL分類統計圖表也顯示故障期間查詢錯誤SQL數量明顯變大。
經過慢SQL追蹤界面,能夠查看故障期間的慢SQL列表,發現執行時間長的三條SQL全是count(*)語句。
每一條慢SQL的執行結果及SQL語句均可以與調用鏈關聯。繼續點擊,查看慢SQL詳情及與調用鏈關聯,均顯示了count(*)語句執行時間長,且執行錯誤。經過慢SQL的執行與調用鏈、日誌的關聯,能夠輔助定位和分析故障問題。
對容器生態上的支持是指UAV以上全部功能都能在容器雲平臺上無縫遷移和使用。在容器環境下,監控Agent和應用分別在不一樣的容器中,須要作一些適配工做,主要體如今應用畫像/監控數據的採集、進程畫像/監控數據的採集、日誌採集路徑的適配上。
UAV以上全部功能都能在容器雲平臺上的無縫遷移和使用,因此從UI上看不出來和VM有何區別,僅在應用環境監控界面上有些不一樣。上圖截取了Kubernetes環境下的應用環境監控界面,能夠看到一個物理主機上有10個主機進程、17個容器、28個在容器裏的進程。
應用環境監控能夠顯示容器和進程的對應關係。可點擊分別查看容器性能指標和進程性能指標。
在容器或進程的屬性列表裏,新增了K8S相關的屬性展現。這是在容器雲環境下,咱們能夠從應用環境監控UI中看到和VM環境下的些許差別。而對於其它功能(如調用鏈、日誌監控、數據庫監控,等等)而言,界面在容器環境下和VM環境下是沒有任何區別的,用戶感受不到差別。
爲了彌補監控廣度上的不足,UAV目前提供了指標採集插件,支持已有的Open-Falcon的指標採集插件(相似Prometheus的exporter),也支持UAV自定義插件,使UAV監控能力可靈活擴展到對幾乎全部經常使用的互聯網中間件的監控,如MySQL、Redis、Kafka、RocketMQ、MongoDB、ElasticSearch等。
上圖展現了UAV對Kafka、RocketMQ、Redis指標的監控曲線。
宜信公司業務大多跨多個業務線和多個系統,爲在IT層面能夠快速定位問題系統,在業務層面上也能夠給出受影響或波及的具體業務單據和客戶範圍,解決業務/運營人員的痛點,UAV提供了一套通用的業務鏈路監控與告警接入平臺。
如圖所示,該平臺包括異構業務日誌歸集、數據上送、數據切分、過濾、聚合計算等功能,以後能夠將結果持久化,提供業務報表大屏展現,也能夠根據結果告警,生成業務工單。
實施過程當中,各業務組先在應用中埋點具備業務涵義的日誌,而後自助配置和維護對業務日誌的解析邏輯、具體的告警策略和告警消息模板內容,從而能夠快速搭建針對自身業務的鏈路監控系統。
這套業務監控系統的優點在於:
這是一個業務告警的具體例子。
上方是發給業務同事的告警郵件,內容能夠細化到X年X月X日X:X:X,在X個系統的X個業務環節,發生了X問題,影響了X類型的客戶,客戶姓名是X,手機號是X。幫助業務運營人員快速定位問題單據和受影響的客戶。
下方是發給技術運維同事的郵件,在業務同事郵件的基礎上,額外提供了IT調用鏈路,方便技術運維同事快速定位和診斷問題。
目前UAV在AIOps智能運維上的工程實踐主要包括異常檢測,根因分析,告警收斂和智能降噪,以及任務機器人HIT這4個方面。本次分享將重點介紹指標異常檢測和根因分析兩部分。
上圖是UAV工程實踐中使用的較流行的時間序列異常檢測框架。主要包括離線模型優化、在線模型預測、A/B TEST部分。其中,離線模型優化和在線模型預測造成了指標異常檢測的智能監控閉環。具體流程如圖所示,其中要點包括:
按照全維監控->全維關聯->全維智能的技術路線,UAV採集到了多維度的監控數據後,須要創建起這些數據以前的關聯。
這種關聯關係:
須要說明的是,金融行業自己的業務特色決定了對第三方存在依賴性,所以告警的隨機性較大,客觀上致使學習樣本的質量不高。所以,UAV目前使用強關聯關係。
有了關聯關係,就能夠作根因分析了。咱們能夠收集各個渠道的告警,先經過告警過濾將其中重複的告警和不重要的告警過濾掉,再根據關聯分析創建同一時間窗口內不一樣類型告警之間的關聯,能夠按畫像創建關聯,也能夠按調用鏈路創建關聯。而後是權重計算,根據預先設置的各種告警的權重,計算成爲根源告警的可能性。最後將權重最大的告警標記爲根源告警。此外,還能夠根據歷史告警處理知識庫,找到相似根源告警的推薦解決方案。
在根因分析和定位的過程當中,順帶實現了告警收斂和智能降噪。好比咱們對重複告警、非根源的通常告警、同一條鏈路的其它告警進行了壓制。
上圖爲線上實際的宜信核心業務線調用關係的圖譜。UAV做爲宜信的公司級智能監控標準軟件,已持續覆蓋到宜信全部關鍵業務系統,支持公司超過300個業務線。愈來愈多的同事能夠熟練地使用UAV,將UAV應用於平常運維、事前預警、事中問題診斷和過後覆盤分析等各個方面。
使用UAV,能夠得到隨時隨地的運維體驗。目前UAVStack監控部分已在GitHub上開源,能夠登陸查看更多詳細介紹。