本文介绍通过端云互联请求服务调用链路和参数分析,有效地提高问题排查效率。
前提条件
在IntelliJ IDEA中安装2021.4.1及以上版本Cloud Toolkit。相关操作,请参见在IntelliJ IDEA中安装和配置Cloud Toolkit。
背景信息
在应用运行过程中,当出现服务调用异常或资源访问失败时,开发人员通常会选择断点调试来排查问题。但断点调试在某些场景下并不适用,可能存在如下问题:
- 缺乏整体调用概况:上层服务收到请求后,往往会拆分成多个子请求,最后将这些子请求的处理结果进行汇总。例如,服务收到请求后可能会先访问缓存,当缓存访问超时后才访问数据库,最后汇总数据返回。服务发起了哪些子请求?这些子请求的耗时如何?断点调试难以明确这类问题。
- 类嵌套太深,调试效率低下:得益于各种服务框架封装,我们进行微服务调用、缓存访问、数据库访问等操作时无需知晓太多内部处理细节,但实际上往往是比较复杂的。从上层入口到底层异常之间通常嵌套多个类调用,并且包含各种同步和异步处理,这种情况下的断点调试是非常困难。
- 断点调试本身影响系统性能:断点调试过程一般耗时较长,而另一方面服务框架处理时会进行超时判断,使用断点调试容易使调试本身的耗时造成服务处理超时。
启用端云互联并打印链路信息
- 启动IntelliJ IDEA。
- 在顶部菜单栏中选择 。
- 在Settings对话框中选择 。
- 在Microservice页面选中端云互联,单击高级配置。
- 在高级配置对话框中选中打印链路信息,单击OK。说明 此能力依赖底层ARMS Agent埋点跟踪,插件会在启动应用时进行挂载,您无需额外操作。
查看请求链路
启动应用后,当应用发起服务调用或访问外部资源时,可看到输出如下链路。
链路输出中包含如下信息:
TraceId
:用于标记请求的整体处理过程。在分布式微服务调用场景下,TraceId会从最前端的应用节点透传至下游链路各个节点,可根据此TraceId在EDAS控制台或ARMS控制台查询整体链路处理过程。Service
:当前应用的请求处理入口,如Spring Cloud服务、Dubbo服务、HSF服务等。API
:链路处理过程中的方法签名。Line
:方法处理的具体行数。Cost
:此方法及其下游处理的耗时,单位毫秒。Ext
:扩展信息,包含请求处理状态码、数据库访问SQL、资源目标地址等信息。Console link
:ARMS控制台上收集的此链路信息。ARMS调用链采集为准实时,如打开此链接未展示调用链,请稍等片刻刷新页面。
分析请求链路
通过查看请求链路,可以方便地了解请求处理过程中关键节点的概要信息。如果需要进一步分析关键节点处理的参数、返回值或异常,可以结合插件中集成的Arthas进一步分析。
- 在顶部菜单栏中选择 。插件将会自动下载Arthas包并启动,在IDEA中的Terminal页打开。说明 在IntelliJ IDEA中,应用运行在Run或Debug页,Arthas运行在Terminal页,使用时请进行相应切换。
- 选择相应进程挂载Arthas,输入进程序列号并回车。进入Arthas界面。说明 如本地使用容器模式进行启动,由于容器外无法看到容器内进程,因此需要手动进入容器挂载Arthas并观测。
- 使用Arthas的Trace命令和Watch命令进行分析,并使用Exit命令退出Arthas。
在请求链路分析中,可得到关键节点的类路径和方法签名。例如
com.alibaba.edas.boot.DemoConsumerController.redisGetAndSet()
,类路径为com.alibaba.edas.boot.DemoConsumerController
,方法名为redisGetAndSet
。可以根据此信息进行分析。- Trace命令
Trace命令可查看方法内部调用路径,并输出方法路径上的每个节点上耗时。在功能上,Arthas Trace命令跟查看请求链路相同,两者埋点机制不同,您可综合两者进行分析。
Trace命令格式如下:
trace <类路径> <方法名>
输出样例如下:
您可使用Q或Ctrl+C退出此命令。
- Watch命令
Watch命令可观测关键节点的方法处理结果,能观察到的范围为:入参、返回值、抛出异常。
Watch命令格式如下:
watch <类路径> <方法名> <观测项> <条件>
关于详细命令使用,请参见Arthas官方文档,此处使用常用的命令参数进行说明。如下命令效果为,观测
com.alibaba.edas.boot.DemoConsumerController
的方法redisGetAndSet
,输出方法调用时的入参和返回值,并指定输出结果的属性遍历深度为2。watch com.alibaba.edas.boot.DemoConsumerController redisGetAndSet '{params,returnObj}' -x 2
输出结果如下:
说明 示例中的属性遍历深度为2,通过调整此参数,可以查看方法调用时复杂嵌套对象的具体属性值。您可使用Q或Ctrl+C退出此命令。
- Exit命令
如果需要结束使用Arthas,只需输入
exit
并回车即可。
- Trace命令