流量錄製回放工具jvm-sandbox-repeater入門篇——錄製和回放

溫一壺清酒發表於2022-05-07

在上一篇文章中,把repeater服務部署介紹清楚了,詳細可見:流量錄製回放工具jvm-sandbox-repeater入門篇——服務部署

今天在基於上篇內容基礎上,再來分享下流量錄製和回放的相關內容。

啟動被測服務

克隆原始碼

git clone https://github.com/chenhengjie123/gs-rest-service.git

這個專案是在看其他帖子看到的,是個開源的demo,我在這也引用下。

mvn install

進入到專案路徑:/gs-rest-service/complete,使用mvn install命令,把專案中打好的包,放到本地倉庫

出現如下介面,說明命令執行成功

在 target 目錄下,可以看到,生成了一個jar包,如下所示

啟動專案

在 target 目錄下,使用命令 java -jar gs-rest-service-0.1.0.jar 啟動專案,出現如下所示內容,專案啟動成功

啟動/關閉sandbox

attach啟動

先獲取專案PID,有2種方式

方式一:在啟動專案的時候,會展示PID,如上圖所示

方式二:使用命令ps -ef|grep gs-rest-service-0.1.0.jar可以獲得,我這裡獲取到的PID是:12836,如下所示

獲取到專案PID後,到 sandbox 目錄 /root/sandbox/bin下,使用命令./sandbox.sh -p 12836 -P 8002,執行命令後,出現如下內容,說明成功

也可以通過檢視sandbox日誌來確定,是否有啟動成功,日誌如下所示:

引數說明

  • p 被錄製應用程式號
  • P repeater啟動埠,這個每個人定義的都可以不同,一定是一個未佔用的埠

attach 模式下,錄製應用名和錄製環境這兩個引數都會被預設為 unknown

attach關閉

執行命令./sandbox.sh -p 12836 -S,出現如下內容,jvm-sandbox關閉成功

配置說明

repeater-logback.xml

該配置檔案主要是控制 repeater 的日誌列印路徑地址以及列印等級。

一般會在需要調整日誌等級的時候修改。

實際生效的配置是位於~/.sandbox-module/cfg 中的 repeater-logback.xml。

在專案的 bin 目錄下也有一份 repeater-logback.xml,這份是在執行安裝指令碼的時候會被複制到~/.sandbox-module/cfg 下的。

每次修改這份配置,都需要重啟 repeater 才能生效。

可以修改日誌級別,預設是info

錄製回放配置欄位

這個配置,主要依賴com.alibaba.jvm.sandbox.repeater.plugin.domain.RepeaterConfig類,參考之前的博文,引用下欄位配置說明,如下所示:

配置名 配置含義 引數說明 備註
pluginIdedentities 錄製所使用的外掛列表,配置了相應的外掛名稱,才能啟用對應類別外掛類別的錄製 外掛名稱有效值有:"http", "java-entrance", "java-subInvoke", "mybatis", "redis","ibatis","dubbo-consumer","dubbo-provider" 1、外掛配置生效還需要~/.sandbox-module/plugins/有對應的外掛 jar 包。2、該引數有效值欄位對應的取值是原始碼中實現了InvokePlugin的類的identity方法。
repeatIdentities 回放所使用的外掛列表,配置了對應的外掛,才能進行對應類別的回放 外掛名稱有效值有:"http", java", "dubbo" 1、外掛配置生效還需要~/.sandbox-module/plugins/有對應的外掛 jar 包。2、該引數有效值欄位對應的取值是原始碼中實現了Repeater的類的identity方法。
httpEntrancePatterns 需要錄製和回放的 http 介面,需要同時在 pluginIdedentities 和 repeatIdentities 中都配置了http這個配置才生效 連結的路徑 引數支援正規表示式:"^/alertService/.*$"
javaSubInvokeBehaviors 需要錄製和 mock 的 java 方法的配置,需要 pluginIdedentities 配置了java-subInvoke這個配置才生效 類名、方法名、以及是否包含子方法(若為 true,則匹配該類下的所有子類或者實現類,實際是否可用,有待驗證),支援正規表示式 如下配置的意思就是 com.test.server.utils 包下所有類和所有方法{"classPattern": "com.test.server.utils.","methodPatterns": [ "" ],"includeSubClasses": false}
javaEntranceBehaviors 需要錄製和回放的 java 方法的入口,需要同時在 pluginIdedentities 配置了java-entrance以及 repeatIdentities 配置了java這個配置才生效 類名、方法名、以及是否包含子方法(若為 true,則匹配該類下的所有子類或者實現類,實際是否可用,有待驗證),支援正規表示式 如下配置的意思就是 com.test.utils 包下所有類和所有方法{"classPattern": "com.test.utils.","methodPatterns": [ "" ],"includeSubClasses": false}如果該入口方法在某個 http 入口的呼叫鏈路下,可能不會被錄製到,如 com.test.controller.hello() 方法,本身對應著 “/hello 的訪問路徑,則錄製時無法錄製到以這個 hello 方法為入口的 java 錄製記錄”
pluginsPath 外掛路徑 String,預設填 null 即可 預設填 null 即可
exceptionThreshold 異常發生閾值;預設 1000 當ExceptionAware感知到異常次數超過閾值後,會降級模組 Integer,預設填 1000 即可 當前只使用過 1000,未出現過降級情況。當出現降級則不再進行任何錄製。涉及的關鍵方法:com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultEventListener#access
degrade 開啟之後,不進行錄製,只處理回放請求 boolean,預設填 false 即可 當前只使用過 false,按照字面理解就是當這個改為 true 之後,不再進行錄製。涉及的關鍵方法:com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultEventListener#access
useTtl 是否開啟 ttl 執行緒上下文切換,開啟之後,才能將併發執行緒中發生的子呼叫記錄下來,否則無法錄製到併發子執行緒的子呼叫資訊,原理是將住執行緒的 threadLocal 拷貝到子執行緒,執行任務完成後恢復 boolean,預設填 true 即可 預設使用 true,開啟執行緒跟蹤
sampleRate 取樣率;最小粒度萬分之一 Integer 預設填 10000 即可 當前只使用過 10000,可以結合這個方法理解com.alibaba.jvm.sandbox.repeater.plugin.core.trace.TraceContext#inTimeSample

repeater-console頁面

配置管理

我們通過repeater-console頁面,檢視對應的配置,url為:http://ip:port/regress/index.htm

服務啟動,會有預設的配置,如下所示:

這裡需要修改下,因為預設的配置,有些跟我們啟動的專案不一樣,直接編輯即可,欄位說明在剛才已有講解

線上模組

以attach模式啟動sandbox,環境和應用名都是unknown,如下所示:

流量錄製

完成上述配置後,我們來錄一個請求試下,訪問:http://ip:port/greeting?name=yihuqingjiu,頁面返回內容,可以在啟動的專案下,檢視對應日誌,如下所示:

驗證是否有錄製成功,有2種方式

頁面檢視

直接通過repeater-console的線上流量頁面檢視,如果有剛操作的請求,說明錄製成功,如下所示:

日誌檢視

檢視repeater日誌,有相對應的成功日誌,如下所示:

相對應的,可以看下資料庫是否正常落值,檢視record表,是有對應資料的,如下所示:

上述方式驗證,說明流量錄製成功了

流量回放

流量回放的話,就直接點選已錄製的請求,右側有個回放按鈕,直接點選即可。

我們來嘗試一下,操作回放後,檢視回放詳情

看截圖,看到回放的結果是失敗的,為何失敗呢,看下具體資訊

因為id值不一致,所以判斷回放失敗,如下所示:

我自己寫了個簡單的demo,生成隨機數的,程式碼中做了個mock,所以每次回放都是成功的

啟動服務、修改配置、流量錄製這些過程就不重複了,直接看下回放結果

回放詳情如下所示:

回放差異對比如下所示:

問題

每次分享內容,都會遇到些問題,所以整理下。

錄製不成功

錄製遇到最大的一個問題,就是錄製不成功,後面查日誌和對比配置,是正規表示式寫錯的問題

repeater下的日誌,如下所示:

日誌中明確提示ignore this request

後面排查repeater-console頁面配置管理中的正規表示式,發現正則寫錯,沒有匹配到url的原因導致。

修改配置不生效

這個問題算是上一個問題的續集,為啥這麼說呢。我之前把配置修改後,再次請求去錄製,發現還是不成功

後來發現,修改repeater配置,需要重啟專案,attach到sandbox,只有在attach的時候,才會重新去讀取配置

服務啟動順序

這個點,也不算問題吧,但我也遇到過,就是服務啟動的順序。

先啟動repeater-console服務

再啟動被測服務

最後通過attach模式啟動sandbox

如果中途有修改repeater-console配置項,上述步驟重來即可

以上就是今天分享的內容了,錄製和回放只是以簡單的demo來嘗試了下,如果真的運用到實際專案當中,還得繼續探索

我們下期再會

相關文章