arextest / arextest/arex-agent-java

[Bug] agent录制结果为null

Open
#553 3 comments 0 reactions 0 assignees View on GitHub
bug :lady_beetle:
Dominant language
Java
Stars
564
Forks
140
Avg merge
36m
Merged PRs (30d)
2

Description

### Search before asking

- [X] I have searched the existing [issues](https://github.com/arextest/arex-agent-java/issues) before asking.

### AREX Test Service

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

### Current Behavior

你好!
描述:在录制时,子调用未录取到值返回值为Null,导致上层接口返回值也为Null
猜测:发生远程调用是公司人员内部封装了restTemplate和OKHttp等
具体代码:
代码入口1:
// service-url.menu.validate 实际是一个http://地址
@RestClient(url = "${service-url.menu.validate}")
public interface MenuValidatePreOrder extends MenuValidateClient{

@Override
@PostMapping(value = "epl")
ProductRes getProductBetter(@RequestBody StoreVo storeVo);
}

代码入口2:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RestClient {
String name() default "";

String url() default "";

String path() default "";
}

代码入口3:
@Configuration
public class RestClientConfiguration implements BeanDefinitionRegistryPostProcessor {
private static final Logger LOGGER = LoggerFactory.getLogger(RestClientConfiguration.class);

public RestClientConfiguration() {
}

public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
Environment environment = (Environment)((DefaultListableBeanFactory)registry).getBean("environment");
String packagePrefix = environment.getProperty("cloud.vo.package.prefix", "com.cloud.vo3");
Reflections reflections = new Reflections(packagePrefix, new Scanner[0]);
Set> restClientClassSet = reflections.getTypesAnnotatedWith(RestClient.class);
Iterator var6 = restClientClassSet.iterator();

AbstractBeanDefinition beanDefinition;
while(var6.hasNext()) {
Class restClientClass = (Class)var6.next();
if (restClientClass.isInterface()) {
Object restClient = restClientClass.cast(Proxy.newProxyInstance(restClientClass.getClassLoader(), new Class[]{restClientClass}, new RestClientHandler()));
BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(restClient.getClass());
definition.addConstructorArgValue(new RestClientHandler());
definition.setAutowireMode(1);
beanDefinition = definition.getBeanDefinition();
BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, this.getBeanName(restClientClass), new String[0]);
BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry);
}
}

reflections = new Reflections(packagePrefix, new Scanner[]{new MethodAnnotationsScanner()});
Set methodSet = reflections.getMethodsAnnotatedWith(CustomRestTemplate.class);
Iterator var13 = methodSet.iterator();

while(var13.hasNext()) {
Method method = (Method)var13.next();
String restTemplateName = ((CustomRestTemplate)method.getAnnotation(CustomRestTemplate.class)).value();
if (!RestTemplateFactory.restTemplateRepository.containsKey(restTemplateName)) {
beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(RestTemplate.class);
registry.registerBeanDefinition(restTemplateName, beanDefinition);
RestTemplateFactory.restTemplateRepository.put(restTemplateName, (Object)null);
}
}

String restTemplateName = "urlRestTemplate";
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(RestTemplate.class);
registry.registerBeanDefinition(restTemplateName, beanDefinition);
RestTemplateFactory.restTemplateRepository.put(restTemplateName, (Object)null);
}

代码入口4:
@Configuration
public class RestTemplateConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(RestTemplateConfiguration.class);
private static final String CONNECT_TIMEOUT_KEY = "restClient.%s.connectTimeout";
private static final String READ_TIMEOUT_KEY = "restClient.%s.readTimeout";
private static final String USE_OK_HTTP_KEY = "restClient.%s.useOkhttp";
@Autowired
private HttpClient httpClient;
@Autowired
private OkHttpClient okHttpClient;
@Autowired
private Environment environment;
@Autowired(
required = false
)
private PrintReqResponseLog4ClientInterceptor printReqResponseLog4ClientInterceptor;
@Autowired(
required = false
)
private AddTraceInfoHeader4ClientInterceptor addTraceInfoHeader4ClientInterceptor;

public RestTemplateConfiguration() {
}

@Bean
public RestTemplate restTemplate(@Autowired RestTemplate restTemplate) {
LOGGER.info("初始化内部服务调用的RestTemplate");
int connectTimeout = this.properties.getConnectTimeout().intValue() * 1000;
int readTimeout = this.properties.getReadTimeout().intValue() * 1000;
boolean useOkhttp = Boolean.parseBoolean(this.environment.getProperty(String.format("restClient.%s.useOkhttp", "restTemplate"), "false"));
if (useOkhttp) {
restTemplate.setRequestFactory(this.okHttpRequestFactory(this.okHttpClient, connectTimeout, readTimeout));
} else {
restTemplate.setRequestFactory(this.httpClientRequestFactory(this.httpClient, connectTimeout, readTimeout));
}

restTemplate.setErrorHandler(new RestResponseErrorHandler());
this.changeMessageConverter(restTemplate);
return restTemplate;
}

### Expected Behavior

您好!
我的预期行为是在Anything else 可以录制到子进程

### Steps To Reproduce

您好!
1、在当前行为中,我复制了一些项目中自定义封装的远程调用,我想请问下,处于这种情况,我们arex-agent是不是就是会录制不到自调用的信息。
2、我在社区看到arex-agent不支持公司内部自定义封装的开源插件,想我这种情况,是不是就是不支持,需要开发针对于目标项目适配的插件

3、我将图片贴到Anything else 里了

### Anything else

![image](https://github.com/user-attachments/assets/88d08a04-c627-4ca6-9b38-f04f826c3b5b)
![image](https://github.com/user-attachments/assets/1b5e2940-7890-4f5c-b42c-44125a7c3ae1)

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

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

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by tracing the reported RestClient, RestClientConfiguration, RestTemplateConfiguration, and RestClientHandler entry points, then compare them with the agent's supported capture paths. Reproduce the null child-call result using the custom RestTemplate/OkHttp proxy setup described in the issue. Done means determining whether this integration is supported and documenting or implementing the required adaptation.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, spring
Domain
api, testing
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.