大概是全網介紹監控最全面的文章了

在億萬服務、海量數據的今天,對於互聯網服務的要求就是三高,高併發、高性能、高可用。為了實現“三高”,程序員們可真是使盡渾身解數,在技術架構上使用微服務架構,在部署方式上使用Docker、Kubernetes,在彈性擴容方面使用雲計算等等。而今天要給大家介紹的便是應用監控體系。監控就像應用的跟屁蟲一樣,走到哪跟到哪,做了什麼全知道並記錄下來,通過監控體系的搭建,當應用有問題時可以快速“回放”應用軌跡,找到原因,長遠來說,還可以預測故障的發生,提前避免。

那麼一個應用體系是怎麼樣的呢?用戶通過在PC或智能終端(手機)通過瀏覽器或APP對應用發起請求,請求通過網絡傳輸到業務系統,業務系統的函數通過應用框架、中間件運行起來,運行系統又依託於操作系統,操作系統需要網絡設備如網卡等與外界建立通訊,而這全套軟件都是安裝在硬件之上,如服務器、網卡等硬件設備都是安裝在機房中。因此對一個應用體系的全棧監控就包含APP監控、瀏覽器監控、服務器監控、網絡監控、日誌監控、基礎設施監控、物理環境監控。


APP監控

目前APP的主流操作系統有Android、IOS,因此每個APP開發時都會有兩個版本,APP的開發流程是研發根據產品需求進行功能的開發,開發完成後打對應的Android包、IOS包在安卓應用商店、蘋果應用商品進行上線。因此對於APP的監控是通過打包時將探針安裝在對應的應用包裡,形成正式包對外發布。

當用戶手機下載了APP後,在使用APP的各個功能時,整個的行為軌跡也被探針記錄下來了。探針會採集兩類數據,用戶數據和APP運行數據,用戶數據包括設備所在的地域、城市、設備的操作系統、使用時長、使用次數,運行數據包括APP運行網絡情況、卡頓情況、緩慢情況。獲取到用戶數據和運行數據後就可以運營分析和運維監控了,瞭解開發的APP用戶日活、訪問區域、訪問版本等,幫助產品運營同學進行產品的優化迭代提供意見;通過運維數據可以知道用戶打開APP是否白屏、是否卡頓、是否緩慢、是否網絡被運營商劫持,從而幫助研發人員快速解決問題,提高用戶留存率。


瀏覽器監控

對於瀏覽器的監控,起源於早期互聯網時代,購物、購票、辦公等都是在PC端進行,隨著移動互聯網的興起,逐步的被弱化,但是卻是不可缺少的,因此瀏覽器監控也是監控體系中不可缺少的一環節。瀏覽器監控體系也是包含三部分,探針採集數據發送後端、後端處理數據給到前端、前端呈現給用戶。

探針的實現取決於應用如何運行,對於瀏覽器應用來說,主要是前端基於HTML/CSS、JavaScript進行開發,用戶在瀏覽器輸入URL,首先在本地進行緩存查詢是否有該地址對應的IP地址,如果沒有則再使用DNS進行域名解析,找到提供服務的地址,其次再對該地址進行TCP三次握手連接,發送請求獲取請求數據,獲取到數據後進行數據解析,包括HTML文檔解析、DOM構建、頁面渲染,最後呈現給到可視化頁面用戶。

因此瀏覽器探針是一段JS代碼,通過瀏覽器的加載事件、導航事件等獲取頁面訪問的數據,比如瀏覽器基本信息、採集頁面性能數據、採集Ajax性能數據和請求響應數據、JS錯誤數據、頁面追蹤數據等,再發送給到後臺處理加工,形成用戶運營數據(比如頁面PV、運營商信息、瀏覽器信息、訪問城市省會信息)、運維數據(比如Ajax錯誤信息、JS緩慢頁面信息),幫助運營瞭解產品用戶情況,更好的推廣營銷、幫助研發運維團隊解決產品生產環境中的功能性能問題。


服務器監控

對於服務器監控主要是監控後端系統的運行情況,因Java、Python、PHP、.Net/.NetCore、C/C++、Golang等語言都可以開發後端應用,因此服務器探針也包含各種語言的探針。從這八種開發語言的特性來看,有的語言是編譯型,即將源代碼翻譯成機器碼後才能運行,例如Golang,C/C++;有的語言是解釋型,邊執行邊翻譯,例如PHP、Python;有的語言是混合型,介於編譯型和解釋型之間,即把代碼編譯成中間碼再在語言提供的平臺運行,例如Java、.Net/.NetCore。因此不同類型語言的探針實現也不一樣。

對於解釋型語言來說,使用HookApi的方式實現,例如Python在運行過程中會需要調用框架和函數,因此Python探針針對各個框架各數據庫需要專門定義Hook函數,探針啟動時會將我們寫好的Hook函數(針對WEB框架,WSGI,數據庫等)加入sys_meta_path中,這樣用戶函數在執行後就會先執行我們定義好的Hook函數,採集數據;對於編譯型語言來說,使用SDK的方式實現,總體的思路和HookAPI一致,差別在於SDK是完全封裝好的內容;對於混合型語言來說,使用Agent的方式實現,比如Java探針在JavaSE的Instrumention上做開發,在Java代碼編譯的時候進行了代碼注入,Java探針依附在Java進程裡,不會創建新的進程,而是創建多個線程來採集和彙總數據,如下圖所示 用戶的類A.class通過ClassLoader裝載進JVM時會調用Javaagent嵌入監控代碼生成A'.class,當有用戶請求進來時,Engine會找到A'.class執行正常的業務邏輯,邏輯執行完畢後Engine會將監控Data寫入監控數據緩存區(即一次採集週期),並且每隔60s會向Server發送數據,清理緩存區。

大概是全網介紹監控最全面的文章了


探針採集了應用運行函數的時間運行軌跡、調用數據庫、第三方服務、消息中間件、下一個業務系統的時長和調用語句,經過後端處理分析,呈現給用戶應用調用全鏈路拓撲圖、函數執行堆棧、函數響應時間和調用次數、慢/錯SQL語句、慢外部調用語句,幫助研發人員瞭解整體業務運行情況,快速定位分析後端錯誤、優化應用性能。


網絡監控

對於網絡監控,主要是獲取應用運行過程中的網絡情況定位數據傳輸過程中的網絡問題。實現方式是探針安裝用戶的數據中心,通過將流經交換機的流量拷貝出來(即旁路鏡像),解析網絡協議(如TCP、SNMP)獲取數據,然後將數據發送給後端進行處理分析,最後在前端呈現給用戶。用戶通過網絡監控可獲取網絡流量、吞吐量、帶寬利用率、丟包率、包連接情況、連接嘗試情況、建鏈時間、網絡傳輸時間、URL頁面耗時、SQL執行耗時等,快速定位網絡問題、帶寬問題,優化網絡使用情況。這種方式最大的好處就是對用戶業務沒有入侵,因為是將流量完全拷貝出來再做分析處理,通常銀行、金融等對業務可用性要求極高的行業會使用此類監控方式。


日誌監控

日誌即服務的運行軌跡,所有的服務在運行中都會產生日誌,主要有主機日誌、網絡設備日誌、應用日誌、中間件日誌、數據庫日誌等五種類型。日誌監控的實現邏輯是通過日誌探針、上傳日誌、對接MQ隊列接口獲取數據源,再給到後臺處理分析,最後在前端呈現。用戶可在前端根據業務出現問題的時間範圍來獲取該段時間內的日誌,也可以輸入關鍵字進行搜索日誌,通過日誌可瞭解應用的原生運行情況,幫助研發人員快速定位問題。日誌平臺最重要的兩個能力是存儲大量數據、快速搜索能力,對於搜索來說一般採用Eleasearch大數據來提供數據的存儲和搜索功能。


基礎設施監控

基礎設施包括物理機房、服務器、網絡設備、中間件、數據庫、存儲、虛擬化等,對於基礎設施的監控則包含該機房運行環境的溫度溼度、服務器的CPU內存磁盤網絡、數據庫的數據庫類型、版本、字符集、IP端口、狀態、安裝路徑和數據庫大小等。對於非物理機房類型的實現邏輯是通過各種協議(SNMP、WMI、Telnet、SSH、IPMI、JMX、JDBC、Agent等)對各種原始數據進行採集,再通過協議解析數據,後臺處理加工,前臺呈現給到用戶;對於物理機房的實現邏輯是通過API接口調用服務器的數據。運維人員通過基礎設施監控,便能全景瞭解整個業務物理情況,當機房斷電或服務器CPU內存指標異常時,通過升級硬件的方式便能解決問題。

通過上述各類監控平臺的介紹,相信你對監控產品的類別、監控的使用與價值、實現原理已經清晰了吧。對於研發人員來說,選對了監控產品,在業務運行過程中便能事半功倍,大幅度提高開發效率;對於運維人員來說,選對了合適的監控產品,在業務運維過程中也更能保障業務的正常運行,提高用戶滿意度;對於想入門監控的同學來說,每一個方向的監控原理和用戶價值都很清晰了,結合自己興趣,選擇最適合自己的運維監控領域即可。


分享到:


相關文章: