线上追踪神器Arthas

很多时候我们会碰到很多莫名奇妙的问题,如接口一直好好的,突然就返回了不一样的结果,或者干脆什么都没有返回,不知道程序走到哪里了。如果日志系统不完善的话,又无法查询日志,这种问题就没法排查。只能补充日志,追踪到底是哪里出了问题,有可能打了日志之后问题又消失了。无法还原当时的场景,无疑是一颗定时炸弹,也就成了一门玄学。怎么来处理呢?阿里开源的这款Arthas就可以为我们轻松解决此类问题。

Arthas是阿里开源的Java诊断神器,以零侵入、全动态的特性重新定义线上问题排查。无需重启应用或修改代码,即可实时监控JVM状态、追踪代码执行链路、定位性能瓶颈,堪称开发者"线上调试的第三只眼"。

01 Arthas初识

1.1 Arthas简介

Arthas阿里开源的Java诊断工具,支持动态追踪、实时监控、热更新等特性。通过全局视角实时查看应用
load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

Arthas官网地址:https://arthas.aliyun.com/

1.2 Arthas核心亮点

动态追踪 :实时查看方法调用参数、返回值、异常,支持条件过滤与耗时分析;

热更新 :直接修改代码并热加载,秒级修复线上问题;

全维度诊断 :内存泄漏分析、线程死锁检测、类加载追踪一网打尽;

开箱即用 :命令行交互设计,集成jad/watch/trace等超20种指令,学习曲线平滑。

1.3 Arthas使用方式

Arthas的使用方式主要有两种:嵌入式和非嵌入式。

嵌入式:将Arthas引入项目中,对代码有一定的侵入性。直接使用运行jar包,选择对应的进程即可。
非嵌入式:项目中不依赖任何Arthas的相关依赖和配置,对代码没有侵入性。

02 项目实战

2.1 项目搭建

本章采用嵌入式的方式使用Arthas。嵌入式的方式直接可以通过管理页面直接进入,使用起来更加方面。

引入依赖:

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

配置需要配置项目注册在Arthas中的服务,以及暴露的端口。

# 项目名称
spring.application.name=boot-arthas

# 配置arthas服务
arthas.tunnel-server=ws://127.0.0.1:7777/ws
# 不监听端口(不配置也可以,默认是为随机端口)
arthas.telnet-port=-1
arthas.http-port=-1

arthas.tunnel-server:Arthas的注册服务,需要手工搭建,搭建之后可以作为所有项目的Arthas的监控中心或者平台。

项目启动:

2.3 搭建注册服务

该服务需要从GitHub上下载,下载地址:https://github.com/alibaba/arthas/releases

Arthas tunnel server 是一个 spring boot jar 应用,直接通过 java -jar启动,默认端口是8080,也可以通过启动参数修改,arthas agent 连接的端口是7777。管理页面默认是不开启的,因为页面没有做安全拦截的功能。开启的话需要我们通过启动参数打开。

java -Darthas.enable-detail-pages=true -jar arthas-tunnel-server.jar

启动之后,就可以查看链接:http://localhost:9000/apps.html
随着项目启动,列表会出现应用的列表。

2.4 项目测试

我们使用Arthas监控foo()这个方法,样例代码:

package com.simonking.boot.arthas.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.swing.event.ListSelectionEvent;
import java.util.List;
import java.util.Random;

/**
 * TODO
 *
 * @Author: ws
 * @Date: 2025/2/27 11:03
 */
@Slf4j
@RestController
@RequestMapping("/foo")
public class FooController {

    @RequestMapping("/testArthas")
    public String foo() {
        int a = 1/0;
        return "test foo";
    }
}

这里需要使用Arthas的trace命令追踪这个方法:

trace com.simonking.boot.arthas.controller.FooController foo -n 5 --skipJDKMethod false

由于Arthas的命令比较多,记起来没有那么容易,这里使用了Arthas插件可以直接解锁其命令。

使用方法:

使用Arthas监控,从监控平台进入Arthas监控界面,并输入刚才的命令:


访问foo()方法,观察结果:http://127.0.0.1:8080/foo/testArthas

从追踪的命令就可以看出代码执行到哪里报错,报的什么错,以及报错的行数。

END

喜欢就点赞、收藏,微信可以搜【编程朝花夕拾】关注我哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值