在项目中,当用户的一次请求表现的比较慢,例如花费了3秒,我们想知道这3秒具体花费在哪里,整体链路中的每个环节的耗时是多少?
我们应该怎么做呢?选择skywalking等成熟的链路产品肯定是可行的,但是有些场景也是需要轻量级方案的。
例如:
skywalking等先看下具体的效果
16:37:48.984[io-28] [16|61c652b896b844c48cdc086d0f6e61f2]: +[0](1)[200ms]:[Controller]-ExtLeaveController.pageAll
16:37:48.985[io-28] [16|61c652b896b844c48cdc086d0f6e61f2]: ++【1】(2)[47ms]:[Others]-leaveService.page
16:37:48.985[io-28] [16|61c652b896b844c48cdc086d0f6e61f2]: ++[1](3)[35ms]:[Others]-xxxmodule.xxmethod
16:37:48.985[io-28] [16|61c652b896b844c48cdc086d0f6e61f2]: ++[1](4)[15ms]:[Service]-SysUserServiceImpl.getUserAndDeptById
16:37:48.986[io-28] [16|61c652b896b844c48cdc086d0f6e61f2]: +++【2】(5)[5ms]:[Others]-deptMapper.selectById
16:37:48.986[io-28] [16|61c652b896b844c48cdc086d0f6e61f2]: ++[1](6)[5ms]:[Service]-SysUserServiceImpl.getUserDataPowers
16:37:48.986[io-28] [16|61c652b896b844c48cdc086d0f6e61f2]: +++【2】(7)[5ms]:[Others]-sysUserMapper.getUserDataPowers
16:用户id61c652b896b844c48cdc086d0f6e61f2:一次请求的traceId- 后面的就是每个span的层级、调用栈、耗时、类型、名称
- 每层最耗时的方法标粗了
可以把日志搜集到ELK(没有条件就算了),然后通过traceId搜索链路。
每次请求的时候在Http header中加入 trace_id:uuid
Http header中获取 trace_id,并加入到MDC中,便于打印到日志中。Http header中加入 trace_id:uuid + uuid,在原有的基础上加上server端的uuid。trace_id:uuid + uuid。Http response header中把trace_id:uuid + uuid返回给前端。