arex-agent-java icon indicating copy to clipboard operation
arex-agent-java copied to clipboard

[Bug] Servlet 请求的回放结果与预期不符

Open buzz321 opened this issue 1 year ago • 5 comments

Search before asking

  • [X] I have searched the existing issues before asking.

AREX Test Service

AREX Java Agent (arextest/arex-agent-java)

Current Behavior

测试场景:http 入口请求 apollo

遇到以下问题: 1、通过 arex-web 进行 Servlet 请求的回放时,目标机器会生成 4 次arex-replay-id 2、调试发现,第 1 次回放开始,执行到 RequestHandlerManager#preHandle 时,REQUEST_HANDLER_CACHE 缓存总为空,因为 REQUEST_HANDLER_CACHE 的初始化处理在 RequestHandlerManager#preHandle 后,导致未触发 ApolloServletV3RequestHandler#preHandle 回放逻辑,其余3次回放,由于 REQUEST_HANDLER_CACHE 已完成初始化,逻辑正常

Expected Behavior

1、对指定时间段内的 recordId 进行回放,只回放 1 次,生成 1 个 arex-replay-id 2、首次回放时就可以获取到 apollo 的录制配置

Steps To Reproduce

error 621717662219_ pic_hd diff1

Anything else

No response

Are you willing to submit a pull request to fix on your own?

  • [X] Yes I am willing to submit a pull request on my own!

buzz321 avatar Jun 06 '24 09:06 buzz321

为什么回放会有4次?
因为前3次要做1次预热和2次降噪请求,第4次才是真正的回放请求,
预热就是为了先把apollo等配置先还原,因为apollo的配置是加载到内存中的全局配置,第一次要先把配置都mock成录制时的配置,这个过程是异步的(apollo内部机制),无法保证第一次就能把所有的配置文件都还原完成,所以要先进行一次预热,这样后续的回放请求都是使用已经mock过的apollo配置。

另外Apollo config的回放是在ApolloServletV3RequestHandler#handleAfterCreateContext方法实现的

lucas-myx avatar Jun 06 '24 09:06 lucas-myx

哦 源码位置可能是有调整吧,我对应了一下master上的新代码,ApolloServletV3RequestHandler#handleAfterCreateContext方法是我所说的ApolloServletV3RequestHandler#preHandle了

buzz321 avatar Jun 06 '24 10:06 buzz321

那我是否可以理解为1次预热(不触发回放)和2次降噪+第4次都执行了回放请求?

buzz321 avatar Jun 06 '24 10:06 buzz321

另外,如果指定时间段内有 3 个 recordId 需要进行回放的话,预热、降噪和真实的调用是怎么个执行方式呢?

buzz321 avatar Jun 06 '24 10:06 buzz321

@buzz321 可以加qq群交流,656108079,issue回复不及时

lijing-22 avatar Jun 06 '24 11:06 lijing-22