一、為什么要使用流量錄制與回放?
1.1 vivo業(yè)務(wù)狀況
近幾年,vivo互聯(lián)網(wǎng)領(lǐng)域處于高速發(fā)展?fàn)顟B(tài),同時(shí)由于vivo手機(jī)出貨量一直在國(guó)內(nèi)名列前茅,經(jīng)過(guò)多年積累,用戶(hù)規(guī)模非常龐大。因此,vivo手機(jī)出廠內(nèi)置很多應(yīng)用,如瀏覽器、短視頻、直播、資訊、應(yīng)用商店等都是直面用戶(hù)的高并發(fā)、復(fù)雜系統(tǒng)。這些面向用戶(hù)的系統(tǒng)對(duì)使用體驗(yàn)要求非常高,對(duì)這些業(yè)務(wù)的質(zhì)量保障是重中之重。
[圖片上傳失敗...(image-6924ce-1645498466179)]
1.2 測(cè)試痛點(diǎn)
隨著我們業(yè)務(wù)規(guī)模和復(fù)雜度不斷提高,各種問(wèn)題和挑戰(zhàn)隨之而來(lái)。其中“在業(yè)務(wù)迭代升級(jí)甚至重構(gòu)時(shí),如何保證系統(tǒng)修改后的原有業(yè)務(wù)正確性?”是我們正在著手解決的其中一大難題。
簡(jiǎn)單的業(yè)務(wù)系統(tǒng)通過(guò)常規(guī)的自動(dòng)化測(cè)試工具加上人工測(cè)試即可解決,對(duì)于復(fù)雜系統(tǒng),回歸測(cè)試將變成一項(xiàng)艱難的工程。以我們推薦系統(tǒng)為例,一個(gè)推薦系統(tǒng)承擔(dān)了數(shù)十個(gè)推薦場(chǎng)景。如何在修改某個(gè)推薦場(chǎng)景的情況下保證不影響其他場(chǎng)景呢?
之前,我們是通過(guò)編寫(xiě)自動(dòng)化測(cè)試用例去解決,但是通過(guò)人工編寫(xiě)的測(cè)試用例存在較多痛點(diǎn):
測(cè)試用例編寫(xiě)難,數(shù)據(jù)構(gòu)造難,用戶(hù)真實(shí)的使用行為不容易模擬。
部分代碼邏輯通過(guò)測(cè)試腳本難以驗(yàn)證。例如發(fā)送消息無(wú)法驗(yàn)證消息內(nèi)容沒(méi)有問(wèn)題。
依靠人工構(gòu)造用例難以考慮到系統(tǒng)所有場(chǎng)景,容易造成用例遺漏。
隨著系統(tǒng)部署復(fù)雜度上升,環(huán)境維護(hù)成本也比較高。
針對(duì)這些復(fù)雜業(yè)務(wù)系統(tǒng)在迭代過(guò)程中回歸測(cè)試效率低的問(wèn)題,我們進(jìn)行了一些持續(xù)性探索。
1.3 方案探索
我們結(jié)合vivo互聯(lián)網(wǎng)體系特色對(duì)業(yè)界一些方案進(jìn)行了廣泛調(diào)研和參考并列舉了如下要求:新方案要能簡(jiǎn)單高效,用戶(hù)無(wú)需過(guò)多理解就能輕松上手;業(yè)務(wù)接入成本足夠低,能夠快速進(jìn)行回歸測(cè)試;新方案通用性、擴(kuò)展性要足夠好,能適應(yīng)不斷變更的系統(tǒng)架構(gòu)。
我們參考了一些頭部互聯(lián)網(wǎng)公司的技術(shù)方案,發(fā)現(xiàn)流量錄制與回放是一個(gè)非常好的選擇。業(yè)界內(nèi)有不少頭部公司基于這種技術(shù)取得了不錯(cuò)的進(jìn)展和落地價(jià)值,為我們帶來(lái)了一些參考和信心。因此,對(duì)于流量錄制回放,我們進(jìn)行了一些更加深入的探索和落地,也就是我們的月光寶盒平臺(tái)。
[圖片上傳失敗...(image-7f3e86-1645498466179)]
二、什么是流量錄制與回放?
在介紹具體實(shí)踐之前,先簡(jiǎn)單介紹一下什么是流量錄制與回放?
流量錄制回放是通過(guò)復(fù)制線上真實(shí)流量(錄制)然后在測(cè)試環(huán)境進(jìn)行模擬請(qǐng)求(回放)驗(yàn)證代碼邏輯正確性。通過(guò)采集線上流量在測(cè)試環(huán)境回放逐一對(duì)比每個(gè)子調(diào)用差異和入口調(diào)用結(jié)果來(lái)發(fā)現(xiàn)接口代碼是否存在問(wèn)題。
利用這種機(jī)制進(jìn)行回歸測(cè)試具備許多優(yōu)勢(shì):首先,通過(guò)錄制流量取代測(cè)試用例簡(jiǎn)單高效,易于形成豐富的測(cè)試用例;其次,回放線上流量能完美模擬用戶(hù)真實(shí)行為,避免人工編寫(xiě)存在的差異性;另外通過(guò)對(duì)錄制數(shù)據(jù)和回放數(shù)據(jù)采用對(duì)象對(duì)比方式能更深入、細(xì)微驗(yàn)證系統(tǒng)邏輯;最后錄制的流量無(wú)需維護(hù),隨取隨用,非常方便。
三、月光寶盒平臺(tái)
流量錄制與回放這種創(chuàng)新性的機(jī)制理論上是非常優(yōu)秀的,但是實(shí)現(xiàn)起來(lái)卻不太容易,里面有諸多難題需要解決。下面將給大家介紹流量錄制與回放在vivo互聯(lián)網(wǎng)體系的落地方案和遇到的問(wèn)題以及我們是如何解決這些問(wèn)題的。
3.1 底層架構(gòu)
vivo月光寶盒平臺(tái)借鑒了開(kāi)源Jvm-Sandbox-Repeater項(xiàng)目經(jīng)驗(yàn),在Jvm-Sandbox-Repeater基礎(chǔ)上做了二次開(kāi)發(fā)和改造。月光寶盒平臺(tái)包括了服務(wù)端和Java Agent兩大模塊,整體架構(gòu)如下圖所示。
3.1.1 業(yè)務(wù)架構(gòu)
下圖是我們服務(wù)端整體業(yè)務(wù)架構(gòu),整個(gè)服務(wù)端可以劃分成任務(wù)管理、數(shù)據(jù)管理、覆蓋率分析、配置管理、監(jiān)控告警等模塊。
任務(wù)管理模塊管理用戶(hù)的錄制和回放任務(wù),包括任務(wù)啟停、任務(wù)進(jìn)度、任務(wù)狀態(tài)等;
數(shù)據(jù)管理模塊用來(lái)管理用戶(hù)錄制與回放的流量數(shù)據(jù)、以及分析數(shù)據(jù);
覆蓋率分析模塊用來(lái)統(tǒng)計(jì)用戶(hù)回歸覆蓋率指標(biāo);
配置管理模塊用來(lái)配置系統(tǒng)與應(yīng)用的全局參數(shù);
監(jiān)控模塊用來(lái)分析Agent各方面性能指標(biāo);
此外還有一些消息通知模塊。
[圖片上傳失敗...(image-a0806f-1645498466179)]
3.1.2 Agent架構(gòu)
下圖是Agent模塊整體架構(gòu)圖,Agent是流量錄制回放過(guò)程的核心。Agent是基于字節(jié)碼機(jī)制實(shí)現(xiàn),整體包括了四層結(jié)構(gòu):
底層是基礎(chǔ)容器層,這一層是標(biāo)準(zhǔn)的Java-Agent實(shí)現(xiàn);
容器層上面是依賴(lài)層,這一層引入了我們需要的第三方資源、實(shí)現(xiàn)了字節(jié)碼插樁機(jī)制、類(lèi)加載隔離、class元數(shù)據(jù)管理能力。
依賴(lài)層之上是基礎(chǔ)能力層,在這一層實(shí)現(xiàn)了基本的原子功能,如錄制回放插件的管理、數(shù)據(jù)管理、數(shù)據(jù)對(duì)比、子調(diào)用Mokc、運(yùn)行監(jiān)控、配置加載等能力。
最上層是業(yè)務(wù)邏輯層,這一層可以將基礎(chǔ)邏輯功能組合在一起形成一個(gè)完整的業(yè)務(wù)單元。目前月光寶盒除了支持流量錄制與回放外,還支持了類(lèi)似依賴(lài)分析、數(shù)據(jù)Mock等功能。
[圖片上傳失敗...(image-b439d8-1645498466179)]
3.2 月光寶盒的啟動(dòng)流程
錄制回放任務(wù)啟動(dòng)最重要是能無(wú)侵入的將我們Agent下發(fā)到指定業(yè)務(wù)機(jī)器上并且自動(dòng)將Agent Attach到我們業(yè)務(wù)進(jìn)程上去。
月光寶盒的啟動(dòng)流程如下圖所示,用戶(hù)首先在月光寶盒平臺(tái)配置錄制回放任務(wù)。完成配置后,配置信息會(huì)入庫(kù)并同時(shí)通過(guò)VCS(vivo自研的作業(yè)調(diào)度平臺(tái))將啟動(dòng)腳本、vivo-repeater-agent包下發(fā)至用戶(hù)配置的機(jī)器上。然后會(huì)執(zhí)行shell腳本并拉起sandbox,將agent attach至目標(biāo)的JVM。隨后agent便可以在目標(biāo)JVM上通過(guò)反射創(chuàng)建jvm sandbox,sandbox會(huì)通過(guò)spi拉起多個(gè)模塊。
其中最重要是vivo repeater module,它會(huì)通過(guò)spi加載多個(gè)插件,這些插件最終會(huì)以ASM的方式增強(qiáng)目標(biāo)JVM上的代碼,從而實(shí)現(xiàn)字節(jié)碼插樁,而流量的錄制與回放便是使用這些增強(qiáng)的插件進(jìn)行流量攔截、下發(fā)存儲(chǔ)完成的。
[圖片上傳失敗...(image-357206-1645498466179)]
上述的執(zhí)行流程允許用戶(hù)僅憑在控制臺(tái)配置少量信息就能完成復(fù)雜的流量錄制與回放功能,下面我們將對(duì)錄制與回放的詳細(xì)過(guò)程進(jìn)行說(shuō)明。
3.3 流量錄制過(guò)程
下面是一個(gè)流量錄制的過(guò)程。一條流量的調(diào)用鏈路包括入口調(diào)用和若干次子調(diào)用,流量的錄制過(guò)程就是把入口調(diào)用和子調(diào)用通過(guò)一個(gè)唯一ID綁定成一次完整的調(diào)用記錄。月光寶盒找到入口調(diào)用和子調(diào)用合適的代碼點(diǎn)(關(guān)鍵入口和出口),基于字節(jié)碼插樁技術(shù)在該代碼點(diǎn)進(jìn)行代碼增強(qiáng),實(shí)現(xiàn)調(diào)用攔截,記錄調(diào)用的入?yún)⒑头祷刂担缓蟾鶕?jù)相應(yīng)的調(diào)用類(lèi)型(如dubbo、http)生成一個(gè)錄制標(biāo)識(shí)。當(dāng)調(diào)用完成時(shí),月光寶盒就采集到了整個(gè)流量的調(diào)用記錄,之后月光寶盒進(jìn)行數(shù)據(jù)脫敏、序列化等操作,最后加密發(fā)送到服務(wù)端進(jìn)行儲(chǔ)存。
[圖片上傳失敗...(image-d78cb4-1645498466179)]
[圖片上傳失敗...(image-65eced-1645498466179)]
錄制是一個(gè)比較復(fù)雜的過(guò)程,在這個(gè)過(guò)程中我們持續(xù)踩了一些坑和遇到了一些問(wèn)題,下面我列舉幾個(gè)比較重要的問(wèn)題和大家分享一下。
3.3.1 難點(diǎn)一:Full GC
初期,vivo內(nèi)部系統(tǒng)在使用月光寶盒時(shí)發(fā)生了Full GC的現(xiàn)象。經(jīng)過(guò)分析得知是錄制的接口對(duì)guava調(diào)用非常多,導(dǎo)致錄制的請(qǐng)求流量太大從而造成了FULL GC。這是因?yàn)樵谕瓿梢粭l接口流量的錄制前,錄制到的所有數(shù)據(jù)都在內(nèi)存中,流量或者子調(diào)用一旦過(guò)大便容易導(dǎo)致頻繁Full GC。另外還有一些高并發(fā)系統(tǒng)接口比較多,同時(shí)錄制多個(gè)高并發(fā)接口存在性能壓力。因此,我們當(dāng)時(shí)針對(duì)月光寶盒的性能問(wèn)題進(jìn)行了如下優(yōu)化:
嚴(yán)格限制并發(fā)錄制數(shù)量、限制單條流量子調(diào)用數(shù)量;
對(duì)錄制過(guò)程進(jìn)行監(jiān)控、異常降級(jí);
合并相同的子調(diào)用錄制過(guò)程以減少子調(diào)用數(shù)量。
對(duì)錄制緩存占用進(jìn)行實(shí)時(shí)監(jiān)控,超出警戒線及時(shí)進(jìn)行降級(jí)處理。
經(jīng)過(guò)不斷優(yōu)化后,錄制過(guò)程非常平穩(wěn),再也沒(méi)有出現(xiàn)因?yàn)榱髁窟^(guò)大或者其他問(wèn)題導(dǎo)致的Full GC現(xiàn)象。
3.3.2 難點(diǎn)二:調(diào)用鏈路串聯(lián)
流量錄制和回放存在線程上下文標(biāo)識(shí),vivo有不少系統(tǒng)有自定義業(yè)務(wù)線程池或者使用第三方框架自帶了線程池(例如Hystrix)會(huì)導(dǎo)致標(biāo)識(shí)丟失導(dǎo)致無(wú)法串聯(lián)整個(gè)調(diào)用鏈路問(wèn)題。
月光寶盒最開(kāi)始是依賴(lài)Jvm-Sandbox-Repeater的基礎(chǔ)能力,在未使用線程池時(shí),可以將錄制標(biāo)識(shí)存放于ThreadLocal中串聯(lián)整個(gè)調(diào)用鏈路;而使用線程池時(shí),我們利用自身Agent對(duì)Java 線程池進(jìn)行自動(dòng)增強(qiáng)透?jìng)魑覀冧浿苹胤艠?biāo)識(shí),但這么做會(huì)和公司的調(diào)用鏈Agent對(duì)線程池的增強(qiáng)產(chǎn)生沖突從而導(dǎo)致JVM異常崩潰,這種方式?jīng)]有辦法進(jìn)行。
最終我們決定與公司調(diào)用鏈團(tuán)隊(duì)合作,借助調(diào)用鏈的Tracer上下文進(jìn)行傳遞錄制標(biāo)識(shí),雙方都進(jìn)行了一定程度改造特別是兩個(gè)Agent對(duì)HTTP、Dubbo埋點(diǎn)位置進(jìn)行了一定調(diào)整。目前我們還沒(méi)有解決ForkJoinPoool這種線程池框架傳遞標(biāo)識(shí)問(wèn)題,后續(xù)會(huì)繼續(xù)對(duì)這類(lèi)線程池做支持。
3.3.3 難點(diǎn)三:數(shù)據(jù)安全
第三個(gè)是錄制的流量如何保證數(shù)據(jù)安全,不少系統(tǒng)有一些銘感數(shù)據(jù)。對(duì)此,我們針對(duì)錄制的數(shù)據(jù)進(jìn)行了可配置化的脫敏處理,用戶(hù)可以在月光寶盒平臺(tái)配置待脫敏字段,Agent在錄制流量的時(shí)候后會(huì)根據(jù)配置信息在內(nèi)存中對(duì)這些字段進(jìn)行脫敏處理,保證傳輸過(guò)程和存儲(chǔ)過(guò)程的數(shù)據(jù)安全。另外,月光寶盒會(huì)嚴(yán)格控制流量詳情的查看權(quán)限,防止跨項(xiàng)目的數(shù)據(jù)查詢(xún)行為。
3.3.4 難點(diǎn)四:流量去重
第四個(gè)是流量去重問(wèn)題。有時(shí)業(yè)務(wù)方在使用月光寶盒平臺(tái)時(shí)可能錄制到非常多的相同流量,造成后續(xù)回放耗時(shí)較長(zhǎng)和問(wèn)題排查效率低下。因此我們針對(duì)該現(xiàn)象思考如何能在保證接口覆蓋率的情況下盡可能減少相同流量的數(shù)量。目前的方案是根據(jù)流量入?yún)⒑蛨?zhí)行調(diào)用棧作去重操作。在錄制時(shí),Agent會(huì)根據(jù)去重配置信息進(jìn)行流量去重操作,保證入庫(kù)的流量數(shù)據(jù)是唯一的。通過(guò)這種機(jī)制在一些場(chǎng)景大幅度減少了錄制流量數(shù)量,提高了流量的使用效率。
3.4 流量回放過(guò)程
下圖是流量回放的過(guò)程。流量回放是通過(guò)獲取錄制流量的入口調(diào)用,再次對(duì)迭代后的系統(tǒng)發(fā)起調(diào)用,然后去驗(yàn)證系統(tǒng)邏輯正確性的過(guò)程。和錄制不一樣的是,回放對(duì)于外部的調(diào)用都是Mock的,這個(gè)過(guò)程不會(huì)真正的去訪問(wèn)數(shù)據(jù)庫(kù)。回放過(guò)程會(huì)將錄制子調(diào)用和回放子調(diào)用的入?yún)⑦M(jìn)行對(duì)比,如果參數(shù)不一致那么會(huì)阻斷回放流量,如果參數(shù)一致會(huì)使用錄制子調(diào)用的結(jié)果進(jìn)行Mock返回?;胤磐瓿赏瑯訒?huì)產(chǎn)生一個(gè)響應(yīng)結(jié)果,這個(gè)時(shí)候我們會(huì)對(duì)比原始錄制結(jié)果和回放響應(yīng)結(jié)果,根據(jù)該對(duì)比結(jié)果和子調(diào)用的對(duì)比結(jié)果就能得出被測(cè)試系統(tǒng)的正確性了。
[圖片上傳失敗...(image-6059fb-1645498466179)]
回放是一個(gè)更加復(fù)雜的過(guò)程,因?yàn)殇浿坪突胤乓话阍诓煌h(huán)境的不同版本系統(tǒng)執(zhí)行,可能存在較大差異,如果處理不當(dāng)回放成功率會(huì)比較低。起初接入月光寶盒的應(yīng)用成功率都比較低,后來(lái)經(jīng)過(guò)長(zhǎng)期優(yōu)化和精細(xì)化運(yùn)營(yíng),月光寶盒的回放成功率不斷提升。下面將分享幾個(gè)遇到的難點(diǎn)以及一些應(yīng)對(duì)策略。
3.4.1 難點(diǎn)一:時(shí)間差異
第一個(gè)難點(diǎn)是時(shí)間差異的影響,一些系統(tǒng)業(yè)務(wù)邏輯里面存在和時(shí)間有關(guān)邏輯,由于錄制和回放時(shí)間不一樣導(dǎo)致不少場(chǎng)景有時(shí)間相關(guān)邏輯導(dǎo)致回放失敗。針對(duì)這個(gè)問(wèn)題我們進(jìn)行了一些研究,并最終將回放時(shí)間和錄制時(shí)間保持一致。
對(duì)于System.currentTimeMillis() 這種native方法,Agent會(huì)動(dòng)態(tài)修改方法體的字節(jié)碼,代理掉業(yè)務(wù)對(duì)該方法的調(diào)用,動(dòng)態(tài)替換為平臺(tái)事先定義的獲取時(shí)間方法從而保證時(shí)間替換。解決了這個(gè)問(wèn)題對(duì)于Date這些類(lèi)也就迎刃而解了。另外,JDK8中的LocalDateTime等非native時(shí)間方法就比較簡(jiǎn)單了,直接Mock掉時(shí)間方法調(diào)用即可。使用這些機(jī)制基本上消除了業(yè)務(wù)邏輯里面的時(shí)間差異問(wèn)題,消除了因?yàn)闀r(shí)間導(dǎo)致的回放失敗問(wèn)題。
3.4.2 難點(diǎn)二:系統(tǒng)降噪
第二個(gè)難點(diǎn)是如何處理系統(tǒng)噪音。很多系統(tǒng)里面存在一些traceId、sequenceId等通用噪音字段,這些噪音字段也是導(dǎo)致回放失敗的因素。初期業(yè)務(wù)接入時(shí)需要逐個(gè)排查,整體效率比較低。后來(lái)月光寶盒支持了全局級(jí)別、應(yīng)用級(jí)別、接口級(jí)別的噪音字段配置,很多通用的噪音字段可以直接通過(guò)全局配置解決,業(yè)務(wù)接入只需要個(gè)性化配置噪音字段即可,通過(guò)這種分層次的降噪配置大幅提升業(yè)務(wù)接入效率。
3.4.3 難點(diǎn)三:環(huán)境統(tǒng)一
第三個(gè)難點(diǎn)是環(huán)境差異。以vivo互聯(lián)網(wǎng)體系為例,一般在線上環(huán)境進(jìn)行錄制,在測(cè)試環(huán)境和預(yù)發(fā)環(huán)境進(jìn)行回放,剛開(kāi)始因?yàn)榄h(huán)境不一致導(dǎo)致回放失敗的案例非常多,影響了整體回放成功率。針對(duì)這個(gè)問(wèn)題,我們進(jìn)行了一系列探索和解決。月光寶盒在線上錄制時(shí)會(huì)同時(shí)錄制一份線上環(huán)境配置,線下回放時(shí)會(huì)利用線上配置自動(dòng)替換掉線下的環(huán)境配置,通過(guò)這種機(jī)制保證了配置中心數(shù)據(jù)一致性。另外對(duì)于一些系統(tǒng)內(nèi)存性質(zhì)的配置數(shù)據(jù),月光寶盒支持配置接口同步內(nèi)存數(shù)據(jù)。通過(guò)這些解決方案,我們基本上保證了線上、線下環(huán)境的一致性,大幅度減少了因?yàn)榄h(huán)境配置導(dǎo)致的回放失敗數(shù)量。
3.4.4 難點(diǎn)四:子調(diào)用匹配
第四個(gè)難點(diǎn)是子調(diào)用匹配問(wèn)題。最開(kāi)始指定的匹配策略無(wú)法滿足復(fù)雜業(yè)務(wù)場(chǎng)景,經(jīng)常出現(xiàn)匹不到流量或者匹配錯(cuò)誤導(dǎo)致回放難以成功。后面我們針對(duì)不同的回放子調(diào)用指定不同的匹配策略:緩存類(lèi)型按照緩存Key去匹配;HTTP類(lèi)型按照URI匹配;Dubbo按照接口、方法名、參數(shù)類(lèi)型匹配等。另外,如果匹配到多條相同子調(diào)用,我們會(huì)比較系統(tǒng)調(diào)用棧和入?yún)⒄?qǐng)求參數(shù),結(jié)合調(diào)用棧和請(qǐng)求參數(shù)兩個(gè)維度尋找最可能匹配流量,通過(guò)這些精細(xì)化匹配策略提升了匹配成功率。
3.4.5 難點(diǎn)五:?jiǎn)栴}排查
第五個(gè)難點(diǎn)是問(wèn)題排查了,錄制和回放是非常復(fù)雜的過(guò)程,由于Agent運(yùn)行在業(yè)務(wù)端機(jī)器出現(xiàn)任何問(wèn)題去分析排查難度都很大。為了提升排查效率我們支持了若干手段:
1)、支持回放分析調(diào)用鏈路圖,下面會(huì)詳細(xì)講解;
2)、任務(wù)啟動(dòng)詳細(xì)命令和參數(shù)輸出,通過(guò)輸出任務(wù)啟動(dòng)命令參數(shù),我們?cè)诒镜胤浅7奖銌?dòng)和模擬線上運(yùn)行的錄制和回放任務(wù),提高了排查效率。
3)、本地一鍵安裝Agent,在本地修改了Agent代碼后我們一鍵就可以將新的Agent在本地遠(yuǎn)程測(cè)試環(huán)境安裝。
除了這些功能外我們還開(kāi)發(fā)了很多效率工具,這里就不一一展開(kāi)說(shuō)明了。
3.5 豐富的協(xié)議支持
vivo業(yè)務(wù)種類(lèi)非常多,不同業(yè)務(wù)技術(shù)棧有差異。這些系統(tǒng)接入我們平臺(tái)需要針對(duì)性的適配相應(yīng)插件。通過(guò)我們不斷完善插件,目前我們已經(jīng)支持了下面數(shù)十種插件,基本已經(jīng)覆蓋了各種常見(jiàn)的中間件。
[圖片上傳失敗...(image-50e564-1645498466179)]
3.6 月光寶盒平臺(tái)其它特點(diǎn)
3.6.1 可視化調(diào)用鏈路
起初,業(yè)務(wù)回放失敗只能依靠平臺(tái)開(kāi)發(fā)人員協(xié)助排查,整個(gè)排查過(guò)程費(fèi)時(shí)費(fèi)力。針對(duì)這種情況,我們提供了一些可視化的運(yùn)維工具。其中一個(gè)就是鏈路調(diào)用分析圖。我們對(duì)錄制和回放過(guò)程進(jìn)行詳細(xì)跟蹤和記錄,通過(guò)調(diào)用鏈路圖幫助用戶(hù)分析執(zhí)行過(guò)程。出現(xiàn)問(wèn)題時(shí),用戶(hù)可以清晰看到具體異常位置和根本原因,提高了排查效率。
[圖片上傳失敗...(image-bb1b31-1645498466179)]
3.6.2 回歸代碼覆蓋率
月光寶盒的優(yōu)勢(shì)之一是具備很高的流量覆蓋率很容易形成高覆蓋率。如何去驗(yàn)證回放的流量確實(shí)覆蓋了業(yè)務(wù)系統(tǒng)的各個(gè)場(chǎng)景,讓使用人員使用了月光寶盒就不存在疑慮放心大膽的上線。
針對(duì)這個(gè)問(wèn)題,月光寶盒提供了代碼回歸覆蓋率的統(tǒng)計(jì)能力,我們利用內(nèi)部的CoCo-Server平臺(tái)統(tǒng)計(jì)了系統(tǒng)全量覆蓋率和增量代碼覆蓋率。為了識(shí)別覆蓋率數(shù)據(jù)來(lái)自流量回放,我們?cè)诨胤徘靶枰{(diào)用接口清理機(jī)器內(nèi)存里面的覆蓋率數(shù)據(jù),這種方式可能存在和其他流量沖突可能性,后續(xù)等CoCo-Server平臺(tái)完成流量染色區(qū)分流量來(lái)源就沒(méi)有這方面擔(dān)憂了。
[圖片上傳失敗...(image-37e5b-1645498466179)]
3.6.3 定時(shí)錄制與回放
雖然流量錄制和回放的操作流程已經(jīng)非常簡(jiǎn)便了,但對(duì)于一些頻繁使用的業(yè)務(wù)人員來(lái)說(shuō)仍然較為繁瑣,特別是有些版本涉及了過(guò)多的系統(tǒng),同時(shí)錄制回放多個(gè)系統(tǒng)效率比較低下。為了提高使用效率,月光寶盒支持了用戶(hù)自定義定時(shí)錄制、回放任務(wù)的能力。通過(guò)定時(shí)任務(wù)可以批量定時(shí)錄制和回放,減小了人工操作成本,提高了平臺(tái)使用體驗(yàn)。
[圖片上傳失敗...(image-971cd-1645498466179)]
3.7 月光寶盒其他應(yīng)用
除了自動(dòng)化測(cè)試,我們?cè)谄渌矫嬉策M(jìn)行了一些探索和應(yīng)用。第一個(gè)是流量壓測(cè),用戶(hù)可以通過(guò)月光寶盒平臺(tái)分析錄制的流量生成的壓測(cè)模型。第二個(gè)是問(wèn)題定位,使用月光寶盒平臺(tái)在線下回放重現(xiàn)線上問(wèn)題,幫助測(cè)試、開(kāi)發(fā)人員復(fù)現(xiàn)問(wèn)題現(xiàn)場(chǎng)。最后一個(gè)是安全分析,常態(tài)化錄制測(cè)試環(huán)境流量可以幫助安全工程師提供流量素材,識(shí)別業(yè)務(wù)系統(tǒng)安全風(fēng)險(xiǎn)等。
四、核心指標(biāo)
月光寶盒平臺(tái)的接入非常簡(jiǎn)單,業(yè)務(wù)初次接入基本上10分鐘內(nèi)就可以完成。平臺(tái)上線不到一年就累計(jì)接入了近200個(gè)業(yè)務(wù)系統(tǒng),很多都是vivo互聯(lián)網(wǎng)體系中最為核心的應(yīng)用。一年以來(lái)累計(jì)完成1W+次錄制與回放。接入月光寶盒后,平臺(tái)提前發(fā)現(xiàn)了不同業(yè)務(wù)的累計(jì)數(shù)十個(gè)線上問(wèn)題,有效減少線上事故發(fā)生次數(shù)。在很多場(chǎng)景下,使用月光寶盒平臺(tái)的流量錄制回放功能可以提升測(cè)試、開(kāi)發(fā)人員80%以上的工作效率,總體來(lái)看超出了我們的預(yù)期目標(biāo)。
五、未來(lái)規(guī)劃
在未來(lái)規(guī)劃上我們主要聚焦在兩方面,一個(gè)是功能規(guī)劃,第二個(gè)是協(xié)同開(kāi)源。
5.1、功能規(guī)劃
目前我們完成了平臺(tái)基礎(chǔ)功能建設(shè),但是還存在使用效率等問(wèn)題,后續(xù)我們重點(diǎn)會(huì)在下面兩個(gè)方向去優(yōu)化:
1)希望能夠?qū)崿F(xiàn)精準(zhǔn)化測(cè)試,避免每次全量回放錄制數(shù)據(jù),進(jìn)一步降低回放耗時(shí)。精準(zhǔn)化測(cè)試需要分析變更代碼,獲得變更代碼的影響范圍,然后基于此篩選出對(duì)應(yīng)的流量進(jìn)行回放,這樣就能減小回放覆蓋范圍。
2)是希望能夠與vivo互聯(lián)網(wǎng)體系下的CI/CD結(jié)合,當(dāng)業(yè)務(wù)系統(tǒng)發(fā)布到了預(yù)發(fā)環(huán)境后,能夠自動(dòng)觸發(fā)錄制和回放任務(wù)。這樣在上線前能給系統(tǒng)進(jìn)行一些風(fēng)險(xiǎn)識(shí)別同時(shí)提升用戶(hù)使用效率。
5.2 開(kāi)源共創(chuàng)
開(kāi)源是未來(lái)軟件的發(fā)展趨勢(shì),對(duì)于開(kāi)源,我們一直是受益者,我們也期望能積極參與到開(kāi)源項(xiàng)目為社區(qū)貢獻(xiàn)力量。我們參與了開(kāi)源https://github.com/alibaba/jvm-sandbox-repeater項(xiàng)目,成為了社區(qū)核心貢獻(xiàn)者。第一期累計(jì)貢獻(xiàn)了5個(gè)社區(qū)沒(méi)有但是比較重要的插件。后續(xù)我們準(zhǔn)備繼續(xù)按照下面規(guī)劃逐步向社區(qū)回饋月光寶盒的一些核心能力。
[圖片上傳失敗...(image-1b228b-1645498466179)]
作者:vivo互聯(lián)網(wǎng)服務(wù)器團(tuán)隊(duì)-Liu YanJiang、Xu Weiteng
本文根據(jù)Liu YanJiang老師在“2021 vivo開(kāi)發(fā)者大會(huì)"現(xiàn)場(chǎng)演講內(nèi)容整理而成。公眾號(hào)回復(fù)【2021VDC】獲取互聯(lián)網(wǎng)技術(shù)分會(huì)場(chǎng)議題資料。