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 : default
VERSION : 1.2.1
MODE : ATTACH
SERVER_ADDR : 0.0.0.0
SERVER_PORT : 12580
UNSAFE_SUPPORT : ENABLE
SANDBOX_HOME : /Users/froggen/sandbox
SYSTEM_MODULE_LIB : /Users/froggen/sandbox/module
USER_MODULE_LIB : ~/.sandbox-module;
SYSTEM_PROVIDER_LIB : /Users/froggen/sandbox/provider
EVENT_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 home
export 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