当前位置: 首页 > news >正文

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 : 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

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

  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

http://www.dtcms.com/a/287501.html

相关文章:

  • 基于深度学习的微表情识别算法研究
  • 智慧园区工程监控与工单管理系统需求文档
  • Go语言里的map
  • RocketMQ源码级实现原理-NameServer路由机制
  • 解锁C++性能密码:TCMalloc深度剖析
  • 低代码平台ToolJet实战总结
  • Java学习--------消息队列的重复消费、消失与顺序性的深度解析​
  • n8n教程分享,从Github读取.md文档内容
  • Redisson RLocalCachedMap 核心参详解
  • Astro:前端性能革命!从原生 HTML 到 Astro + React 的升级指南
  • Flutter基础(前端教程①⑤-API请求转化为模型列成列表展示实战)
  • 前端面试专栏-工程化:28.团队协作与版本控制(Git)
  • 运用KANO模型分析扫地机器人用户需求
  • LangGraph教程9:LangGraph检查点和Send机制
  • Linux 基础命令:文件和目录操作、文件内容查看、进程管理
  • 【嵌入式电机控制#16】电流环(三):过采样提高采集精度看门狗监测总线电压
  • Nginx 实战 :使用logrotate实现日志轮转与保留策略!
  • 【数据结构】二叉树初阶详解(一):树与二叉树基础 + 堆结构全解析
  • 2025 Data Whale x PyTorch 安装学习笔记(Windows 版)
  • Kotlin方差
  • 403 Forbidden:无权限访问请求的资源如何处理
  • Apache Kafka 学习笔记
  • FreeRTOS—列表和列表项
  • Kafka、RabbitMQ 与 RocketMQ 高可靠消息保障方案对比分析
  • 阿里云服务器 CentOS 7 安装 MySQL 8.4 超详细指南
  • UniApp 优化实践:使用常量统一管理本地存储 Key,提升可维护性
  • 【无标题】重点阅读——如何在信息层面区分和表征卷曲维度,解析黑洞内部的维度区分机制
  • 基于 Google Earth Engine 的 DEM 鞍部自动提取
  • 基于Python的毕业设计选题管理系统设计与实现
  • 【CAN通信】AUTOSAR架构下TC3xx芯片是如何将一帧CAN报文发送出去的