线上诊断神器-Arthas 实践

文章目录

  • 线上诊断神器-Arthas 实践
    • Arthas 简介
    • Arthas 实践
      • 部署 mall-tiny-arthas
      • 启动 arthas-boot
      • 常用命令
      • SpringBoot 集成 Arthas
      • Arthas 可视化工具-ArthasTunnel
      • IDEA 插件


线上诊断神器-Arthas 实践

Arthas 简介

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

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

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到 JVM 的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?
  8. 怎样直接从 JVM 内查找某个类的实例?

Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

Arthas 实践

部署 mall-tiny-arthas

第一步:修改 pom 文件,在 pom 文件中添加如下内容:

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.2.2</version>
    <executions>
         <execution>
         <id>build-image</id>
         <phase>package</phase>
         <goals>
         	 <goal>build</goal>
         </goals>
         </execution>
     </executions>
     <configuration>
          <imageName>mall-tiny/${project.artifactId}:${project.version}</imageName>
          <dockerHost>http://10.0.0.4:2375</dockerHost>
          <baseImage>java:8</baseImage>
          <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]
          </entryPoint>
          <resources>
               <resource>
                   <targetPath>/</targetPath>
                   <directory>${project.build.directory}</directory>
                   <include>${project.build.finalName}.jar</include>
               </resource>
           </resources>
      </configuration>
</plugin>

第二步:打包 mall-tiny-arthas 镜像
线上诊断神器-Arthas 实践_第1张图片
第三步:运行 mall-tiny-arthas 容器

docker run -p 8082:8082 --name mall-tiny-arthas \
> --link mysql:db \
> -v /etc/localtime:/etc/localtime \
> -v /mydata/app/arthas/logs:/var/logs \
> -d mall-tiny/mall-tiny-arthas:1.0-SNAPSHOT

启动 arthas-boot

第一步:下载 arthas-boot.jar 包,下载地址:https://alibaba.github.io/arthas/arthas-boot.jar。

第二步:上传 arthas-boot.jar,然后将 arthas-boot.jar 拷贝到应用容器 mall-tiny-arthas 目录下,命令如下:

docker container cp arthas-boot.jar mall-tiny-arthas:/

第三步:进入 mall-tiny-arthas 容器并启动 arthas-boot.jar。

docker exec -it mall-tiny-arthas /bin/bash
java -jar arthas-boot.jar

线上诊断神器-Arthas 实践_第2张图片
启动 arthas-boot.jar 时,选择当前需要诊断的 Java 程序的序列号,如上图所示。

常用命令

dashboard

查看当前系统的实时数据面板,包括线程信息、JVM 内存信息及 JVM 运行时参数。
线上诊断神器-Arthas 实践_第3张图片
thread

查看当前线程信息,查看线程的堆栈,可以找出当前最占 CPU 的线程。
线上诊断神器-Arthas 实践_第4张图片
相关命令:

# 打印当前最忙的3个线程的堆栈信息
thread -n 3

线上诊断神器-Arthas 实践_第5张图片

# 查看ID为1都线程的堆栈信息
thread 1

线上诊断神器-Arthas 实践_第6张图片

# 找出当前阻塞其他线程的线程
thread -b

在这里插入图片描述

# 查看指定状态的线程
thread -state WAITING

线上诊断神器-Arthas 实践_第7张图片
除了以上命令外,还有很多其他的常用命令,比如:

  • sysprop:查看当前 JVM 的系统属性。
  • sysenv:查看 JVM 的环境属性。
  • logger:查看日志信息和改变日志级别。
  • sc:Search-Class 的简写,查看 JVM 已加载的类信息。
  • sm:Search-Method 的简写,查看已加载类的方法信息。
  • jad:反编译已加载类的源码。
  • mc:Memory Compiler 的缩写,内存编译器。
  • redefine:加载外部的 .class 文件,覆盖掉 JVM 中已经加载的类。
  • monitor:实时监控方法执行信息,可以查看方法执行成功此时、失败次数、平均耗时等信息。
  • watch:法执行数据观测,可以观察方法执行过程中的参数和返回值。

SpringBoot 集成 Arthas

第一步:添加 jar 包。

<!--集成Java诊断利器Arthas-->
<dependency>
    <groupId>com.taobao.arthas</groupId>
    <artifactId>arthas-spring-boot-starter</artifactId>
    <version>3.6.1</version>
</dependency>

第二步:修改配置文件,添加如下内容:

management:
  endpoints:
    web:
      exposure:
        # 暴露端点`/actuator/arthas`
        include: 'arthas'
arthas:
  agent-id: mall-tiny-arthas
  tunnel-server: ws://arthas-tunnel-server:7777/ws

第三步:重新部署 mall-tiny-arthas。

Arthas 可视化工具-ArthasTunnel

第一步:下载 ArthasTunnel 的安装包,下载地址:https://github.com/alibaba/arthas/releases。

第二步:将 ArthasTunnel 的安装包上传到服务器上,并重命名为 arthas-tunnel-server.jar。
线上诊断神器-Arthas 实践_第8张图片
第三步:构建 Dockerfile 文件和执行脚本 run.sh。

Dockerfile 文件

# 该镜像需要依赖的基础镜像
FROM java:8
# 将当前目录下的jar包复制到docker容器的/目录下
ADD arthas-tunnel-server.jar /arthas-tunnel-server.jar
# 声明服务运行的端口
EXPOSE 8080 7777
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar","/arthas-tunnel-server.jar"]

执行脚本 run.sh

#!/usr/bin/env bash
# 定义应用组名
group_name='mall-tiny'
# 定义应用名称
app_name='arthas-tunnel-server'
# 定义应用版本
app_version='1.0-SNAPSHOT'
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包编译docker镜像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 8080:8080 -p 7777:7777 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/${app_name}/logs:/var/logs \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'

第三步:运行执行脚本 run.sh。
线上诊断神器-Arthas 实践_第9张图片
启动后,访问 http://10.0.0.4:8080。
在这里插入图片描述

如遇到 No such file or directory 的问题,可能是因为 Dockerfile 文件和执行脚本 run.sh 是从 windows 系统上传到服务器,而导致的文件格式的问题,只需执行以下命令:

sed -i 's/\r$//' run.sh

第四步:应用 ArthasTunnel。

只要在 ArthasTunnel web 页面的 agentId 处输入集成 Arthas 的项目中定义的 agent-id 后,即可通过可视化工具 ArthasTunnel 在线诊断。
线上诊断神器-Arthas 实践_第10张图片
比如,反编译已加载类的源码。
线上诊断神器-Arthas 实践_第11张图片

IDEA 插件

Arthas 的功能很强大,但需要记住的命令很多,于是 Arthas 的官方提供 IDEA 插件,该插件主要用于帮助生成 Arthas 命令。

第一步:在 IDEA 的插件市场搜索 arthas,然后点击安装。
线上诊断神器-Arthas 实践_第12张图片
第二步:以 jad 反编译为例,选中类名,右键 Arthas Command,选择 Decompile Class Jad,此时 jad 命令将被拷贝到剪切板,然后到 ArthasTunnel 右键粘贴即可。
线上诊断神器-Arthas 实践_第13张图片

你可能感兴趣的:(JAVA杂谈,java,Arthas,SpringBoot,ArthasTunnel,docker)