在億萬服務(wù)、海量數(shù)據(jù)的今天,對于互聯(lián)網(wǎng)服務(wù)的要求就是三高,高并發(fā)、高性能、高可用。為了實現(xiàn)“三高”,程序員們可真是使盡渾身解數(shù),在技術(shù)架構(gòu)上使用微服務(wù)架構(gòu),在部署方式上使用Docker、Kubernetes,在彈性擴容方面使用云計算等等。而今天要給大家介紹的便是應(yīng)用監(jiān)控體系。監(jiān)控就像應(yīng)用的跟屁蟲一樣,走到哪跟到哪,做了什么全知道并記錄下來,通過監(jiān)控體系的搭建,當(dāng)應(yīng)用有問題時可以快速“回放”應(yīng)用軌跡,找到原因,長遠來說,還可以預(yù)測故障的發(fā)生,提前避免。
那么一個應(yīng)用體系是怎么樣的呢?用戶通過在PC或智能終端(手機)通過瀏覽器或App對應(yīng)用發(fā)起請求,請求通過網(wǎng)絡(luò)傳輸?shù)綐I(yè)務(wù)系統(tǒng),業(yè)務(wù)系統(tǒng)的函數(shù)通過應(yīng)用框架、中間件運行起來,運行系統(tǒng)又依托于操作系統(tǒng),操作系統(tǒng)需要網(wǎng)絡(luò)設(shè)備如網(wǎng)卡等與外界建立通訊,而這全套軟件都是安裝在硬件之上,如服務(wù)器、網(wǎng)卡等硬件設(shè)備都是安裝在機房中。因此對一個應(yīng)用體系的全棧監(jiān)控就包含APP監(jiān)控、瀏覽器監(jiān)控、服務(wù)器監(jiān)控、網(wǎng)絡(luò)監(jiān)控、日志監(jiān)控、基礎(chǔ)設(shè)施監(jiān)控、物理環(huán)境監(jiān)控。
APP監(jiān)控
目前APP的主流操作系統(tǒng)有Android、IOS,因此每個APP開發(fā)時都會有兩個版本,APP的開發(fā)流程是研發(fā)根據(jù)產(chǎn)品需求進行功能的開發(fā),開發(fā)完成后打?qū)?yīng)的Android包、IOS包在安卓應(yīng)用商店、蘋果應(yīng)用商品進行上線。因此對于APP的監(jiān)控是通過打包時將探針安裝在對應(yīng)的應(yīng)用包里,形成正式包對外發(fā)布。
當(dāng)用戶手機下載了APP后,在使用APP的各個功能時,整個的行為軌跡也被探針記錄下來了。探針會采集兩類數(shù)據(jù),用戶數(shù)據(jù)和APP運行數(shù)據(jù),用戶數(shù)據(jù)包括設(shè)備所在的地域、城市、設(shè)備的操作系統(tǒng)、使用時長、使用次數(shù),運行數(shù)據(jù)包括APP運行網(wǎng)絡(luò)情況、卡頓情況、緩慢情況。獲取到用戶數(shù)據(jù)和運行數(shù)據(jù)后就可以運營分析和運維監(jiān)控了,了解開發(fā)的APP用戶日活、訪問區(qū)域、訪問版本等,幫助產(chǎn)品運營同學(xué)進行產(chǎn)品的優(yōu)化迭代提供意見;通過運維數(shù)據(jù)可以知道用戶打開APP是否白屏、是否卡頓、是否緩慢、是否網(wǎng)絡(luò)被運營商劫持,從而幫助研發(fā)人員快速解決問題,提高用戶留存率。
瀏覽器監(jiān)控
對于瀏覽器的監(jiān)控,起源于早期互聯(lián)網(wǎng)時代,購物、購票、辦公等都是在PC端進行,隨著移動互聯(lián)網(wǎng)的興起,逐步的被弱化,但是卻是不可缺少的,因此瀏覽器監(jiān)控也是監(jiān)控體系中不可缺少的一環(huán)節(jié)。瀏覽器監(jiān)控體系也是包含三部分,探針采集數(shù)據(jù)發(fā)送后端、后端處理數(shù)據(jù)給到前端、前端呈現(xiàn)給用戶。
探針的實現(xiàn)取決于應(yīng)用如何運行,對于瀏覽器應(yīng)用來說,主要是前端基于html/css、JAVAScript進行開發(fā),用戶在瀏覽器輸入URL,首先在本地進行緩存查詢是否有該地址對應(yīng)的IP地址,如果沒有則再使用DNS進行域名解析,找到提供服務(wù)的地址,其次再對該地址進行TCP三次握手連接,發(fā)送請求獲取請求數(shù)據(jù),獲取到數(shù)據(jù)后進行數(shù)據(jù)解析,包括HTML文檔解析、DOM構(gòu)建、頁面渲染,最后呈現(xiàn)給到可視化頁面用戶。
因此瀏覽器探針是一段JS代碼,通過瀏覽器的加載事件、導(dǎo)航事件等獲取頁面訪問的數(shù)據(jù),比如瀏覽器基本信息、采集頁面性能數(shù)據(jù)、采集Ajax性能數(shù)據(jù)和請求響應(yīng)數(shù)據(jù)、JS錯誤數(shù)據(jù)、頁面追蹤數(shù)據(jù)等,再發(fā)送給到后臺處理加工,形成用戶運營數(shù)據(jù)(比如頁面PV、運營商信息、瀏覽器信息、訪問城市省會信息)、運維數(shù)據(jù)(比如Ajax錯誤信息、JS緩慢頁面信息),幫助運營了解產(chǎn)品用戶情況,更好的推廣營銷、幫助研發(fā)運維團隊解決產(chǎn)品生產(chǎn)環(huán)境中的功能性能問題。
服務(wù)器監(jiān)控
對于服務(wù)器監(jiān)控主要是監(jiān)控后端系統(tǒng)的運行情況,因Java、Python、php、.Net/.NetCore、C/C++、Golang等語言都可以開發(fā)后端應(yīng)用,因此服務(wù)器探針也包含各種語言的探針。從這八種開發(fā)語言的特性來看,有的語言是編譯型,即將源代碼翻譯成機器碼后才能運行,例如Golang,C/C++;有的語言是解釋型,邊執(zhí)行邊翻譯,例如PHP、Python;有的語言是混合型,介于編譯型和解釋型之間,即把代碼編譯成中間碼再在語言提供的平臺運行,例如Java、.Net/.NetCore。因此不同類型語言的探針實現(xiàn)也不一樣。
對于解釋型語言來說,使用HookApi的方式實現(xiàn),例如Python在運行過程中會需要調(diào)用框架和函數(shù),因此Python探針針對各個框架各數(shù)據(jù)庫需要專門定義Hook函數(shù),探針啟動時會將我們寫好的Hook函數(shù)(針對WEB框架,WSGI,數(shù)據(jù)庫等)加入sys_meta_path中,這樣用戶函數(shù)在執(zhí)行后就會先執(zhí)行我們定義好的Hook函數(shù),采集數(shù)據(jù);對于編譯型語言來說,使用SDK的方式實現(xiàn),總體的思路和HookAPI一致,差別在于SDK是完全封裝好的內(nèi)容;對于混合型語言來說,使用Agent的方式實現(xiàn),比如Java探針在JavaSE的Instrumention上做開發(fā),在Java代碼編譯的時候進行了代碼注入,Java探針依附在Java進程里,不會創(chuàng)建新的進程,而是創(chuàng)建多個線程來采集和匯總數(shù)據(jù),如下圖所示 用戶的類A.class通過ClassLoader裝載進JVM時會調(diào)用Javaagent嵌入監(jiān)控代碼生成A'.class,當(dāng)有用戶請求進來時,Engine會找到A'.class執(zhí)行正常的業(yè)務(wù)邏輯,邏輯執(zhí)行完畢后Engine會將監(jiān)控Data寫入監(jiān)控數(shù)據(jù)緩存區(qū)(即一次采集周期),并且每隔60s會向Server發(fā)送數(shù)據(jù),清理緩存區(qū)。

探針采集了應(yīng)用運行函數(shù)的時間運行軌跡、調(diào)用數(shù)據(jù)庫、第三方服務(wù)、消息中間件、下一個業(yè)務(wù)系統(tǒng)的時長和調(diào)用語句,經(jīng)過后端處理分析,呈現(xiàn)給用戶應(yīng)用調(diào)用全鏈路拓撲圖、函數(shù)執(zhí)行堆棧、函數(shù)響應(yīng)時間和調(diào)用次數(shù)、慢/錯SQL語句、慢外部調(diào)用語句,幫助研發(fā)人員了解整體業(yè)務(wù)運行情況,快速定位分析后端錯誤、優(yōu)化應(yīng)用性能。
網(wǎng)絡(luò)監(jiān)控
對于網(wǎng)絡(luò)監(jiān)控,主要是獲取應(yīng)用運行過程中的網(wǎng)絡(luò)情況定位數(shù)據(jù)傳輸過程中的網(wǎng)絡(luò)問題。實現(xiàn)方式是探針安裝用戶的數(shù)據(jù)中心,通過將流經(jīng)交換機的流量拷貝出來(即旁路鏡像),解析網(wǎng)絡(luò)協(xié)議(如TCP、SNMP)獲取數(shù)據(jù),然后將數(shù)據(jù)發(fā)送給后端進行處理分析,最后在前端呈現(xiàn)給用戶。用戶通過網(wǎng)絡(luò)監(jiān)控可獲取網(wǎng)絡(luò)流量、吞吐量、帶寬利用率、丟包率、包連接情況、連接嘗試情況、建鏈時間、網(wǎng)絡(luò)傳輸時間、URL頁面耗時、SQL執(zhí)行耗時等,快速定位網(wǎng)絡(luò)問題、帶寬問題,優(yōu)化網(wǎng)絡(luò)使用情況。這種方式最大的好處就是對用戶業(yè)務(wù)沒有入侵,因為是將流量完全拷貝出來再做分析處理,通常銀行、金融等對業(yè)務(wù)可用性要求極高的行業(yè)會使用此類監(jiān)控方式。
日志監(jiān)控
日志即服務(wù)的運行軌跡,所有的服務(wù)在運行中都會產(chǎn)生日志,主要有主機日志、網(wǎng)絡(luò)設(shè)備日志、應(yīng)用日志、中間件日志、數(shù)據(jù)庫日志等五種類型。日志監(jiān)控的實現(xiàn)邏輯是通過日志探針、上傳日志、對接MQ隊列接口獲取數(shù)據(jù)源,再給到后臺處理分析,最后在前端呈現(xiàn)。用戶可在前端根據(jù)業(yè)務(wù)出現(xiàn)問題的時間范圍來獲取該段時間內(nèi)的日志,也可以輸入關(guān)鍵字進行搜索日志,通過日志可了解應(yīng)用的原生運行情況,幫助研發(fā)人員快速定位問題。日志平臺最重要的兩個能力是存儲大量數(shù)據(jù)、快速搜索能力,對于搜索來說一般采用Eleasearch大數(shù)據(jù)來提供數(shù)據(jù)的存儲和搜索功能。
基礎(chǔ)設(shè)施監(jiān)控
基礎(chǔ)設(shè)施包括物理機房、服務(wù)器、網(wǎng)絡(luò)設(shè)備、中間件、數(shù)據(jù)庫、存儲、虛擬化等,對于基礎(chǔ)設(shè)施的監(jiān)控則包含該機房運行環(huán)境的溫度濕度、服務(wù)器的CPU內(nèi)存磁盤網(wǎng)絡(luò)、數(shù)據(jù)庫的數(shù)據(jù)庫類型、版本、字符集、IP端口、狀態(tài)、安裝路徑和數(shù)據(jù)庫大小等。對于非物理機房類型的實現(xiàn)邏輯是通過各種協(xié)議(SNMP、WMI、Telnet、SSH、IPMI、JMX、JDBC、Agent等)對各種原始數(shù)據(jù)進行采集,再通過協(xié)議解析數(shù)據(jù),后臺處理加工,前臺呈現(xiàn)給到用戶;對于物理機房的實現(xiàn)邏輯是通過API接口調(diào)用服務(wù)器的數(shù)據(jù)。運維人員通過基礎(chǔ)設(shè)施監(jiān)控,便能全景了解整個業(yè)務(wù)物理情況,當(dāng)機房斷電或服務(wù)器CPU內(nèi)存指標(biāo)異常時,通過升級硬件的方式便能解決問題。
通過上述各類監(jiān)控平臺的介紹,相信你對監(jiān)控產(chǎn)品的類別、監(jiān)控的使用與價值、實現(xiàn)原理已經(jīng)清晰了吧。對于研發(fā)人員來說,選對了監(jiān)控產(chǎn)品,在業(yè)務(wù)運行過程中便能事半功倍,大幅度提高開發(fā)效率;對于運維人員來說,選對了合適的監(jiān)控產(chǎn)品,在業(yè)務(wù)運維過程中也更能保障業(yè)務(wù)的正常運行,提高用戶滿意度;對于想入門監(jiān)控的同學(xué)來說,每一個方向的監(jiān)控原理和用戶價值都很清晰了,結(jié)合自己興趣,選擇最適合自己的運維監(jiān)控領(lǐng)域即可。