分析请求调用链路

本文介绍通过端云互联请求服务调用链路和参数分析,有效地提高问题排查效率。

前提条件

在IntelliJ IDEA中安装2021.4.1及以上版本Cloud Toolkit。相关操作,请参见在IntelliJ IDEA中安装和配置Cloud Toolkit

背景信息

在应用运行过程中,当出现服务调用异常或资源访问失败时,开发人员通常会选择断点调试来排查问题。但断点调试在某些场景下并不适用,可能存在如下问题:

  • 缺乏整体调用概况:上层服务收到请求后,往往会拆分成多个子请求,最后将这些子请求的处理结果进行汇总。例如,服务收到请求后可能会先访问缓存,当缓存访问超时后才访问数据库,最后汇总数据返回。服务发起了哪些子请求?这些子请求的耗时如何?断点调试难以明确这类问题。
  • 类嵌套太深,调试效率低下:得益于各种服务框架封装,我们进行微服务调用、缓存访问、数据库访问等操作时无需知晓太多内部处理细节,但实际上往往是比较复杂的。从上层入口到底层异常之间通常嵌套多个类调用,并且包含各种同步和异步处理,这种情况下的断点调试是非常困难。
  • 断点调试本身影响系统性能:断点调试过程一般耗时较长,而另一方面服务框架处理时会进行超时判断,使用断点调试容易使调试本身的耗时造成服务处理超时。

启用端云互联并打印链路信息

  1. 启动IntelliJ IDEA。
  2. 在顶部菜单栏中选择Tools > Alibaba Cloud > Preferences...
  3. Settings对话框中选择Alibaba Cloud Toolkit > Microservice > Microservice
  4. Microservice页面选中端云互联,单击高级配置
  5. 高级配置对话框中选中打印链路信息,单击OK
    端云互联-高级配置
    说明 此能力依赖底层ARMS Agent埋点跟踪,插件会在启动应用时进行挂载,您无需额外操作。

查看请求链路

启动应用后,当应用发起服务调用或访问外部资源时,可看到输出如下链路。

端云互联-请求链路分析

链路输出中包含如下信息:

  • TraceId:用于标记请求的整体处理过程。在分布式微服务调用场景下,TraceId会从最前端的应用节点透传至下游链路各个节点,可根据此TraceId在EDAS控制台ARMS控制台查询整体链路处理过程。
  • Service:当前应用的请求处理入口,如Spring Cloud服务、Dubbo服务、HSF服务等。
  • API:链路处理过程中的方法签名。
  • Line:方法处理的具体行数。
  • Cost:此方法及其下游处理的耗时,单位毫秒。
  • Ext:扩展信息,包含请求处理状态码、数据库访问SQL、资源目标地址等信息。
  • Console link:ARMS控制台上收集的此链路信息。ARMS调用链采集为准实时,如打开此链接未展示调用链,请稍等片刻刷新页面。

分析请求链路

通过查看请求链路,可以方便地了解请求处理过程中关键节点的概要信息。如果需要进一步分析关键节点处理的参数、返回值或异常,可以结合插件中集成的Arthas进一步分析。

  1. 在顶部菜单栏中选择Tools > Alibaba Cloud > ... > Diagnostic Tools
    插件将会自动下载Arthas包并启动,在IDEA中的Terminal页打开。Terminal
    说明 在IntelliJ IDEA中,应用运行在Run或Debug页,Arthas运行在Terminal页,使用时请进行相应切换。
  2. 选择相应进程挂载Arthas,输入进程序列号并回车。
    进入Arthas界面。Arthas界面
    说明 如本地使用容器模式进行启动,由于容器外无法看到容器内进程,因此需要手动进入容器挂载Arthas并观测。
  3. 使用Arthas的Trace命令和Watch命令进行分析,并使用Exit命令退出Arthas。

    在请求链路分析中,可得到关键节点的类路径和方法签名。例如com.alibaba.edas.boot.DemoConsumerController.redisGetAndSet() ,类路径为com.alibaba.edas.boot.DemoConsumerController,方法名为redisGetAndSet 。可以根据此信息进行分析。

    • Trace命令

      Trace命令可查看方法内部调用路径,并输出方法路径上的每个节点上耗时。在功能上,Arthas Trace命令跟查看请求链路相同,两者埋点机制不同,您可综合两者进行分析。

      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

      输出结果如下:

      watch命令-输出结果
      说明 示例中的属性遍历深度为2,通过调整此参数,可以查看方法调用时复杂嵌套对象的具体属性值。

      您可使用Q或Ctrl+C退出此命令。

    • Exit命令

      如果需要结束使用Arthas,只需输入exit并回车即可。