解决使用RestTemplate 日志中出现timerCache is above the warning threshold of 1000 with size xxx 警告
项目版本:springboot 1.5.2.RELEASE,springcloud Camden.SR5。某处业务中通过 RestTemplate 使用连接字符串url大量调用第三方服务进行数据同步,日志出现以下警告内容: 2021-09-09 12:11:41.973 WARN [resources-Executor-2] o.s.c.n.metrics.servo.ServoMonitorCache : timerCache is above the warning threshold of 1000 with size 1634. … 2021-09-09 12:11:41.973 WARN [resources-Executor-2] o.s.c.n.metrics.servo.ServoMonitorCache : timerCache is above the warning threshold of 1000 with size 1635. … 排查问题: 所涉及到的类:
首先找到日志打印的类: 再看下this.config.getCacheWarningThreshold() 在哪里: 分析问题:我的业务需要做大量的分页查询,只能将分页参数带在url中,每调用一次,由于url地址不同,每次都会执行this.timerCache.put(config, t); 这个map会越来越大,达到一定次数后就会超过cacheWarningThreshold的默认值1000,触发警告信息。 因此第一种解决方法就出来了,只要我们在配置netflix.metrics.servo.cacheWarningThreshold 为一个较大的值,自然就不会有警告信息打印出来。 以我的application-dev.yaml文件为例:
接下来再看下getTimer方法在哪里被调用: 分别在MetricsClientHttpRequestInterceptor、MetricsHandlerInterceptor类中用到了。在MetricsInterceptorConfiguration自动配置类中找到了RestTemplate相关内容: 可以看到默认会启用该自动配置类,并将MetricsClientHttpRequestInterceptor 添加到RestTemplate的拦截器中。 因此第二种解决方法就是:设置spring.cloud.netflix.metrics.enabled:false。此种情况下不会自动配置该类,在不需要使用它的接口监控的时,可以在配置关闭该功能。 以我的application-dev.yaml文件为例:
|