近期和arthas-idea-plugin插件社区沟通,为插件贡献了部分功能,下文为全文转载:
原文链接:《在IDEA中管理和监听arthas应用》
arthas idea plugin
插件方便了我们使用 Arthas
,对于命令不熟悉同学也可以快速上手排查问题。但是当一个应用有多个实例时,为了监听某一个请求我们通常会打开多个浏览器窗口来启动监听,使用起来多少有点不方便。故扩展了在 IDEA
内部直接监听的功能。社区内相关 Issue:https://github.com/WangJi92/arthas-idea-plugin/issues/92
如果团队的工作模式是进入宿主机手动启动Arthas
命令来监听本机应用,那么该插件并不能帮助到这部分用户。插件适用的工作模式是使用Tunnel-Server
和arthas-spring-boot-starter
,将应用注册到Tunnel-Server
且应用部署了多个实例,每次执行监听需要去多个机器监听的痛点场景。
插件特性
- 基于
arthas idea plugin
,不打断原插件的使用流程,润物细无声。 - 在
IDEA
内直连Tunnel-Server
,无需打开浏览器,代码异常可快速定位行号。 - 同时连接单应用多实例,无需拷贝命令后打开多个浏览器窗口监听。
配置插件
添加Arthas Tunnel-Server地址
点击Add按钮,添加Tunnel-Server
(插件不校验地址的正确性,请保证填写的地址准确无误)。
- Name:可根据自己的情况命名
- TunnelAddress:HTTP服务器地址,插件通过
Tunnel-Server
的Web端口获取信息,根据服务器部署填写HTTP/HTTPS协议- WsAddress:Socket服务器地址,插件和
Tunnel-Server Web
端原理一致,伪装成Socket
客户端获取信息和发送指令,根据服务器部署填写WS/WSS协议
从列表中删除Tunnel-Server
选中待删除的行,点击删除即可
直接修改单元格配置
点击Apply或OK后生效
命令窗口打开选择
可选择弹出命令发送窗口,如果不勾选则此功能不会启用。
使用插件
1. 选择待监听的应用,执行监听
- 选择 NameServer 用以切换环境(Tunnel-Server)
- 选择 App 用以切换应用
- 选择 Agent 用以切换实例(可选all agents来监听所有实例)
📢:当App/Agent未出现可选项时,请检查配置的TunnelAddress地址是否正确。
工具栏介绍
重启(Rerun)
类似于 watch、trace 等指令,一般通过 -n 指定了执行几次,如果执行完毕,可以通过此按钮重新开始一次监听。
调整命令(Modify)
类似于 watch、trace 等指令,假如一开始 -x 的深度不够,需要调整时使用,或监听某些参数时,需要调整SpEL表达式时可以使用。
📢:如需要调整监听的方法或切换其它指令时,建议重新开始而非通过此按钮,操作会更顺畅。
停止(Stop)
立即停止监听,类似于 Web UI 上面的 Ctrl+C。
清空输出面板(Clear ALL)
清空输出面板,不会停止监听。
演示
执行自定义指令
执行过程中调整其他指令
插件保留了用户自定义输入的入口,可以用于拷贝 Get All Available Command处拷贝的指令。
通过键盘 ↑ ↓键,可以快速切换历史已执行的指令。
回车或点击按钮 Exec 可执行指令。
直接执行自定义指令
为方便直接拷贝指令发送至多个实例执行,在右键菜单注册了 OpenArthasTerminal 用于打开一个空白的对话窗口。
异常定位行号
部署Tunnel-Server
在大部分单机的场景下,我们可能直接在机器上运行 java -jar arthas-boot.jar 来运行一个单机版的 Arthas 来监听应用,但在微服务架构下,一个服务可能部署了多个实例,分布在不同的机器上,再登录到机器上挨个运行单机版就较为不便了。
官方也考虑到了这种情况,所以也提供了对应的解决方案,那就是 Arthas Tunnel-Server,下文摘自官网:
通过 Arthas Tunnel Server/Client 来远程管理/连接多个 Agent。
比如,在流式计算里,Java 进程可以是在不同的机器启动的,想要使用 Arthas 去诊断会比较麻烦,因为用户通常没有机器的权限,即使登陆机器也分不清是哪个 Java 进程。
在这种情况下,可以使用 Arthas Tunnel Server/Client。
参考:
● 1: Web Console
● 2: Arthas Spring Boot Starter
下载并部署 Tunnel-Server
下载Tunnel-Server(https://github.com/alibaba/arthas/releases),因为Server本身也是一个 jar 包,所以可以直接通过命令启动。
具体细节见官方文档:arthas 官网
java -Darthas.enable-detail-pages=true -jar ~/.arthas/arthas-tunnel-server.jar
默认情况下,Arthas Tunnel-Server 的 web 端口是8080,arthas agent连接的端口是7777。
启动应用并连接至Tunnel-Server
通常情况下,我们是通过 java -jar arthas-boot.jar
启动一个 Arthas
应用来监听本机的 Java
应用。但如果我们是使用 SpringBoot
来构建应用,那么更推荐使用 Arthas Spring Boot Starter
(只支持SpringBoot2.+) ,应用启动后,Spring
会启动 Arthas
,并且 Arrach
自身的进程。
jar -jar 连接 tunnel-server
java -jar arthas-boot.jar --tunnel-server 'ws://127.0.0.1:7777/ws'
SpringBoot Starter 连接 tunnel-server
- 创建一个SpringBoot的Demo应用。
- 引入 Starter 的依赖(当前最新版本 4.0.0)。
<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
- 再在 application.properties 文件中指定几个参数。
arthas.http-port=0
arthas.telnet-port=0
arthas.app-name=${spring.application.name}-${spring.profiles.active}
arthas.tunnel-server=ws://127.0.0.1:7777/ws
- 启动应用,发现日志中有如下参数就说明配置完成。
2024-09-21T23:11:48.536+08:00 INFO 90583 --- [arthas-terminal-demo] [ main] c.a.arthas.spring.ArthasConfiguration : Arthas agent start success.
Tunnel-Server的管理页面
完成上面的两个步骤之后,打开浏览器访问 http://localhost:8080/apps.html,就可以看到下面的内容了,最终实现在浏览器中监听应用。
建议
- Tunnel-Server 具备较高权限,官方不建议部署到公网可访问的地址上。
- Tunnel-Server 为内部诊断工具,没有开发对应的权限控制能力,需注意风险。
工作原理
插件主要通过Tunnel-Server Web UI所使用的接口,将其利用起来在IDEA中使用,仅使用其三个接口:
/api/tunnelApps
获取所有App/api/tunnelAgentInfo?app=
获取App的所有Agentws?method=connectArthas&id=&targetServer=
通过WS连接tunnel-server实时通信
整体的交互流程如下序列图:
其它
目前仅支持部分常用菜单,其它菜单在 IDEA 内呈现不够优雅或无法满足,故未做支持。
支持的菜单列表:
- watch
- trace
- stack
- sc
- sm
- getstatic
- jad
- thread
- monitor
- vmoption
对于不支持的菜单,其中部分也可以通过【执行自定义指令】自行拷贝执行,当然,后续也可以考虑补充部分菜单。