流量錄製回放工具jvm-sandbox-repeater入門篇——錄製和回放
在上一篇文章中,把repeater服務部署介紹清楚了,詳細可見:流量錄製回放工具jvm-sandbox-repeater入門篇——服務部署
今天在基於上篇內容基礎上,再來分享下流量錄製和回放的相關內容。
啟動被測服務
克隆源碼
git clone //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為://ip:port/regress/index.htm
服務啟動,會有默認的配置,如下所示:
這裡需要修改下,因為默認的配置,有些跟我們啟動的項目不一樣,直接編輯即可,字段說明在剛才已有講解
在線模塊
以attach模式啟動sandbox,環境和應用名都是unknown,如下所示:
流量錄製
完成上述配置後,我們來錄一個請求試下,訪問://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來嘗試了下,如果真的運用到實際項目當中,還得繼續探索
我們下期再會