https://github.com/alibaba/jvm-sandbox-repeater/blob/master/docs/user-guide-cn.md
快速錄制自己應用
step0 安裝sandbox和插件到應用服務器
curl -s https://github.com/alibaba/jvm-sandbox-repeater/releases/download/v1.0.0/install-repeater.sh | sh
step1 修改repeater-config.json,啟用攔截點和插件信息
根據需要修改repeater-config.json配置文件,具體配置含義參見:RepeaterConfig.java
repeater-config.json默認下載在~/.sandbox-module/cfg/repeater-config.json
本使用手冊是單機方式使用,實際項目應用時,配置文件需要從服務端拉取,配置變更時服務端推送到對應模塊,框架也提供了拉取和推送配置接口。
{
"degrade": false,
"exceptionThreshold": 1000,
"httpEntrancePatterns": [
"^/regress/.*$"
],
"javaEntranceBehaviors": [
],
"javaSubInvokeBehaviors": [
],
"pluginIdentities": [
"http",
"mybatis",
"ibatis",
"dubbo-provider",
"dubbo-consumer"
],
"repeatIdentities": [
"java",
"http"
],
"sampleRate": 10000,
"useTtl": true
}
2啟動目標應用,以查看進程號
ao@ubuntu2004:~/Documents$ java -jar demo-helloworld.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.0.RELEASE)
查看當前的java 認為的pid
# 使用 jps 查找進程 ID
jps -l
step3 attach sandbox到目標進程
cd ~/sandbox/bin
假設目標JVM進程號為'2343'
./sandbox.sh -p 2343 -P 12580
如果控制臺輸出,則說明啟動成功
NAMESPACE : defaultVERSION : 1.2.1MODE : ATTACHSERVER_ADDR : 0.0.0.0SERVER_PORT : 12580UNSAFE_SUPPORT : ENABLESANDBOX_HOME : /Users/froggen/sandboxSYSTEM_MODULE_LIB : /Users/froggen/sandbox/moduleUSER_MODULE_LIB : ~/.sandbox-module;SYSTEM_PROVIDER_LIB : /Users/froggen/sandbox/providerEVENT_POOL_SUPPORT : DISABLE
2:step2 attach sandbox到目標進程,
./sandbox.sh -p 7641 -P 12581
java.lang.NoClassDefFoundError: com/sun/tools/attach/VirtualMachine
at com.alibaba.jvm.sandbox.core.CoreLauncher.attachAgent(CoreLauncher.java:59)
at com.alibaba.jvm.sandbox.core.CoreLauncher.<init>(CoreLauncher.java:20)
at com.alibaba.jvm.sandbox.core.CoreLauncher.main(CoreLauncher.java:43)
Caused by: java.lang.ClassNotFoundException: com.sun.tools.attach.VirtualMachine
at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 3 more
sandbox load jvm failed : com.sun.tools.attach.VirtualMachine
attach JVM 7641 fail.
報錯需要設置java homeexport JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 # 替換為實際路徑export PATH=$PATH:/usr/local/armtool/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin
export PATH=$PATH:/home/gao/imx_linux/arm_book/env_cmd
export PATH=$JAVA_HOME/bin:$PATH
關閉sanbox
查看日志
tail -200f ~/logs/sandbox/repeater/repeater.log
2025-07-15 14:46:18 INFO initializing logback success. file=/home/gao/.sandbox-module/cfg/repeater-logback.xml;
2025-07-15 14:46:18 INFO module on loaded,id=repeater,version=1.0.0,mode=AGENT
2025-07-15 14:46:18 INFO onActive
2025-07-15 14:46:19 INFO pull repeater config success,config={sampleRate=10000, plugin=[http, mybatis, ibatis, dubbo-provider, dubbo-consumer]}
2025-07-15 14:46:19 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:19 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:19 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:19 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:19 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:19 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:19 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:19 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:20 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:20 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:20 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:20 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:20 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:20 INFO http required javax.servlet.http.HttpServlet class router,waiting for class loading
2025-07-15 14:46:20 INFO using target class loader to load plugin,class=Routing{regexExpresses=[^javax.servlet..*], classLoader=org.springframework.boot.loader.LaunchedURLClassLoader@52af26ee}
2025-07-15 14:46:20 WARN no valid classloader found in routing,routing=PluginClassRouting{targetClass='org.apache.dubbo.rpc.model.ApplicationModel', classPattern='^org.apache.dubbo..*', identity='dubbo', matcher=REPEATER, block=false}
2025-07-15 14:46:20 INFO enable plugin ibatis success
2025-07-15 14:46:20 INFO add watcher success,type=ibatis,watcherId=1000
2025-07-15 14:46:20 INFO enable plugin dubbo-consumer success
2025-07-15 14:46:20 INFO add watcher success,type=dubbo,watcherId=1002
2025-07-15 14:46:20 INFO add watcher success,type=dubbo,watcherId=1004
2025-07-15 14:46:20 INFO enable plugin dubbo-provider success
2025-07-15 14:46:20 INFO add watcher success,type=dubbo,watcherId=1006
2025-07-15 14:46:20 INFO add watcher success,type=dubbo,watcherId=1008
2025-07-15 14:46:20 INFO enable plugin http success
2025-07-15 14:46:21 INFO add watcher success,type=http,watcherId=1010
2025-07-15 14:46:21 INFO enable plugin mybatis success
2025-07-15 14:46:21 INFO add watcher success,type=mybatis,watcherId=1013
2025-07-15 14:46:21 INFO register event bus success in repeat-register
2025-07-15 15:27:03 INFO initializing logback success. file=/home/gao/.sandbox-module/cfg/repeater-logback.xml;
2025-07-15 15:27:03 INFO module on loaded,id=repeater,version=1.0.0,mode=ATTACH
2025-07-15 15:27:03 INFO onActive
2025-07-15 15:27:03 INFO pull repeater config success,config={sampleRate=10000, plugin=[http, mybatis, ibatis, dubbo-provider, dubbo-consumer]}
2025-07-15 15:27:03 INFO using target class loader to load plugin,class=Routing{regexExpresses=[^javax.servlet..*], classLoader=org.springframework.boot.loader.LaunchedURLClassLoader@238e0d81}
2025-07-15 15:27:03 WARN no valid classloader found in routing,routing=PluginClassRouting{targetClass='org.apache.dubbo.rpc.model.ApplicationModel', classPattern='^org.apache.dubbo..*', identity='dubbo', matcher=REPEATER, block=false}
2025-07-15 15:27:03 INFO enable plugin ibatis success
2025-07-15 15:27:03 INFO add watcher success,type=ibatis,watcherId=1000
2025-07-15 15:27:03 INFO enable plugin dubbo-consumer success
2025-07-15 15:27:04 INFO add watcher success,type=dubbo,watcherId=1002
2025-07-15 15:27:04 INFO add watcher success,type=dubbo,watcherId=1004
2025-07-15 15:27:04 INFO enable plugin dubbo-provider success
2025-07-15 15:27:04 INFO add watcher success,type=dubbo,watcherId=1006
2025-07-15 15:27:04 INFO add watcher success,type=dubbo,watcherId=1008
2025-07-15 15:27:04 INFO enable plugin http success
2025-07-15 15:27:04 INFO add watcher success,type=http,watcherId=1010
2025-07-15 15:27:04 INFO enable plugin mybatis success
2025-07-15 15:27:04 INFO add watcher success,type=mybatis,watcherId=1013
2025-07-15 15:27:04 INFO register event bus success in repeat-register
# 檢查是否附加成功
curl -s "http://127.0.0.1:12581/sandbox/default/module/http/sandbox-module-mgr/list" | jq .
http://127.0.0.1:12581/sandbox/default/module/http/sandbox-module-mgr/list
網站輸入這個地址
# 預期返回已加載模塊列表
step3 開始錄制?如何錄制-沒有成功收到錄制數據
根據自己配置的協議,HTTP/Java/Dubbo
進行請求錄制,如錄制成功在repeater.log
會打出具體的TraceId
,同時在~/.sandbox-module/repeater-data/record/
文件中會寫入TraceId
關聯的錄制數據;
錄制成功-生成文件
如果錄制成功,是因為設置了規則,只錄制帶有
"^/regress/.*$",
而之前,官方例子,是帶有regress 的
配置要監控的API的路徑
再訪問http://localhost:8080/demo/hello
http://127.0.0.1:8080/demo/hello?who=Alice
就能再日志看到
025-07-16 17:19:54 INFO broadcast success,traceId=127000001001175265759374910001ed,resp=success
2025-07-16 17:19:57 INFO broadcast success,traceId=127000001001175265759717110002ed,resp=success
2025-07-16 17:19:58 INFO broadcast success,traceId=127000001001175265759867410003ed,resp=success
回放驗證:但是這個路徑每次時間都變化
- bash復制下載
回放的路徑和錄制時候訪問的路徑一樣
只不過最后加traceid
curl -s 'http://127.0.0.1:8080/demo/hello?Repeat-TraceId-X=127000001001175265759867410003ed'
Hello, World!gao@ubuntu2004:~$ curl -s 'http://127.0.0.1:8080/demo/hello?Repeat-TraceId-X=127000001001175265759867410003ed'
Hello, World!gao@ubuntu2004:~$ curl -s 'http://127.0.0.1:8080/demo/hello?Repeat-TraceId-X=127000001001175265759867410003ed'
Hello, World!gao@ubuntu2004:~$
2. 發送回放請求(關鍵!)
必須通過 HTTP Header 傳遞TraceId,而不是URL參數:
http://127.0.0.1:8080/demo/hello?who=Alice
curl -H "Repeat-TraceId-X: 127000001001175271587488610002ed" \
http://127.0.0.1:8080/demo/hello?who=Alice
回放指令
curl -H "Repeat-TraceId-X: 127000001001175271663843110001ed" http://127.0.0.1:8080/demo/hello?who=Alice