在IDEA中管理和监听arthas应用

近期和arthas-idea-plugin插件社区沟通,为插件贡献了部分功能,下文为全文转载:
原文链接:《在IDEA中管理和监听arthas应用》

arthas idea plugin 插件方便了我们使用 Arthas,对于命令不熟悉同学也可以快速上手排查问题。但是当一个应用有多个实例时,为了监听某一个请求我们通常会打开多个浏览器窗口来启动监听,使用起来多少有点不方便。故扩展了在 IDEA 内部直接监听的功能。社区内相关 Issue:https://github.com/WangJi92/arthas-idea-plugin/issues/92

如果团队的工作模式是进入宿主机手动启动Arthas命令来监听本机应用,那么该插件并不能帮助到这部分用户。插件适用的工作模式是使用Tunnel-Serverarthas-spring-boot-starter,将应用注册到Tunnel-Server且应用部署了多个实例,每次执行监听需要去多个机器监听的痛点场景。

插件特性

  1. 基于 arthas idea plugin,不打断原插件的使用流程,润物细无声。
  2. IDEA 内直连 Tunnel-Server,无需打开浏览器,代码异常可快速定位行号。
  3. 同时连接单应用多实例,无需拷贝命令后打开多个浏览器窗口监听。

配置插件

添加Arthas Tunnel-Server地址

点击Add按钮,添加Tunnel-Server(插件不校验地址的正确性,请保证填写的地址准确无误)。

  1. Name:可根据自己的情况命名
  2. TunnelAddress:HTTP服务器地址,插件通过Tunnel-Server的Web端口获取信息,根据服务器部署填写HTTP/HTTPS协议
  3. WsAddress:Socket服务器地址,插件和Tunnel-Server Web端原理一致,伪装成Socket客户端获取信息和发送指令,根据服务器部署填写WS/WSS协议

从列表中删除Tunnel-Server

选中待删除的行,点击删除即可

直接修改单元格配置

点击Apply或OK后生效

命令窗口打开选择

可选择弹出命令发送窗口,如果不勾选则此功能不会启用。


使用插件

1. 选择待监听的应用,执行监听

  1. 选择 NameServer 用以切换环境(Tunnel-Server)
  2. 选择 App 用以切换应用
  3. 选择 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

  1. 创建一个SpringBoot的Demo应用。
  2. 引入 Starter 的依赖(当前最新版本 4.0.0)。
<dependency>
  <groupId>com.taobao.arthas</groupId>
  <artifactId>arthas-spring-boot-starter</artifactId>
  <version>4.0.0</version>
</dependency>
  1. 再在 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
  1. 启动应用,发现日志中有如下参数就说明配置完成。
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,就可以看到下面的内容了,最终实现在浏览器中监听应用。


建议

  1. Tunnel-Server 具备较高权限,官方不建议部署到公网可访问的地址上。
  2. Tunnel-Server 为内部诊断工具,没有开发对应的权限控制能力,需注意风险。

工作原理

插件主要通过Tunnel-Server Web UI所使用的接口,将其利用起来在IDEA中使用,仅使用其三个接口:

  • /api/tunnelApps 获取所有App
  • /api/tunnelAgentInfo?app= 获取App的所有Agent
  • ws?method=connectArthas&id=&targetServer= 通过WS连接tunnel-server实时通信

整体的交互流程如下序列图:

其它
目前仅支持部分常用菜单,其它菜单在 IDEA 内呈现不够优雅或无法满足,故未做支持。
支持的菜单列表:

  • watch
  • trace
  • stack
  • sc
  • sm
  • getstatic
  • jad
  • thread
  • monitor
  • vmoption
    对于不支持的菜单,其中部分也可以通过【执行自定义指令】自行拷贝执行,当然,后续也可以考虑补充部分菜单。