通用流量錄製回放工具 jvm-sandbox-repeater 嚐鮮 (四)——新版帶介面 console 的使用

陳恆捷發表於2020-12-27

前言

在去年repeater剛出來的時候,就已經簡單體驗了一下,也有在公司試用。但由於各種原因,最終沒有落地。現在剛好有機會再研究一下,看官方記錄 console 終於加上了介面,所以也試用並記錄下來。

其它文章連結傳送門:

通用流量錄製回放工具 jvm-sandbox-repeater 嚐鮮記錄 (0716 跑通基於 console 的錄製回放)
通用流量錄製回放工具 jvm-sandbox-repeater 嚐鮮 (二)——repeater-console 使用 (已完成)
通用流量錄製回放工具 jvm-sandbox-repeater 嚐鮮 (三)—— repeater plugin 開發 (完成度 50%)

步驟

由於官方原始碼有做了比較多調整,所以這次記錄還是從零開始。

  • 1、安裝 repeater

執行官方倉庫下的 bin/install-repeater.sh 即可

  • 2、調整 repeater 模式配置,改為用 console

修改 ~/.sandbox-module/cfg/repeater.properties 的值,repeat.standalone.mode 改為 false

  • 3、調整 console 工程中對應配置

repeater-console/repeater-console-start/src/main/resources/application.properties ,調整 mysql 相關配置,改為和自己本地 mysql 資料庫一致

同時請初始化資料庫內容,初始化的sql檔案在:repeater-console/repeater-console-dal/src/main/resources/database.sql

初始化成功,應該會建立了 repeater 這個資料庫,且包括下面四個表:

  • 4、啟動 console 和被測服務

啟動被測服務:

4.1、下載示例專案:https://github.com/chenhengjie123/gs-rest-service
4.2、啟動示例專案:

# 在示例專案 clone 後的根目錄中執行
cd complete
mvn install && java -jar target/*.jar

啟動成功後,應該有類似如下日誌:

...
2020-12-28 07:40:45.949 INFO 32158 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-12-28 07:40:45.952 INFO 32158 --- [ main] hello.Application : Started Application in 2.062 seconds (JVM running for 2.448)

4.3、修復官方倉庫裡 console 一些程式碼問題。

4.3.1、把 repeater-console/repeater-console-start/src/main/resources/velocity 下面的所有檔案,查詢 #parse("/blocks ,統一改替換為 #parse("blocks 。原有程式碼最前面帶上 / 會導致引用找不到報錯
4.3.2、修改 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/page/ReplayController.java 中的 return "/replay/detail"; ,改為 return "replay/detail"; ,去掉雙引號裡面第一個 /
4.3.3、修改 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/test/RegressPageController.java 中的 return "/regress/index"; ,改為 return "regress/index";,去掉雙引號裡面第一個 /

4.4、啟動 console:

#  repeater 專案根目錄進行
mvn install -DskipTests && java -jar repeater-console/repeater-console-start/target/*.jar

啟動成功,應該出現類似下面的日誌:

...
2020-12-28 07:40:27.259 INFO 32116 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8001 (http)
2020-12-28 07:40:27.265 INFO 32116 --- [ main] c.a.repeater.console.start.Application : Started Application in 7.532 seconds (JVM running for 8.065)
  • 5、使用介面化的 console 進行錄製回放

開啟此 url 即可開啟 console 的介面:http://127.0.0.1:8001/regress/index.htm

現在,藉助介面來做一次錄製回放吧。基本套路還是一樣的:

5.1、在 console 增加配置,用於對接應用(注意這個和之前純命令列有點不同,命令列是先完成第二步)
5.2、讓 repeater 注入到被測應用,上報資料到 console
5.3、在 console 中操作,進行錄製和回放

接下來,一步一步操作。

5.1、在 console 增加配置,用於對接應用

點選左側的 【配置管理】,新增如下配置:

應用名:unknown
環境:unknown
配置資訊

{
"useTtl" : true,
"degrade" : false,
"exceptionThreshold" : 1000,
"sampleRate" : 10000,
"pluginsPath" : null,
"httpEntrancePatterns" : [ "^/greeting.*$" ],
"javaEntranceBehaviors" : [ {
"classPattern" : "hello.GreetingController",
"methodPatterns" : [ "greeting" ],
"includeSubClasses" : false
} ],
"javaSubInvokeBehaviors" : [],
"pluginIdentities" : [ "http", "java-entrance", "java-subInvoke", "mybatis", "ibatis" ],
"repeatIdentities" : [ "java", "http" ]
}

點選【儲存】,存下配置

5.2、讓 repeater 注入到被測應用

sh ~/sandbox/bin/sandbox.sh -p `ps -ef | grep "target/gs-rest-service-0.1.0.jar" | grep -v grep | awk '{print $2}'` -P 12580

然後進入 console 的【線上模組】,應該能看到增加了當前這個被測應用的心跳記錄:

5.3、開始錄製。給這個被測應用輸送一些流量

# 手動發出2條請求
$ curl -s 'http://localhost:8080/greeting'
{"id":1,"content":"Hello, World!"}%
$ curl -s 'http://localhost:8080/greeting?name=User'
{"id":2,"content":"Hello, User!"}%

然後開啟 console 的【線上流量】,能看到剛發出的兩條請求已經錄製下來了:

5.4、回放請求。直接點選第一行末尾的回放按鈕,進行回放:

然後,就可以看到回放結果了。稍等幾秒後重新整理下回放結果介面,就能看到執行結果

由於被測應用實際上 id 自增邏輯沒有依賴任何外部服務,每次請求都會自動 +1 ,所以回放記錄是失敗的。

總結

官方的文件還是一如既往的少,程式碼裡面也有點坑(對 velocity 不熟悉,上面的程式碼只是按自己理解改的,如果有更正確的修改姿勢歡迎分享),介面和技術棧都用的比較小眾和比較久遠的的(spring-boot 17年已經去掉對 velocity 模板引擎的支援了)。 而且一個批量回放功能還是隻有按鈕實際沒做的。。。

不過也算是給到大家一個真正示例控制檯該有的樣子,把需要的元素和介面設計都基本給出了。如果想要開箱即用,對 http 介面進行簡單的錄製回放,可以使用這個帶介面的 console 來試用一下。

附錄:過程中的報錯及解決

1、注入 repeater 到被測應用後,console 報錯:

2020-12-28 23:37:28.822 ERROR 39333 --- [nio-8001-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause

java.lang.NullPointerException: null
at com.alibaba.repeater.console.start.controller.api.ConfigFacadeApi.getConfig(ConfigFacadeApi.java:34) ~[classes!/:na]
at sun.reflect.GeneratedMethodAccessor77.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_25]

原因:上報心跳包後,appName 和 environment 和配置對不上。
解決:請確認有至少一個配置,appName 和 environment 都是 unknown

2、報錯 org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource '/blocks/pager.vm'] with root cause ,且介面打不開

原因:沒有按照前面所述修改 console 原始碼,導致引用其他模板的部分根目錄不正確。
解決:按照前面描述,把 #parse("/blocks ,統一改替換為 #parse("blocks 即可。

相關文章