arextest / arex-agent-java

Lightweight Java agent for traffic capture and replay, enhancing testing and debugging.
https://doc.arextest.com/
Apache License 2.0
416 stars 82 forks source link

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

Open buzz321 opened 3 weeks ago

buzz321 commented 3 weeks ago

Search 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?

lucas-myx commented 3 weeks ago

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

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

buzz321 commented 3 weeks ago

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

buzz321 commented 3 weeks ago

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

buzz321 commented 3 weeks ago

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

lijing-22 commented 3 weeks ago

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