通过调用链详情,可以在选定的区域内,基于TraceId查询某个调用链的详细信息。

前提条件

调用链详情展示的是整个服务调用链路中,发生远程方法调用的链路,并不包含本地方法调用。

调用链详情是为了定位在分布式链路调用过程中的每个环节的耗时和异常,本地方法并不是调用链的核心内容,本地方法的耗时及异常建议通过业务日志的方式进行。例如:本地逻辑methodA() 调用localMethodB()localMethodC() 在调用链详情中不会显示。所以有时看到父节点的耗时总是大于所有子节点耗时总和。

调用链详情可以在调用链详情页面中搜索,不过更典型的应用场景是基于调用链查询结果中的慢业务或出错业务进行查看。所以,下面以调用链查询为入口且以一个具体示例进行说明。

背景信息

说明 Spring Cloud和Dubbo应用暂时不支持该功能。

操作步骤

  1. 登录EDAS控制台
  2. 在左侧导航栏选择微服务治理 > 调用链详情
  3. 调用链详情页面查询调用链详情。
  4. 在调用链查询结果页面中找到耗时最长的HSF方法、数据库请求或其他远程调用。
    调用链详情
    • 如果是DB或Redis、MQ之类的简单调用,需要排查为什么访问这些节点慢,是否为慢SQL,是否网络堵塞。
    • 如果是HSF方法,则需要进一步分析为什么本方法耗时这么多。
  5. 确认本地方法耗时。将鼠标移动到本方法时间条上,会显示弹出层,时间分成了3部分:客户端发送请求、服务端处理请求和客户端收到响应。
    • 如果是服务端处理请求耗时较长,就需要分析业务。
    • 否则按照调用超时的分析方法进行分析。
    如下图所示:服务器端处理请求44ms。调用链详情
  6. 对比子节点耗时总和本方法耗时是否接近。
    • 如果比较接近,则说明耗时基本都在进行网络调用,尽量减少网络调用,减少每个方法的耗时。这个明显是for循环调用同一个方法,尽量批量调用一次返回即可。
    • 如果差别较大,如父节点的耗时607ms,而子节点耗时总共不到100ms,差别很大。则说明耗时在服务器本身业务逻辑中,而不是远程调用的请求中。
  7. 初步定位耗时调用。通过下方节点的时间条的位置看一下哪条的耗时较多,可以初步定位耗时多的时间在发起哪个调用之前。
    此处耗时是纯粹的本地逻辑,所以需要进一步排查。
    1. 初步定位了耗时逻辑在哪里,可以通过Review代码或者在代码中添加Log的方式定位具体的错误。
    2. 如果发现代码不会耗时这么多,排查当时是否发生GC。
  8. 定位超时异常。
    超时异常如上图所示出现了超时异常,这个时间分为3段:
    • 客户端发出请求(0ms):从客户端发出请求到服务端接收到这个请求的耗时,包括序列化,网络传输,反序列化。如果耗时较长,需要考虑是否触发客户端GC,序列化对象很大耗时较长,网络传输压力较大,反序列化对象很大导致耗时较长,服务器端GC导致耗时较长。

    • 服务端处理请求(10077ms):从服务端收到客户端的请求到给客户端返回响应的耗时。此过程是纯粹的服务器端处理请求的时间,不包含其它时间。

    • 客户端收到响应(3002ms):从服务端返回响应到客户端收到这个响应的耗时。因为设置了3s超时,超时后服务器端直接返回超时,但是服务器端还是在继续处理。如果这个耗时较长,跟客户端发出请求类似排查。