JvmEye-基于Arthas重构的Java诊断平台

JvmEye

JvmEye-在线体验
JvmEye-功能介绍
JvmEye-实践用例
JvmEye-源码

基于Arthas的命令源码重新架构设计的Java诊断平台,移植了Arthas大部分的诊断命令,大大降低了诊断使用的门槛,实现了可视化的诊断交互,同时优化和封装了一些场景的使用,比如:封装了Spring的资源文件列表查看、Spring的配置信息查看、实例方法的直接调用(结合jrebel热更可以实现零重启的在线调试)等,还有就是watch、trace、stack支持批量客户端在同一个session里面进行展示和清除,并引入了自动检测session是否存在来还原增强的代码。

另外,整个平台的逻辑架构简化,并集成了前端,可以很简单的实现本地编译和构建,构建好的包也能够很简单的进行启动运行,没有任何的第三方依赖,扩展和封装也非常简单。

该平台由个人花费业余时间肝出来的,没有经过系统全面的测试,勿应用于生产环境。平台的登录认证、权限管理以及审计相关都没有实现,有需要的可以自行基于server层进行扩展。

平台架构

在这里插入图片描述

快速体验

下载agent:jvm-eye-agent-1.0.jar

下载server:jvm-eye-server-1.0.jar

1. attach到java的进程

cd agent所在目录
java -Xbootclasspath/a:"%JAVA_HOME%\lib\tools.jar" -jar jvm-eye-agent-1.0.jar jvm的PID(JPS获取) jvm的服务名 127.0.0.1 5555

例如,jps获取的PID为12345,jvm的服务名为DemoSimple,那么执行如下命令即可:

java -Xbootclasspath/a:"%JAVA_HOME%\lib\tools.jar" -jar jvm-eye-agent-1.0.jar 12345 DemoSimple 127.0.0.1 5555

2. 启动server

java -jar jvm-eye-server-1.0.jar

3. 浏览器可视化诊断

访问地址:http://localhost:9099
在这里插入图片描述

本地构建体验

1. 代码下载和构建

git clone https://github.com/gy4j/JvmEye.git
cd JvmEye
mvn clean package

在这里插入图片描述

2. 启动Demo(参考集成方式说明集成自己的应用)

占用端口:9091

cd jvm-eye-demo\jvm-eye-demo-spring-boot\target
java -jar jvm-eye-demo-spring-boot-1.0-SNAPSHOT

在这里插入图片描述

3. 启动Server

占用端口:9099,5555

cd jvm-eye-server\target
java -jar jvm-eye-server-1.0-SNAPSHOT.jar

请添加图片描述

4. 访问诊断界面

界面地址:http://localhost:9099

1. 连接的客户端列表

在这里插入图片描述

2. 客户端诊断相关

在这里插入图片描述

集成方式说明

集成后,可以通过诊断界面来观察是否集成成功,成功的话列表里面会出现对应的客户端

1. javaagent方式

增加vmoption:-javaagent:G:\arthas\git\test\JvmEye\jvm-eye-agent\target\jvm-eye-agent-shade.jar=DemoSimple,127.0.0.1,5555

在这里插入图片描述

2. attach方式

TODO:attach的时候可以参考arthas集成jps命令进行交互式的pid选择

cd G:\arthas\git\test\JvmEye\jvm-eye-agent\target

java -Xbootclasspath/a:"%JAVA_HOME%\lib\tools.jar" -jar jvm-eye-agent-shade.jar 需要诊断的pid DemoSimple 127.0.0.1 5555

例如:

第一步:通过jps获取需要需要诊断的PID

jps

在这里插入图片描述

第二步:执行attach

cd G:\arthas\git\test\JvmEye\jvm-eye-agent\target
java -Xbootclasspath/a:"%JAVA_HOME%\lib\tools.jar" -jar jvm-eye-agent-shade.jar 11352 DemoSimple 127.0.0.1 5555

在这里插入图片描述

3. starter依赖方式(SpringBoot项目)

参考Demo项目:jvm-eye-demo-spring-boot

增加pom依赖:

<dependency>
    <groupId>com.gy4j</groupId>
    <artifactId>jvm-eye-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

增加配置项:

spring:
  application:
    name: DemoSpringBoot # clientName
jvm:
  eye:
    host: localhost # server的ip
    port: 5555 # server的port
    enable: true # 是否开启诊断,默认false

4. 直接依赖+初始化EyeClient的方式

参考Demo项目:jvm-eye-demo-simple

增加pom依赖:

<dependency>
    <groupId>com.gy4j</groupId>
    <artifactId>jvm-eye-client</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

增加代码初始化EyeClient:

// 指定clientName为DemoSimple,指定server的ip(localhost)和port(5555)
new EyeClient(ByteBuddyAgent.install(), "DemoSimple", "localhost", 5555);

本地开发

代码结构说明

模块名模块说明
jvm-eye-agentjavaagent和jvm attach的启动模块,使用方式参考集成方式说明
jvm-eye-clientNIO client模块,用于和server端通信
jvm-eye-core核心的逻辑模块,所有工具类、命令相关封装、接口封装等
jvm-eye-serverNIO server模块,用于和client端通信,占用端口:5555
Web后台模块,用于和web端交互,包括http和websocket,占用端口:9099
jvm-eye-spring-boot-starterstarter封装,用于SpringBoot项目的快速集成
jvm-eye-ui前端,基于vue2+ElementUI实现,满足可视化的诊断需求,占用端口:8080(本地启动占用,打包后集成到jvm-eye-server里面共用9099端口)
jvm-eye-demo-simple简单的DEMO项目,同于调试集成方式和命令功能
jvm-eye-demo-spring-boot基于SpringBoot starter集成的DEMO项目,用于调试集成方式和命令功能,占用端口:9091

本地开发说明

  1. 启动EyeServerApplication(占用端口:9099和5555)

  2. jvm-eye-ui目录下启动前端:npm run serve(占用端口:8080)

  3. 启动待诊断项目(使用DEMO项目,或者参考集成方式集成自己的待诊断项目,最好选用集成方式3或者4,方便断点调试)

  4. 访问诊断界面 http://localhost:8080 进行验证和功能开发

Arthas命令对比说明

命令名称命令类型完成状态Command前端集成
watchTimesWatchCommand已集成
vmoptionRealTimeVmOptionCommand已集成
versionRealTimeClientInfoCommand已集成
traceTimesTraceCommand已集成
threadRealTimeThreadAllCommand已集成
syspropRealTimeSysPropCommand已集成
sysenvRealTimeSysEnvCommand已集成
stackTimesStackCommand已集成
smRealTimeMethodCommand已集成
scRealTimeClassCommand已集成
resetRealTimeResetCommand已集成
ognlRealTimeOgnlCommand不集成
memoryRealTimeMemoryCommand已集成
loggerRealTimeLoggerLevelCommand LoggerInfoCommand已集成
jvmRealTimeJvmCommand已集成
jadRealTimeJadCommand已集成
heapdumpFileHeapDumpCommand已集成
classloaderRealTimeClassLoaderCommand已集成
vmtoolRealTimeVmToolCommand不直接集成,封装Spring配置和资源查询、实例方法调用等
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arthas(阿尔萨斯)是阿里巴巴开源的Java诊断工具,深受开发者喜爱。 当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 是否有一个全局视角来查看系统的运行状况? 有什么办法可以监控到JVM的实时运行状态? 怎么快速定位应用的热点,生成火焰图? Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和诊断。   Arthas开源的Java诊断工具 更新日志: v3.5.1 Add vmtool command Remove the useless resetClassFileTransformer in Enhancer 对于非chunk response,返回标准的content-length字段 The jvm command may throw exception: java.lang.NullPointerException jad的一个小小的显示问题 bug remove env JAVA_TOOL_OPTIONS 去掉默认配置项 arthas.enhanceLoaders=java.lang.ClassLoader ,避免attach后导致系统负载飙升 Thread -n -1 不能正常工作 bug 当找不到java进程时,提示不清晰,应该提示用户执行jps命令 增加一个 ognl 的在线,可编辑的示例,帮助用户自己调试 ognl表达式 当Object输出时,可能会抛出异常,打印 ERROR DATA!!! exception message: null 把 arthas-demo 改名为 math-game ,避免新用户感到疑惑 arthas spring boot starter启动失败后,没有打印具体出错端口

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值