失败case排查

回放失败排查思路

  • 在失败case中查看是否提示“子调用 xxxxx mock 失败”,如果是,则进入后文的mock失败排查。

  • 如果未提示子调用mock失败,但是出现了对比失败,则观察对比不一致字段进行对比排除及问题分析。

  • 如果是非HTTP接口,如果对比不一致字段中回放的response没有正常返回或者返回了null

    • 那么请查看 “录制&回放数据内容查看”中的异常信息,根据异常堆栈信息在业务代码中定位发生异常的原因,如下图位置:

case1
  • 如果是HTTP接口,返回的 response_status 不是 200

    • response_status 502,说明服务端处理异常,需要看下业务日志或者debug代码排查原因。可能是录制参数不对或者其他。

    • response_status 302,说明是被登录跳转了,请参考,设置session mock。即将session相关读取设置为子调用,同时mock掉一些校验机制保证回放正常执行。

  • 如果发现录制有子调用列表,回放没有任何子调用信息,且未提示“子调用 xxxxx mock 失败”。遇到此情况说明回放时应用流程执行失败了。那么怎么办呢?

    • 首先定位回放业务失败原因

      • 先观察回放的response,看看有没有异常码。若有,则从代码定位下出现异常原因。

      • 如果response无法分析原因,那么观察业务日志,看是否在回放时有业务异常,分析业务执行失败原因。

      • 如果没有发现系统异常,只能通过触发回放,让后debug回放流程,分析下业务执行失败原因。

    • 根据原因找到解决方案

      • 如果是录制回放配置不一致倒是回放流程失败,考虑启用用例级diamond mock.

      • 如果是sesson过期原因,请mock session。

      • 如果是业务的特殊逻辑导致回放失败,请mock调特殊逻辑。

      • 如果是本地缓存导致回放失败,请mock 本地缓存读接口。

子调用排查MOCK失败排查

日志中提示:’子调用 xxxxx mock 失败,从doom失败case页面可以看到如下提示:

case3

上面截图报错是tair的读请求没有正常mock。有同学可能不理解:为什么已经配置了隔离tair为什么还要报这个错?有此疑问的同学对doom中的‘隔离’的含义没搞明白,隔离的含义是:大部分中间件隔离相当于对通过该中间件的请求进行子调用处理,即录制时记录请求入参和返回值,回放时用录制结果mock。如果录制时没调用到此中间件,回放时就没办法mock,所以会出现子调用找不到异常。

解决这个问题要分2中场景:

  • 应用没有重构场景

  • 应用因为重构,应用新增了一个录制时没有的子调用

p.s. 部分场景下录制次数少于回放次数也会报同样问题,这种场景同样适用如下分析排查方法。

场景一:应用没有重构

原因

原因是录制时线上没有走到该子调用,导致该子调用在录制时没有被录制到,而在回放时走到了这个子调用,导致回放失败。这句话很拗口,举个具体例子:假设有一个读取用户信息的服务逻辑如下:

...

User user = cache.get(id);
if(user==null){
   user = userService.get(id);
}
...

假设过程如下:

1)录制机器命中缓存,那么userService.get(id)将不被调用。

2)当回放该条流量时,如果 cache没有缓存该用户信息,因此,user==null成立,回放机器会尝试调用服务 userService.get(id)获取子调用。

3)如果做了hsf隔离,那么doom会认为userService.get(id)是一个子调用,尝试从录制的上下文中查找这个子调用来mock,but由于录制没走到这个流程,doom会报错,此时回放失败。

解决方案

将 cache的get方法设置为自定义子调用拦截器可解决此问题。

其他类似问题还包括:

录制回放机器开关配置不一致导致的子调用找不到回放失败问题。

方案:

  • 通过修改配置确保配置项一致。

  • 使用同环境回放。

  • 使用自定义mock屏蔽环境配置不一致。

排查过程:

  • 检查是否由于缓存的原因导致录制走了缓存而线下没缓存而发生了调用则有两种处理方法:

  • 将缓存查询作为一个子调用可解决。

  • 将子调用的上层调用配置为子调用,上层调用涵盖了缓存查询的流程。

  • 如果是因为beta机器本身的重构导致新增了一些调用,那么可以通过扩展插件解决。自定义接口里面可以采取自己构造返回值或者是读接口直接放开。

    读接口放开也可以通过 [客户端配置 -> 动态配置 -> 忽略子调用MOCK]进行配置化解决。

  • 请保证线上配置和线下配置一致后再回放。

  • 某些上下文信息是在埋点前的框架或者应用流程中设置的,导致回放是没有这些上下文参数。

  • 将上下文读取方法作为一个子调用进行配置来解决。

  • 如果是新增的一个子调用,那么流量要重新录制,确保该子调用被录制到。

场景二:应用有重构

参考 重构场景下如何解决子调用mock问题

阿里云首页 云效 相关技术圈