在上一篇文章中,把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來嘗試了下,如果真的運用到實際專案當中,還得繼續探索
我們下期再會