当前位置: 首页 > 科技观察

阿里巴巴如何调试线上问题?

时间:2023-03-19 01:35:23 科技观察

在日常工作中,我们经常会遇到一些线上异常,有些问题只能出现在线上。因为环境和数据不同,本地和测试环境没办法复现,线上也没办法复现。没有输出日志,那么我们经常遇到这种情况怎么解决呢?常规做法如果遇到上述情况,在本地或测试中无法重现,最常规的做法是拉取线上分支版本,添加一些调试日志,然后重新发布版本进行调试。运气好的话,加一次日志就能发现问题。如果运气不好,可能要多发几次才能定位到问题。进阶方法下载安装arthasArthas是阿里开源的一款在线监控诊断产品。可以全局视角实时查看应用负载、内存、gc、线程等状态信息,无需修改应用代码即可诊断业务问题,包括查看方法调用的输入输出参数和异常、监控方法执行时间、类加载信息等,大大提高在线排查问题的效率。上面官方对Arthas工具的介绍,从中我们可以看出这个工具可以查看方法的输入输出参数,异常情况以及监控方法的耗时。我们在排查问题的时候,最重要的是要知道一些方法的输入和返回,有了输入参数和返回数据,我们就可以模拟具体场景来解决线上问题。注意这里说的方法不仅仅是外层的接口方法,Service层或者RPC层的任何方法都是可以的。之所以提出这一点,是因为很多时候线上接口会有请求和结果的日志记录,但是并没有具体内部方法的输入和返回,而通过Arthas我们可以监控到的输入和返回值任何方法。具体版本我们可以从地址https://github.com/alibaba/arthas/releases下载,下载后即可使用,没有任何难度。接下来,阿芬用一个案例来告诉大家如何使用Arthas。测试首先我们启动一个SpringBoot应用,对外有一个http接口,具体的Controller和Service代码实现如下。包com.example.demo.controller;导入com.example.demo.service.HelloService;导入org.springframework.beans.factory.annotation.Autowired;导入org.springframework.web.bind.annotation.GetMapping;导入org.springframework.web.bind.annotation.RequestParam;导入org.springframework.web.bind.annotation.RestController;@RestControllerpublicclassHelloController{@AutowiredprivateHelloServicehelloService;@GetMapping(value="/hello")publicStringhello(@RequestParam("name")Stringname){returnhelloService.sayHello(name);}}packagecom.example.demo.service;importorg.springframework.stereotype.Service;@ServicepublicclassHelloService{publicStringsayHello(Stringname){Stringresult=doSomething(name);返回“你好:”+结果;}privateStringdoSomething(Stringname){returnname+"欢迎来到Java极客技术";}}上面的代码很简单,暴露一个hello接口,接收一个name参数,通过Service中的sayHello方法调用内部的doSomething方法。之后我们可以访问http://127.0.0.1:8080/hello?name=ziyou可以看到如下内容。这里没有问题,但是我们试想一下,如果在某些情况下doSomething的方法比较复杂,我们想知道执行doSomething方法时具体的输入参数和返回值是什么。这个时候怎么办?当然,如果你使用上面的常规方法,加上一些日志,当然是可以的,但是这里我们将演示如何使用Arthas来实现这种效果。我们之前下载过Arthas。下载完成后是一个压缩包。解压后,可以通过命令java-jararthas-boot.jar启动Arthas。效果如下。可以看到启动后,Arthas会找到系统中当前运行的Java进程。我这里有四个进程,然后输入我们要监控的进程号,这里是4,然后回车。然后我们进入Arthas界面。接下来我们使用Arthas的watch命令来监听输入参数和返回值。完整的命令如下:watchcom.example.demo.service.HelloServicedoSomething'{params,returnObj}接下来我们访问刚才的界面,可以看到终端上有相应的数据输出。简要说明相应的命令和输出信息。watch是Arthas提供的命令。第一个参数是完整的类路径,第二个参数是我们要监控的方法名,第三个参数是一个表达式。在这里我们可以获取输入参数和返回值或者异常等信息。对应的值是params数组的形式,通过params[0]可以得到对应的属性。returnObj代表返回值,这两个都可以传。窗体,获取以下属性的值。watch命令后的第三个参数其实是一个ognl表达式。如下图,我们可以做一些计算和逻辑处理,带来很多高级用法。Arthas的一些特殊使用文档说明https://github.com/alibaba/arthas/issues/71总结Arthas除了watch还有很多其他的命令。比如trace可以统计每个方法的执行时间。对于我们做一些性能优化很有帮助,另外还有支持热部署等功能。完整的命令和使用方法可以在https://arthas.aliyun.com/doc/找到,这里也提供了一套在线演示功能。您可以通过在线教程中的终端依次执行各个命令进行学习。官方提供了一个应用程序math-game.jar,可以让我们在线调试,感兴趣的朋友可以试试。