基本原理
如果想知道一个接口在哪个环节出现了问题,就必须清楚该接口调用了哪些服务,以及调用的顺序,如果把这些服务串起来,看起来就像链条一样,我们称其为调用链。
基本概念
spanid:每次调用服务的顺序。
traceid:每次请求的唯一标识。
parentid:标识调用服务的层级关系。
timestamp:上述的三个标识还不够,还需要加上时间戳,时间戳可以更精细一点,精确到微秒级。
虽然能计算出从服务调用到服务返回的总耗时,但是这个时间包含了服务的执行时间和网络延迟,有时候我们需要区分出这两类时间以方便做针对性优化。那如何计算网络延迟呢?我们可以把调用和返回的过程分为以下四个事件。
- Client Sent简称cs,客户端发起调用请求到服务端。
- Server Received简称sr,指服务端接收到了客户端的调用请求。
- Server Sent简称ss,指服务端完成了处理,准备将信息返给客户端。
- Client Received简称cr,指客户端接收到了服务端的返回信息。
假如在这四个事件发生时记录下时间戳,就可以轻松计算出耗时,比如sr减去cs就是调用时的网络延迟,ss减去sr就是服务执行时间,cr减去ss就是服务响应的延迟,cr减cs就是整个服务调用执行的时间。
其实span块内除了记录这几个参数之外,还可以记录一些其他信息,比如发起调用服务名称、被调服务名称、返回结果、IP、调用服务的名称等,最后,我们再把相同spanid的信息合成一个大的span块,就完成了一个完整的调用链。