王會 蔡穎 唐志一
摘要:隨著信息技術的快速發展,網絡信息系統需要為越來越多的用戶提供服務,為提高整體性能以及快速迭代升級,當前流行的微服務系統架構通常將一個大的系統劃分為多個業務模塊,業務模塊分別部署在不同機器上,各個業務模塊之間通過接口形式進行交互。伴隨著業務的擴展,對外提供服務的業務模塊越來越多,運維和監控這些業務模塊,追蹤數據流向,變得越來越困難。如何對這些業務模塊的核心指標數據以及數據的生產流轉實現精準有效的監控,是研究智能監控系統的一個重要方面,本文介紹了一種基于埋點技術實現的智能監控系統,從各業務模塊中采集數據,經分析、匯集、檢索、反饋學習后,實現智能預警及數據追蹤溯源。
關鍵詞:埋點;微服務;機器學習;智能預警
1引言
隨著網絡信息化水平的推進,業務擴展帶來的業務復雜度的急劇增加,現有網絡信息系統的部署方式和監控方式都遇到了巨大的挑戰,如何在業務系統出現故障時及時有效地發出預警,以及對數據進行精準分析,找到數據資源流向以及對歷史數據進行追蹤溯源尤為困難。傳統的監控系統通過打印日志形式來記錄運行數據,但存在日志數據記錄不全、監控項擴展困難、日志存儲效率低下、日志分析不足、異常誤報等問題。對于大規模、交互錯綜復雜、深度耦合的網絡信息系統,上述問題尤其嚴重。
此外,傳統的監控系統主要通過配置項進行監控,系統部署運行時,管理員配置告警閾值,系統運行觸發閾值后將告警信息通知到運維人員,然后進行系統排查解除告警的方式進行監控。其中,配置閾值的監控方式,需要為業務核心指標設置一個合理的閾值,閾值的選取有很大的主觀因素,通常情況下是靠經驗得來,另外,根據對業務系統的容錯程度,也會動態調整閾值,無法做到精細化配置;隨著業務的擴展,要監控的指標項越來越多,需要設置的閾值也越來越多,給管理閾值帶來了巨大挑戰,閾值設置不合理在實際的生產環境中導致越來越多的告警誤報。
本文介紹了一種基于埋點技術的日志分析服務架構,結合機器學習,從大型網絡信息系統業務模塊中采集日志數據,實現日志數據的全方位大規模采集,依托機器學習,從日志數據中不斷反饋學習各類數據特征與規律,將學習成果用于分析最新采集到的數據中,檢測出異常數據,從而達到智能預警的效果。通過日志數據,實時計算業務模塊調用關系,分析數據流向,及時將達到告警狀態的業務信息暴露出來,達到異常實時告警。
2系統架構設計
2.1需求
系統旨在對大型分布式系統中各業務模塊健康狀態以及數據流轉進行監控,統計業務模塊操作記錄及訪問情況,記錄業務數據流向及當前狀態,并對數據流向與數據狀態進行學習,提供系統異常告警能力;對業務核心接口訪問頻次進行監控;并支持對業務模塊接口服務狀態進行告警。
2.2總體設計
系統體系架構共分為五層,分別是數據埋點層、數據采集層、數據分析轉換層、反饋學習層、數據應用層,分層結構如圖0 1所示。
(1)數據埋點層
采用約定的日志架構及統一的日志打印規范,采集匯集設備運行、用戶操作、服務運行、業務應用等業務數據以及SQL執行、調用耗時、異常堆棧等運營數據,旨在收集全方位、多角度的網絡信息系統全生命周期的日志數據。
(2)數據采集層
系統運營中因埋點產生的日志信息,采集后通過分布式消息中間件,將采集到的埋點日志數據進行集中存儲。
對采集到的日志數據按數據類型分類,并建立索引,依托分布式流計算能力,實現實時檢索和快速統計分析日志數據的能力,提升日志數據價值。
(3)數據分析轉換層
基于日志分析轉換服務,按照配置設定的規則,監控并過濾日志,對過濾后的日志數據進行匯總,形成實時日志分類。然后構建統一的日志分析服務,實現對日志數據的統一存儲及檢索,日志分析服務支持實時全文索引,支持日志的統計展現。基于此可實現調用鏈分析、最熱數據服務分析、耗時數據服務分析等。
(4)反饋學習層
基于機器學習算法,利用集中存儲的全方位日志數據,不斷進行反饋學習,并將學習成果及時更新存儲到算法庫和規則庫中,以便更好的依據歷史數據,預測業務未來變化趨勢,同時將變化趨勢存儲起來,達到數據越用越智能,由此減少告警的誤報率。
(5)數據應用層
基于采集到的全方位多層次的日志數據,結合機器學習規則庫和算法庫成果,實現對日志數據的挖掘應用,從而提升日志數據的應用價值,依托分布式流計算能力,實現實時告警、智能告警,同時從日志數據中分析數據流向,進行數據追蹤溯源。
3系統主要模塊實現
基于上述設計方案,本系統采用前后端分離的模式進行開發。后端在IntelliJ IDEA集成開發工具進行編碼開發。使用Maven構建工程和管理依賴,Java開發語言,廣泛使用Restful風格的接口格式,使用Spring開源容器進行平臺核心業務處理。前端使用VS CODE集成開發工具進行編碼開發,使用前端框架Vue進行前端界面開發。
系統部署在虛擬機上,使用Jetty 作為 Web 服務器中間件,服務兼容Chrome(谷歌)、Firefox(火狐)等主流瀏覽器。
(1)數據埋點模塊
采用約定的日志架構及統一的日志打印規范,采集匯集設備運行、用戶操作、服務運行、業務應用等業務數據以及SQL執行、調用耗時、異常堆棧等運營數據,旨在收集全方位、多角度的網絡信息系統全生命周期的日志數據。
埋點的三種方式:
1.SDK埋點。SDK埋點(也稱為前端埋點)方式,通常指在APP或Web界面中植入埋點代碼。通過SDK埋點,對用戶在使用過程中的行為事件數據進行采集,能夠采集到用戶大部分的行為數據,比如設備的基本信息,用戶執行的基本操作等。
應用場景:一般在產品運營初級階段,需要快速掌握用戶使用情況,并迭代升級產品以提升用戶體驗。
2.代碼埋點。代碼埋點主要在程序中寫代碼實現,通過觸發某個動作后程序自動發送數據,業務按需將請求信息、返回信息、異常信息及調用信息組織后埋點,通過此埋點可以分析出數據流轉及調用鏈信息。
應用場景:產品功能錯綜復雜,業務推進需要深度挖掘與多位分析。此外,對數據保密性要求高且無法通過SDK埋點方式獲取等場景,也需要代碼埋點進行補充。
3.可視化埋點
可視化埋點把核心代碼和配置、資源分開,通過部署在產品上的基礎代碼對產品的所有交互元素進行解析,并在可視化頁面進行設定,界面啟動時服務端更新配置和資源,用戶產生操作后,根據配置上報相關內容。應用場景:對數據訪問量、點擊量等統計信息敏感的交互場景。選擇哪種埋點方式往往是根據產品形態、發展階段以及預期效果而定。可以前期采用SDK埋點和代碼埋點相結合,后期采用可視化埋點方式進行推進,也可以按需靈活組合。三種埋點方式比對如下表:
基于系統復雜度及應用場景,本文介紹的智能監控系統采用代碼埋點的方式進行實現。
代碼埋點日志格式統一使用輕量級的JSON格式,數據結構如下:
(2)數據采集模塊
系統運營中因埋點產生的日志信息,采集后通過分布式消息中間件,將采集到的埋點日志數據進行集中存儲。
使用Flume統一對埋點數據進行采集上報。利用Flume高可用、高可靠特點對分布式的海量日志進行采集聚合和傳輸。
使用Kafka接收Flume收集的日志,利用Kafka高吞吐量的特點,保證數據不丟失,同時滿足日志離線分析及實時日志處理與聚合。采集過程分如下步驟:
1.采集日志。使用Flume讀取埋點產生的數據。支持按行增量讀取及按時間戳增量讀取的方式,保證服務重啟或中斷恢復后,數據讀取不漏讀不重復讀。
2.傳輸數據。使用Kafka接收Flume收集的日志,基于Kafka特點,當收集數據的速度超過將寫入數據的速度時,也就是當收集信息遇到瓶頸,甚至超過了系統寫入數據的能力時,適當調系統參數,保證能夠在兩者之間提供平穩的過渡,當寫入能力大于讀取能力時,緩沖的數據要及時寫入存儲器。
3.寫入存儲器。將Kakfa埋點數據存儲到集中存儲器中,例如HDFS,HBase。
(3)數據分析轉換模塊
基于日志分析轉換服務,按照配置設定的規則,監控并過濾日志,對過濾后的日志數據進行匯總,形成實時日志分類。然后構建統一的日志分析服務,實現對日志數據的統一存儲及檢索,日志分析服務支持實時全文索引,支持日志的統計展現。基于此可實現調用鏈分析、最熱業務服務分析、耗時業務服務分析等。
1.調用鏈分析。對埋點日志進行實時及聚合分析,按調用鏈唯一標識符進行分組后聚合,分析各模塊之間數據流向、調用次數、調用成功標識、調用耗時等數據,形成完整模塊調用關系及調用情況統計數據。
2.最熱業務服務分析。對埋點日志進行實時分析,按操作名稱分組后聚合,分析一個統計周期內各模塊被調用的次數,取最大的前N條記錄。
3.耗時業務服務分析。對埋點日志進行實時分析,按操作名稱分組后聚合,分析一個統計周期內各業務服務被調用的平均耗時,取最大的前N條記錄,生成耗時服務清單。
(4)反饋學習模塊
基于機器學習算法,利用集中存儲的全方位日志數據,不斷進行反饋學習,并將學習成果及時更新存儲到算法庫和規則庫中,以便更好的依據歷史數據,預測業務未來變化趨勢,同時將變化趨勢存儲起來,達到數據越用越智能,由此減少告警的誤報率。該模塊實際運行時,需要至少一個運行周期(例如一天或一周)后,才能進行反饋學習,具體步驟如下:
1.獲取歷史數據。反饋學習模塊從收集到的日志數據中,對歷史指標數據進行離線分析,經分析后作為輸入參數加以學習。
2.智能學習。反饋學習模塊根據歷史數據,對未來一個運行周期內(例如一天或一周)的指標數據情況(取分布值或期望值)進行預測,并通過機器學習算法對檢測算法模型所需的參數進行更新。
3.更新數據。反饋學習模塊將經學習得到的對未來的預測結果,存儲到未來預測數據庫中,并更新檢測算法模型參數,將數據存儲到模型參數數據庫中,以此實現告警的智能配置,達到智能監控的目的。
(5)數據運用模塊
基于采集到的全方位多層次的日志數據,結合機器學習規則庫和算法庫成果,實現對日志數據的挖掘應用,從而提升日志數據的應用價值,依托分布式流計算能力,實現實時告警、智能告警,同時從日志數據中分析數據流向,進行數據追蹤溯源。
1.負載告警。對埋點日志進行實時分析,在一個統計周期內,按操作名稱分組后進行聚合統計,分析各業務模塊被調用的次數,當調用次數超過配置的閾值時給出告警信息。
2.耗時告警。對埋點日志進行實時分析,在一個統計周期內,按操作名稱分組后進行聚合統計,分析各業務模塊被調用的平均耗時,當調用耗時超過配置的閾值時給出告警信息。
3.失敗率告警。對埋點日志進行實時分析,在一個統計周期內,按操作名稱分組后進行聚合統計,分析各業務模塊被調用的失敗次數與總次數的比例,當調用失敗率超過配置的閾值時給出告警信息。
4結論
不同于傳統的通過打印日志形式來記錄運行數據的監控系統,本文介紹了一種基于埋點技術實現的智能監控系統,解決傳統監控系統存在的日志數據記錄不全、監控項擴展困難、日志存儲效率低下、日志分析不足、異常誤報等問題。本文深入探討了基于埋點的定制化日志服務架構,實現日志數據的全方位采集、高效率存儲及快速檢索。使用Flume統一對日志數據進行采集上報。利用Flume高可用、高可靠特點對分布式的海量日志進行采集聚合和傳輸。使用Kafka接收Flume收集的日志,利用Kafka高吞吐量的特點,保證數據不丟失,同時滿足日志離線分析及實時日志處理與聚合。依托機器學習,從日志數據中不斷反饋學習各類數據特征與規律,將學習成果用于分析最新采集到的數據中,檢測出異常數據,從而達到智能預警的效果。此外,通過對日志數據進行實時計算、離線分析等,可進一步實現對日志數據的挖掘應用,從而提升日志數據的應用價值。
參考文獻:
[1]宋智宇.商業銀行智能監控系統的設計與實現[M].電子工業出版社,2010.
[2]陸曉燕,魏暉.網絡運維智能化,開啟運維新價值[J].通信世界,2015(21):43.
[3]張晶,黃小鋒.一種基于微服務的應用框架[J].計算機系統應用,2016,25(9):265-270.
[4]蔣勇.基于微服務架構的基礎設施設計[J].軟件,2016,37(5):93-97.
[5]金剛,鄭志榮.面向云計算環境的安全服務平臺[J].指揮信息系統與技術,2016,7(6):81-86
[6]丁乙,李榮寬,汪敏,等.面向軍用微服務的服務網格架構研究與設計[J].指揮信息系統與技術,2020,11(1):18-23.
[7]陳奡,謝俊杰,趙梅,等.基于機器學習的軍事裝備知識分類方法[J].指揮信息系統與技術,2020,11(4):34-39.
作者簡介:王會(1988.10-),男,漢族,安徽宿州人,中國電子科技集團公司第二十八研究所,軟件開發工程師,研究方向:基于微服務架構的敏捷開發。
(中國電子科技集團第二十八研究所 江蘇南京 210001)