Arthas(阿尔萨斯) Alibaba 开源的 Java 诊断工具

简介

image-1669187659552

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

官网:https://arthas.aliyun.com/

背景

通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。

开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。

如果您正在考虑在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。

Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永远不会暂停正在运行的线程。

Arthas(阿尔萨斯)能为你做什么?

Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到 JVM 的实时运行状态?
怎么快速定位应用的热点,生成火焰图?
怎样直接从 JVM 内查找某个类的实例?
Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

Arthas 安装部署

Arthas有好几种使用方法,而我喜欢直接集成到工程里面,然后用 arthas tunnel server 连接使用
好了,就是官网里面的 Arthas Tunnel + Arthas Spring Boot Starter
下面说一下记录一下具体的方法

客户端安装部署

说明:这个呢就是被监控,被诊断的应用,比如我的就是edei

一、Arthas Spring Boot Starter 方式

配置 maven 依赖:

	<dependency>
            <groupId>com.taobao.arthas</groupId>
            <artifactId>arthas-spring-boot-starter</artifactId>
            <version>${arthas.version}</version>
        </dependency>

应用启动后,spring 会启动 arthas,并且 attach 自身进程。

配置属性

通过配置 tunnel server 实现远程管理:

arthas.agent-id=hsehdfsfghhwertyfad
arthas.tunnel-server=ws://47.75.156.201:7777/ws

全部支持的配置项:参考 ,当然这些配置都是可以通过代码编程修改的,ws://47.75.156.201:7777/ws 这个就是 tunnel server 服务的IP加监听端口,至于ws,是固定写法,记得修改成自己的IP

二、非 spring boot 应用使用方式(这个就是现在使用的方式,重点说一下)

非 Spring Boot 应用,可以通过下面的方式来使用:

        <dependency>
            <groupId>com.taobao.arthas</groupId>
            <artifactId>arthas-agent-attach</artifactId>
            <version>${arthas.version}</version>
        </dependency>
        <dependency>
            <groupId>com.taobao.arthas</groupId>
            <artifactId>arthas-packaging</artifactId>
            <version>${arthas.version}</version>
        </dependency>
import com.taobao.arthas.agent.attach.ArthasAgent;

public class ArthasAttachExample {

	public static void main(String[] args) {
		ArthasAgent.attach();
	}

}

上面是官方的写法,说一下我这边的,我这边是个老项目,没有用maven去管理项目,所以呢,我需要把依赖的jar包都下载下来弄到工程里面,可以参考我的之前的文章,maven技巧–拷贝复制导出maven依赖jar包到指定目录

三、真实环境集成

下载依赖jar包

最后jar包弄好以后就是四个,引入工程里面就可以了

image-1669188915349

启动Agent客户端

在tomcat的启动里面加入这个方法,启动Agent客户端就可以了

public static String startArthasAgent() {
        HashMap<String, String> configMap = new HashMap<String, String>();
        configMap.put("arthas.username", "arthas");
        configMap.put("arthas.password", "arthas");
        configMap.put("arthas.telnetPort", "-1");
        configMap.put("arthas.httpPort", "-1");
        configMap.put("arthas.appName", "arthas");
        configMap.put("arthas.agentId", "arthas");
        configMap.put("arthas.tunnelServer", "ws://127.0.0.1:7777/ws");
        ArthasAgent.attach(configMap);
        return "arthas agent 启动成功,appName:arthas";
    }

参数说明

  1. arthas.username,arthas.password,是鉴权,在Arthas Tunnel Server 连接这个agent客户端进行诊断时,授权必须要鉴权 语法命令:
auth --username arthas arthas

#如果username 是arthas或者未配置,就可以直接 输入 auth 密码 这里就 auth arthas 就可以,也就是可以省略用户名 直接输入  auth + 密码
  1. arthas.telnetPort,arthas.httpPort配置成-1,这样我们一台机器可以同时启动多个agent,也不会端口冲突
  2. arthas.agentId 很重要,我们后面使用Arthas Tunnel Server诊断应用的时候需要这个agentId才能连接
  3. 当arthas.agentId配置后,arthas.appName可以忽略
  4. arthas.tunnelServer 就是我们配置的用于统一管理的server端的IP和端口,后面有讲

Agent客户端部分完成了,我们来配置Arthas Tunnel Server ,也就是我们统一管理的server端

Arthas Tunnel Server 服务端安装部署

通过 Arthas Tunnel Server/Client 来远程管理/连接多个 Agent。

比如,在流式计算里,Java 进程可以是在不同的机器启动的,想要使用 Arthas 去诊断会比较麻烦,因为用户通常没有机器的权限,即使登陆机器也分不清是哪个 Java 进程。

在这种情况下,可以使用 Arthas Tunnel Server/Client。

下载Arthas Tunnel Server

https://github.com/alibaba/arthas/releases

Arthas tunnel server 是一个 spring boot fat jar 应用,直接java -jar启动:

java -jar  arthas-tunnel-server.jar

默认情况下,arthas tunnel server 的 web 端口是8080,arthas agent 连接的端口是7777。

启动之后,可以访问 http://127.0.0.1:8080/ ,再通过agentId连接到已注册的 arthas agent 上。

我这里一般喜欢写好一个批处理,同时修改一下端口8000,批处理的代码是这样的:

title -8000
java -Xms1024m -Xmx1024m -jar arthas-tunnel-server-3.6.7-fatjar.jar --server.port=8000

启动arthas tunnel server服务

  • 启动我们新建的批处理文件

image-1669191837579

  • 打开浏览器输入http://127.0.0.1:8000

1669191964843

  • 我们在右侧AgentId框里输入我们之前Agent里面配置的arthas.agentId 这里就是arthas,点击Connect

1669192079649

  • 看到我们已经能连到我们的Agent了,然后我们先来一个dashboard命令看看

1669192442054

  • 提示我们需要使用auth鉴权,这就用到我们agent代码里面配置的 arthas.username,arthas.password,下面我们执行下面命令鉴权
auth arthas

1669192701661

  • 再来一遍dashboard命令

image-1669192790435

好了,下面你就可以为所欲为了!!!

注意

这个浏览器的操作是在谷歌浏览器里面完成的,我试过别的浏览器,不太灵光,所有,如果大家碰到莫名其妙的问题,可以切换到谷歌浏览器试试。bye

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×