DOOM使用常见问题

不能正常录制回放怎么办

录制不到流量怎么办?

1.排查doom客户端是否部署成功。

2.检查录制任务是否勾选了待录制的流量接口。

3.日志级别调到debug【客户端配置-动态配置-日志级别】,观察doom.log,若doom已升级到6.2.0,开日志查看器进行日志查看入下图:

图1:查看日志入口

case4

图2:排查流量为啥没录制到

case5

  • 一般来说,当前采样率为0,要么是任务没启动,要么是任务启动后没勾选该接口,请检查任务配置。

  • 若isRun始终没有出现你关心的接口,请检查是否真正有流量落到这台服务器。如果是Java流量入口,检查任务中是否添加该入口。

接入doom正常但不能回放怎么办?

  • 排查doom客户端是否部署成功。

  • 请检是否录制到流量。

  • 是否开启了回放任务。

回放机器如何识别是否需要mock,mock的子调用是哪些?

是否mock和客户端配置有关。在【客户端配置-隔离的中间件】配置的中间件默认会进行mock或者隔离。例如dubbo,db等,dbmock需要依赖orm层做mock,自定义子调用也会进行mock。

子调用找不到、回放失败怎么办?

参考文档 失败case排查

应用重构如何使用doom回归

应用重构支持

子调用不可序列化

自定义子调用需要保证可序列化,若不可序列化请确认是否子调用设置不合理,例如aop切面入参带有Method类的以及httpFilter都不应该设置为自定义子调用。若一定要设置为子调用参考如下方法解决:

1.子调用中入参无法序列化的解决办法

例如:doom提示:SubInvoke[com.epp.fincloud.service.ItemSelectionService@modifyPriceBySubChannel(ItemPriceUpdateDTO,String,List)]@[第1个入参com.epp.fincloud.dto.ItemPriceUpdateDTO无法序列化]}

如果排除com.epp.fincloud.service.ItemSelectionService@modifyPriceBySubChannel(ItemPriceUpdateDTO,String,List) 这个子调用的第一个入参进行序列化,那么便能解决序列化问题.

配置方法:在【客户端配置->子调用配置->子调用入参忽略序列化配置】选项中添加【com.epp.fincloud.service.ItemSelectionService@modifyPriceBySubChannel(ItemPriceUpdateDTO,String,List)#0】来解决

2.在更上层可序列化的位置进行mock

3.通过插件自定义序列化

4.忽略类序列化

可将不可序列化类设置为【客户端配置-其他配置-忽略序列化类列表】中忽略序列化,忽略序列化后该类在回放的时候直接会被设置为null,若回放强依赖该值,那么不能采用此方法。

入参或返回值不可序列化

1.分析是否主调用配置是否合理,例如HTTP流量直接通过HTTP接口接入解决而不应该拦截Java的controller类。

2.通过自定义序列化、忽略类序列化来解决。

doom.log为什么会出现InvalidInvokeException disconnect.invoke—> xxx 异常?(doom警告页面会提示:”回放机器在非回放状态下执行子调用操作…”)

【原因】

doom客户端会对‘回放分组’机器的隔离中间件做隔离【即纯回放机器不不能正常提供服务,只能用于回放】,隔离的目的是保证调用最终不会发生。例如一个写db请求,一个hsf调用等等。是为了确保回放不影响线上数据。出现这个异常一般是由于非回放流量尝试执行中间件的调用。例如beta机器接收到了HTTP请求(我们要求测试机器要摘除vip),另外一个可能是应用本身的定时任务或者其他的调度任务。

问题一:导致应用无法正常启动

【如何解决】

  • 方法1.设置客户端延迟启动,避免在启动过程中被disconnect。设置方法:【客户端配置-静态配置-基础配置-客户端延迟启动时间 】设置的长一些。

  • 方法2.对于线下回放,可以使用录制&回放分组进行回放,避免隔离。

    问题二:持续不定刷 disconnect异常日志

  • 如果的确不希望回放机器正常提供服务,请做如下检查

    如果抛出这个异常的入口是HTTP请求,请摘除vip,不要让HTTP请求进入到beta机器。

    注:预发域名也可能是挂载在vipserver上,具体从psp上查看。

    https://vipserver.alibaba-inc.com/app/pages/domain-list/index.html?env=pre

    如果是调度任务,例如DTS。请在doom客户端配置DTS隔离。

    如果是其他程序内部调度。请通在doom客户端配置力配置(客户端配置->子调用配置->自定义调用断开)去避免调度执行。

    例如:类 com.xxx.A 的 init() 方法执行了 new Timer().scheduleAtFixedRate(xx); ,隔离com.xxx.A@init() 方法就可以了。

    如果是应用初始化避免慢doom先完成的初始化,可以在客户端配置->静态配置->客户端延迟启动时间,设置一个更长的延迟启动时间,默认是60s。

  • 如果希望回放机器也提供服务

    请在选择回放分组类型时选择‘录制&回放’分组。警告:线上回放请不要使用‘录制&回放’分组。

【是否一定需要解决】

通过doom的隔离已经避免的数据方案,因此不存在数据污染问题,不强制要求修复此问题。

【解决案例1】

异常堆栈:

at com.taobao.tddl.group.dbselector.AbstractDBSelector.tryExecute(AbstractDBSelector.java:442) ~[tddl-group-5.2.6.jar:na]
  at com.taobao.tddl.group.dbselector.AbstractDBSelector.tryExecute(AbstractDBSelector.java:449) ~[tddl-group-5.2.6.jar:na]
  at com.taobao.tddl.group.jdbc.TGroupStatement.executeQuery(TGroupStatement.java:505) ~[tddl-group-5.2.6.jar:na]
  at com.taobao.tddl.transaction.log.GlobalTxLogManager.hasInited(GlobalTxLogManager.java:355) ~[tddl-transaction-5.2.6.jar:na]
  ... 9 common frames omitted
Caused by: com.tmall.doom.client.filter.InvalidInvokeException: disconnect.invoke-->com.mysql.jdbc.MySQLConnection@execSQL(StatementImpl,String,int,Buffer,int,int,boolean,String,Field[],boolean)
  at com.tmall.doom.client.aop.handlers.RecordOrMockHandler.invoke(RecordOrMockHandler.java:151) ~[na:na]

经分析发现tddl中的:ScanTimeoutTask 这个类会定时扫数据库检查事务信息,对于回放机器而言可以通过在:[客户端配置->子调用配置->自定义调用断开] 中设置:com.taobao.tddl.transaction.async.ScanTimeoutTask@scanGroup(*)

避免定时扫表逻辑解决。

回放时出现 DataSourceMockException

【原因】

如果隔离中间件选择了tddl隔离或者数据库隔离,那么需要对数据库访问进行mock。如果没有对数据库层访问进行mock则抛出该异常。

【如何解决】

  • 方案一:【客户端配置】中选择db自动mock为‘是’,仅支持特定版本的ibatis、mybatis 框架。

  • 方案二:【客户端配置】选择db自动mock为‘否’,配置好【DAO实现类】以便于做数据库访问层mock。

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