解决使用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文件为例: