在億萬服務、海量資料的今天,對於網際網路服務的要求就是三高,高併發、高效能、高可用。為了實現“三高”,程式設計師們可真是使盡渾身解數,在技術架構上使用微服務架構,在部署方式上使用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記憶體指標異常時,通過升級硬體的方式便能解決問題。
通過上述各類監控平臺的介紹,相信你對監控產品的類別、監控的使用與價值、實現原理已經清晰了吧。對於研發人員來說,選對了監控產品,在業務執行過程中便能事半功倍,大幅度提高開發效率;對於運維人員來說,選對了合適的監控產品,在業務運維過程中也更能保障業務的正常執行,提高使用者滿意度;對於想入門監控的同學來說,每一個方向的監控原理和使用者價值都很清晰了,結合自己興趣,選擇最適合自己的運維監控領域即可。