一个智能运维算法测试方法
摘要: 質(zhì)量是企業(yè)長遠(yuǎn)生存的根基,是企業(yè)競爭的免死金牌。作為質(zhì)量控制團(tuán)隊(duì)的一員,保障和提高所負(fù)責(zé)系統(tǒng)的質(zhì)量,是工作的核心。而完善的測試覆蓋,是保證質(zhì)量的有效手段。
寫在前面
質(zhì)量是企業(yè)長遠(yuǎn)生存的根基,是企業(yè)競爭的免死金牌。作為質(zhì)量控制團(tuán)隊(duì)的一員,保障和提高所負(fù)責(zé)系統(tǒng)的質(zhì)量,是工作的核心。而完善的測試覆蓋,是保證質(zhì)量的有效手段。
測試按類型來分,分為功能測試和性能測試。功能測試,按照測試金字塔模型,又分為三種:單元測試、接口測試和 UI 測試。單元測試是方法級別的測試,是保證代碼質(zhì)量的基礎(chǔ),一般由開發(fā)同學(xué)自行完成。接口測試和 UI 測試是端到端的測試,需要覆蓋完整的業(yè)務(wù)場景,一般由測試同學(xué)通過自動化的方式來完成覆蓋,并加入持續(xù)集成中,保證所有提交的代碼都不會影響產(chǎn)品的正常功能。
但接口測試和 UI 測試無法覆蓋所有測試需求,比如算法。算法作為機(jī)器學(xué)習(xí)和人工智能的基礎(chǔ),其有效性至關(guān)重要,特別是在集團(tuán)智能化運(yùn)維的大潮下,各種算法層出不窮,尋找有效的方法對算法的優(yōu)劣進(jìn)行評測就成了測試團(tuán)隊(duì)的職責(zé)。但是算法不需要驗(yàn)證接口,也不需要測試 UI,而是需要建立一套有針對性的評測指標(biāo),并想辦法得到被測算法的各項(xiàng)指標(biāo)值來對算法進(jìn)行評價。
算法測試
算法測試的流程其實(shí)很簡單,只有三步:
構(gòu)造輸入
使用構(gòu)造的輸入來運(yùn)行算法
獲得輸出,并使用算法的輸出來計(jì)算各項(xiàng)指標(biāo)值,對算法做出評價
把算法作為一個黑盒,測試需要做的就是完成第一步和第三步。其中最重要的又是第一步,因?yàn)檩斎氪_定了,輸出基本就是確定的,不同點(diǎn)只是在于你如何分析而已。那么如何構(gòu)造輸入呢?有兩種方法,一是手工構(gòu)造數(shù)據(jù)集,優(yōu)點(diǎn)是較簡單,可以隨意構(gòu)造,缺點(diǎn)是無法反應(yīng)線上的真實(shí)情況,會出現(xiàn)大量的漏測場景。還有一種方式是直接使用線上的數(shù)據(jù),優(yōu)點(diǎn)是場景覆蓋全面,缺點(diǎn)是數(shù)據(jù)收集較為耗時。如果能構(gòu)造一個測試系統(tǒng),使得線上數(shù)據(jù)的收集=》算法運(yùn)行=》輸出評價成為一個完全自動化的流程,那么可以極大的提高算法測試的效率和有效性。
下面將以無人值守發(fā)布系統(tǒng)的算法測試為例,介紹一下上述測試思路的一種實(shí)現(xiàn)方法。
無人值守發(fā)布
無人值守發(fā)布(RiskFree)著力與解決快速分析新版本的應(yīng)用的各項(xiàng)指標(biāo)以識別異常,攔截有問題的發(fā)布,降低發(fā)布導(dǎo)致的故障率。無人值守發(fā)布系統(tǒng)的輸入主要有三個:ali360 的系統(tǒng)監(jiān)控和基礎(chǔ)監(jiān)控?cái)?shù)據(jù)、sunfire 的業(yè)務(wù)監(jiān)控?cái)?shù)據(jù)、a3 的日志分析數(shù)據(jù)。通過算法對這三個系統(tǒng)的輸入數(shù)據(jù)進(jìn)行分析,得到異常分,對于異常分較高的應(yīng)用觸發(fā)攔截。
故障回放測試
要對無人值守發(fā)布系統(tǒng)進(jìn)行測試,除了保證其基本功能外,最重要的是要對其算法的有效性進(jìn)行驗(yàn)證,主要落在兩個指標(biāo)上:準(zhǔn)確率和召回率:
準(zhǔn)確率 = 有效攔截 (潛在故障)/ 所有攔截
召回率 = 有效攔截 / 所有應(yīng)該攔截的發(fā)布單
測試需要構(gòu)造一個數(shù)據(jù)集,使得通過該輸入得到的輸出可以正確的反映算法的準(zhǔn)確率和召回率。給開發(fā)一個準(zhǔn)確的參考,驗(yàn)證自己的優(yōu)化是否有效。
輸入數(shù)據(jù)集由各個監(jiān)控系統(tǒng)的輸出數(shù)據(jù)構(gòu)成。且不說監(jiān)控系統(tǒng)輸出的數(shù)據(jù)量大且復(fù)雜,手工構(gòu)造數(shù)據(jù)效率底下且工作量大。就算是最后手工成功構(gòu)造了數(shù)據(jù)集,也無法保證數(shù)據(jù)的有效性和覆蓋率。在測試流程里的準(zhǔn)確率和召回率高,并不意味著在線上可以有效攔截故障,這就使測試的價值大打折扣。
所以最有效的方法就是直接錄制線上的監(jiān)控?cái)?shù)據(jù),并用該數(shù)據(jù)集做回放來驗(yàn)證算法的效果。而且為了提高測試效率,解放雙手,需要將數(shù)據(jù)的選擇、收集、回放、結(jié)果展示做成一個自動化流程,使得開發(fā)可以一鍵觸發(fā),選擇任意想要的數(shù)據(jù)集進(jìn)行回放。
對于無人值守發(fā)布系統(tǒng)來說,一次發(fā)布對應(yīng)一個 plan。所以基本思路就是錄制該 plan 運(yùn)行過程中三個監(jiān)控系統(tǒng)產(chǎn)生的所有數(shù)據(jù),并分別存放在三個表中。然后調(diào)用 riskfree 提供的通過 planId 觸發(fā)分析的回放接口,返回對應(yīng)的錄制數(shù)據(jù),完成回放。最后在 plan 分析結(jié)束后收集結(jié)果,進(jìn)行展示。下面將錄制和回放模塊分開做詳細(xì)講解。
錄制流程
第一步是選擇想要錄制的 plan。本文中選擇的是所有在發(fā)布過程中觸發(fā)了攔截的 plan。為了計(jì)算回放之后的準(zhǔn)確率和召回率,需要對這些 plan 進(jìn)行打標(biāo),標(biāo)記哪些是有效攔截,哪些是誤攔截。標(biāo)記標(biāo)準(zhǔn)為:無人值守觸發(fā)攔截 && 發(fā)布單被手工關(guān)閉或回滾=有效攔截,其他的都是誤攔截。這種方法理論上可以保證標(biāo)記的準(zhǔn)確性。該任務(wù)由定時任務(wù)來完成,在每天的零點(diǎn)對前一天的發(fā)布單進(jìn)行過濾,通過對無人值守發(fā)布和海狼的數(shù)據(jù)庫的數(shù)據(jù)分析,計(jì)算出需要選擇的 plan 和對應(yīng)的標(biāo)記,存儲到本地的數(shù)據(jù)庫中。
選好 plan 之后,需要將該 plan 分析過程中獲取的三個監(jiān)控系統(tǒng)的數(shù)據(jù)拉取下來并分別保存。流程很簡單,只要把在分析過程中獲取到的監(jiān)控?cái)?shù)據(jù)全部保存下來即可。由 riskfree 提供錄制接口,通過 planId 來重新觸發(fā)分析,在分析過程中將得到的監(jiān)控?cái)?shù)據(jù)通過錄制模塊提供的 API 存儲到錄制模塊的 DB 中。因?yàn)楸O(jiān)控系統(tǒng)會存儲一個月左右的歷史數(shù)據(jù),所以只要錄制及時,所有對應(yīng)得監(jiān)控?cái)?shù)據(jù)都可以獲取到。錄制和回放可以使用同一個接口,通過配置項(xiàng)來判斷本次觸發(fā)是錄制還是回放。當(dāng)然錄制模塊需要做好冪等操作,確保不會有重復(fù)得數(shù)據(jù)被插入到數(shù)據(jù)集中。
錄制模塊提供了兩種觸發(fā)錄制的方式。一是定時任務(wù),會在每天的凌晨一點(diǎn)將第一步中篩選出的 plan 的監(jiān)控?cái)?shù)據(jù)收集下來;二是接口觸發(fā)方式,可以指定某些 plan 或某個時間段內(nèi)的 plan 進(jìn)行錄制,主要是重新錄制在定時任務(wù)中錄制失敗的 plan。
回放流程
1.錄制完成以后,本地的 DB 里會包含各個 plan 對應(yīng)的所有監(jiān)控?cái)?shù)據(jù),回放時只要將這些數(shù)據(jù)準(zhǔn)確的返回給 riskfree 系統(tǒng)即可。為了完全擬合對監(jiān)控系統(tǒng)的調(diào)用方式,需要提供一個 mock 層,分別 mock 對基礎(chǔ)監(jiān)控、業(yè)務(wù)監(jiān)控和日志監(jiān)控接口的調(diào)用。同樣的輸入,mock 接口和線上真實(shí)接口返回的數(shù)據(jù)必須完全一致。實(shí)際回放時,在 aone 的配置項(xiàng)里將監(jiān)控系統(tǒng)的 URL 替換成 mock 層的 URL 即可。
2.riskfree 的上層是運(yùn)行層。運(yùn)行層封裝了各種回放模式,包括按 planId 回放、按監(jiān)控類型回放、按時間段回放、快速回放等等。開發(fā)可以通過接口對各種回放模式進(jìn)行一鍵觸發(fā)。運(yùn)行層的底層是一個并發(fā)層,可以配置并發(fā)回放 Plan 的個數(shù)。通過并發(fā)的方式不僅可以壓縮回放時間,提高測試效率。而且可以驗(yàn)證在高并發(fā)的情況下算法的性能表現(xiàn)。
3.最上面一層是展示層,展示方式包括釘釘提醒、測試報(bào)告和趨勢圖。每一次回放的開始和結(jié)束時會有釘釘提醒,結(jié)束時的釘釘提醒包含測試報(bào)告的鏈接。測試報(bào)告分為概述和詳細(xì)信息兩個部分。概述部分包括回放工單總數(shù)、有效攔截?cái)?shù)、誤攔截?cái)?shù)、漏攔截?cái)?shù)、準(zhǔn)確率和召回率,六個指標(biāo),每一個指標(biāo)都是一個錨點(diǎn),可以直接跳轉(zhuǎn)到詳細(xì)信息中的對應(yīng)位置。詳細(xì)信息包括五個部分:漏攔截 Plan 詳情、誤攔截 Plan 詳情、與上次回放結(jié)果不同的 plan 詳情、與線上運(yùn)行結(jié)果不同的 plan 詳情以及全部回放的 plan 詳情五個部分。每一個詳情部分都是一個表格,包括線上 PlanId、回放后產(chǎn)生的線下 planId、本次運(yùn)行結(jié)果、上次運(yùn)行結(jié)果、本次回放耗時、上次回放耗時、對應(yīng)發(fā)布單狀態(tài)等等多個字段。概述信息和詳細(xì)信息中的各個對比字段使得開發(fā)可以迅速準(zhǔn)確的得到本次優(yōu)化的結(jié)果,并快速定位問題。下圖是某次回放結(jié)果的部分截圖。
4.為了直觀的展示歷次算法優(yōu)化的效果,對相同數(shù)據(jù)集、相同監(jiān)控類型的回放結(jié)果自動生成趨勢圖,并在測試報(bào)告中生成對應(yīng)的鏈接。下圖是歷次對 11-03 到 11-10 時間段的 a3 日志分析數(shù)據(jù)進(jìn)行回放的趨勢圖。
寫在最后
算法測試的重中之重是構(gòu)造數(shù)據(jù)集,而線上真實(shí)的數(shù)據(jù)集往往比手工構(gòu)造的數(shù)據(jù)集更有代表性。上文提到的錄制+回放的方法只需稍加變通即可應(yīng)用在各個算法評測項(xiàng)目中。只要將錄制和回放串成一個自動化的流程,即可一勞永逸,不必再擔(dān)心數(shù)據(jù)集的構(gòu)造和更新了。
總結(jié)
以上是生活随笔為你收集整理的一个智能运维算法测试方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 共筑计算新生态 共赢数字新时代
- 下一篇: Aruba与中国电信国际有限公司达成战略