jvm-sandbox-repeater 录制和回放

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

回放验证:但是这个路径每次时间都变化

  1. 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

相关推荐
神仙别闹10 小时前
基于C#+SQlite开发(WinForm)个人日程管理系统
开发语言·jvm·c#
qianshanxue111 天前
jvm-sandbox-repeater 编译测试
jvm
℡余晖^2 天前
每日面试题08:wait()和sleep()的区别
java·开发语言·jvm
布朗克1682 天前
java常见的jvm内存分析工具
java·jvm·数据库
胡八一2 天前
SQLite / LiteDB 单文件数据库为何“清空表后仍占几 GB”?——原理解析与空间回收实战
jvm·数据库·sqlite
秋林辉2 天前
Jfinal+SQLite处理 sqlite数据库执行FIND_IN_SET报错
jvm·数据库·sqlite
cui_hao_nan2 天前
JVM——JVM由哪部分组成?
jvm
西奥_2 天前
【JVM】运行时数据区域
java·jvm
cui_hao_nan2 天前
JVM——为什么Java8移除了永久代(PermGen)并引入了元空间(Metaspace)?
jvm