全部产品
云市场

调用链详情

更新时间:2019-01-07 11:45:11

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

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

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

调用链详情可以在调用链详情页面(EDAS 控制台 左侧导航栏中选择微服务管理 > 调用链详情)中搜索,不过更典型的应用场景是基于调用链查询结果中的慢业务或出错业务进行查看。所以,下面以调用链查询为入口且以一个具体示例进行说明。

  1. 登录 EDAS 控制台。

  2. 在左侧导航栏中选择微服务管理 > 调用链查询,进行调用链查询

  3. 调用链查询页面中直接找到耗时最长的 HSF 方法或 DB 请求或其它远程调用。

    慢调用

    • 如果是 DB 或 Redis、MQ 之类的简单调用,那就需要排查为什么访问这些节点慢,是否为慢 SQL,是否网络堵塞。

    • 如果是 HSF 方法,则需要进一步分析为什么本方法耗时这么多。

  4. 确认本地方法耗时。

    将鼠标移动到本方法时间条上,会显示弹出层,时间分成了3部分:客户端发送请求、服务端处理请求和客户端收到响应。

    如果是服务端处理请求耗时较长,就需要分析业务。否则按照调用超时的分析方法进行分析。

    如下图所示:服务器端处理请求606ms。

    本地方法调用

  5. 对比子节点耗时总和本方法耗时是否接近。

    • 如果比较接近,则说明耗时基本都在进行网络调用,尽量减少网络调用,减少每个方法的耗时。如下图所示:

      总耗时与本地方法相差不大

      这个明显是 for 循环调用同一个方法,尽量批量调用一次返回即可。

    • 如果差别较大,如下图所示:父节点的耗时 607ms,而子节点耗时总共不到 100ms,差别很大。则说明耗时在服务器本身业务逻辑中,而不是远程调用的请求中。

      总耗时与本地方法相差很多

  6. 初步定位耗时调用。

    通过下方节点的时间条的位置看一下哪条的耗时较多,可以初步定位耗时多的时间在发起哪个调用之前。如下图红色条所示,耗时逻辑就在此处。这块耗时是纯粹的本地逻辑所以需要进一步排查。

    定位耗时调用

    1. 初步定位了耗时逻辑在哪里,可以通过 review 代码或者在代码中添加 log 的方式定位具体的错误。

      如果发现代码不会耗时这么多,怎么办?

    2. 排查当时是否发生 gc,所以 gc.log 的记录非常重要。

  7. 定位超时异常。

    如下图所示出现了超时异常,这个时间如何评估。

    定位超时异常

    时间分为3段:

    • 客户端发出请求(0ms):从客户端发出请求到服务端接收到这个请求的耗时,包括序列化,网络传输,反序列化。如果耗时较长,需要考虑是否触发客户端 gc,序列化对象很大耗时较长,网络传输压力较大,反序列化对象很大导致耗时较长,服务器端 gc 导致耗时较长。

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

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