升级HttpExecutor至v2后测试出现重复指标异常求助
解决HttpExecutor v2升级后OkHttp重复指标注入错误
升级HttpExecutor到v2版本后运行测试用例时,出现Guice注入异常,核心问题是OkHttp的指标okhttp3.OkHttpClient.connection-pool-total-count被重复注册,报错信息如下:
Caused by: java.lang.IllegalArgumentException: A metric named okhttp3.OkHttpClient.connection-pool-total-count already exists [ERROR] com.main.testSuccessMetadataStore Time elapsed: 0.088 s <<< ERROR! com.google.inject.ProvisionException: Unable to provision, see the following errors: 1) [Guice/ErrorInjectingConstructor]: IllegalArgumentException: A metric named okhttp3.OkHttpClient.connection-pool-total-count already exists
解决方案
检查OkHttpClient实例复用情况
HttpExecutor v2默认启用了Micrometer指标收集,若你的业务代码或测试代码中也手动配置了OkHttp的指标绑定,就会导致重复注册。确保整个环境(包括测试)中,同一指标域下只存在一个OkHttp指标注册逻辑。禁用HttpExecutor内置指标收集
如果不需要HttpExecutor自带的OkHttp指标,可直接关闭:@Bean public HttpExecutor httpExecutor() { return HttpExecutor.builder() .disableMetrics() // 关闭内置指标收集 .build(); }统一MeterRegistry实例
若需要保留指标,确保所有OkHttp相关组件共用同一个MeterRegistry单例。在Guice模块中绑定单例注册器:bind(MeterRegistry.class).toInstance(new SimpleMeterRegistry());同时让HttpExecutor依赖这个单例:
HttpExecutor.builder() .meterRegistry(injector.getInstance(MeterRegistry.class)) .build();测试用例隔离与清理
测试环境中,使用@DirtiesContext(Spring)或Guice模块隔离,避免不同测试重复创建实例;或者在测试前置方法中清理指标:@BeforeEach void setUp() { MeterRegistry registry = getMeterRegistryInstance(); registry.getMeters().forEach(registry::remove); }
内容的提问来源于stack exchange,提问作者Pukhraj soni
相关产品推荐
相关产品推荐

