DOOM使用常见问题
不能正常录制回放怎么办
录制不到流量怎么办?
1.排查doom客户端是否部署成功。
2.检查录制任务是否勾选了待录制的流量接口。
3.日志级别调到debug【客户端配置-动态配置-日志级别】,观察doom.log,若doom已升级到6.2.0,开日志查看器进行日志查看入下图:
图1:查看日志入口

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

一般来说,当前采样率为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。