關(guān)鍵點(diǎn)
在分布式的、可擴(kuò)展的系統(tǒng)(通常包含不穩(wěn)定的基礎(chǔ)設(shè)施)中排除故障的效率通常取決于是否有充分的日志記錄和搜索設(shè)備。
唯一事件ID、事務(wù)追蹤技術(shù)和結(jié)構(gòu)化的日志輸出等技術(shù),讓我們得以透徹地了解應(yīng)用程序的行為,以及應(yīng)用程序是否在正常運(yùn)作。
日志記錄不再會(huì)“拖慢”系統(tǒng)性能,相反地,它在系統(tǒng)故障恢復(fù)中有重要的速度增益,尤其是在使用了日志聚合的情況下。
我們需要測(cè)試核心操作需求,如日志記錄。
我們可以采用類似功能性需求的方式來測(cè)試日志,比如用戶故事和BDD場(chǎng)景等。
現(xiàn)代日志聚合和搜索工具為團(tuán)隊(duì)的建立、測(cè)試和運(yùn)行軟件系統(tǒng)提供了重要的新功能。通過把日志作為一個(gè)核心系統(tǒng)組件,并使用如唯一事件ID、事務(wù)追蹤技術(shù)和結(jié)構(gòu)化的日志輸出等技術(shù),我們可以獲得對(duì)應(yīng)用程序的行為和正常運(yùn)作的豐富的見解,尤其是跨組件的視圖。這篇文章解釋了 為什么測(cè)試日志是有價(jià)值的和如何用現(xiàn)代日志聚合工具做日志測(cè)試 。這種方法使日志成為了一種渠道,使分布式系統(tǒng)更具可測(cè)試性。
日志在整體上會(huì)為各方面提速
按一直以來的觀點(diǎn),許多人認(rèn)為,日志會(huì)“拖慢”軟件。如果使用的是同步文件I / O、慢速磁盤存儲(chǔ)、甚至更慢的網(wǎng)絡(luò)速度,從這些方面來看這種觀點(diǎn)有一定的道理。因此,我們往往對(duì)在現(xiàn)場(chǎng)環(huán)境中運(yùn)行的軟件中記錄下來的日志,抱著審慎的態(tài)度。然而,異步文件I/O和SSD存儲(chǔ)正在成為常態(tài),1GB、10GB,甚至100Gb以太網(wǎng)也越來越普遍,日志的性能特性現(xiàn)在已經(jīng)變得不同。
現(xiàn)在,除了時(shí)間關(guān)鍵型的應(yīng)用程序,如金融交易和其他復(fù)雜算法的情況下,在軟件系統(tǒng)中我們已經(jīng)很少單純地優(yōu)化軟件的運(yùn)行速度了。特別是在分布式系統(tǒng)、云和物聯(lián)網(wǎng)(IoT)的背景下,我們需要考慮的是在發(fā)生錯(cuò)誤后,恢復(fù)服務(wù)的時(shí)間(通常被稱為“平均恢復(fù)時(shí)間”,Mean Time to Recovery,MTTR)。同時(shí),我們也要考慮在上游(測(cè)試)環(huán)境里,確定問題原因所需要的時(shí)間。
現(xiàn)代日志聚合和搜索工具——比如ElasticSearch、Logstash、Kibana、LogEntries、Loggly、Sematext等等——給我們提供了豐富的方法與我們的軟件的進(jìn)行交互,它提供了豐富的用戶接口去判斷應(yīng)用程序的行為,也提供了可編程的REST API來在多臺(tái)服務(wù)器之間搜索和關(guān)聯(lián)事件。

雖然額外的日志記錄可能會(huì)導(dǎo)致軟件程序的執(zhí)行速度下降5%-10%。但如果在要搜索的位置具有詳細(xì)的可用信息就可以幫助我們更迅速地診斷問題,加快我們對(duì)故障的響應(yīng),并且往往可以顯著地減少發(fā)現(xiàn)一些隱藏得非常深的錯(cuò)誤的時(shí)間!
快速的I / O和存儲(chǔ)以及現(xiàn)代日志工具的組合——特別是當(dāng)有工具提供給所有測(cè)試人員和開發(fā)人員時(shí),就使我們能夠把日志作為我們的軟件系統(tǒng)的一個(gè)重要組成部分;這會(huì)讓我們產(chǎn)生疑問:如果日志是我們的軟件系統(tǒng)的一個(gè)重要組成部分,我們?cè)撊绾螠y(cè)試它呢?
以包裹追蹤做類比
我們大多數(shù)人都非常熟悉在線包裹追蹤工具。這些工具使我們只要有一個(gè)追蹤ID就能夠看到我們的包裹在哪里。這些工具有兩個(gè)有趣的功能:通過派送網(wǎng)絡(luò)能夠跟蹤一個(gè)特定的包裹,并且也可以顯示出涉及到的這個(gè)包裹在不同的時(shí)間的各種不同的狀態(tài)(或事件)。

在跟蹤一個(gè)包裹時(shí),我們可以看到這些狀態(tài),比如“到達(dá)倉庫”、“運(yùn)輸中”和“已送達(dá)”等等;這些都代表了特定的狀態(tài)或事件,并且每一個(gè)都有一個(gè)系統(tǒng)內(nèi)的內(nèi)部標(biāo)識(shí)符(ID)——事件ID。

在現(xiàn)代的異步分布式軟件系統(tǒng)中,我們可以使用一種類似的技術(shù)來跟蹤跨不同模塊的運(yùn)作執(zhí)行情況。為了幫助我們做到這一點(diǎn),我們定義了一些我們自己的事件ID,并把這些事件ID與我們正在使用的系統(tǒng)相關(guān)聯(lián)起來。
預(yù)期事件和相關(guān)性ID的測(cè)試
我們不應(yīng)該把時(shí)間花在測(cè)試日志子系統(tǒng)本身之上,比如log4net、log4j,等等;我們應(yīng)該假設(shè)日志的功能(寫入磁盤、切轉(zhuǎn)日志文件、刷新緩沖,等等)都已經(jīng)就緒了。相反,我們應(yīng)該集中精力確保三個(gè)獨(dú)立但相關(guān)的東西: