写点什么

清理 SpringBoot 应用无用的 metrics 指标

用户头像
LanLiang
关注
发布于: 2021 年 04 月 12 日
清理SpringBoot应用无用的metrics指标

前言

上周有个网友问 springboot 程序的 metrics 越来越多了,有 40W 的指标,现在想清除一些没用的 metrics,要怎样做呢?!


当时我看到这个问题觉得挺有意思,因为我的线上程序也有动态 metrics,只不过指标没有达到那么大的量,所以我研究了一下这个问题可以怎么样处理.

用什么添加做的动态 metrics 就先看支不支持删除

动态创建 metrics 是直接用的io.micrometer.core.instrument.MeterRegistry对象,例如:registry.gauge(name,tags,valueObject).就可以将一个 name 的 gauge 类型的 metrics 添加到 registry 里面了,收集 metrics 时就可以看到这个新增的 metrics 了.


于是看看这个对象还有什么删除相关的方法:


首先尝试的时delete方法,发现没有类似的方法:



然后试试remove,可以发现有两个 remove 方法可以用,分别传入ID对象metrics对象,但如果需要全部清理呢?有没有类似 List 的 clear 方法呢?



再试试clear方法,发现是有这个方法的,并且我先测试了一遍,看看clear方法是否能够达到预期(清除 metrics).


实操测试

于是我一顿操作:


  1. 写一个 API 接口,接口内容是执行meterRegistry.clear();

  2. 启动 springboot 程序

  3. 浏览器看看/actuator/prometheus接口返回的内容

  4. 调用清理 metrics 的接口,也就是第一步写的接口

  5. 再次浏览器看看/actuator/prometheus接口返回的内容


清理 metrics 前的接口内容:



清理了 metrics 后的接口内容:



可以看到调用接口后 metrics 清除了信息.


方法有效✔, 可以给网友回复了.

网友实操不行


网友说没这个方法? 咋回事?!


点进 clear 源码看了一下,方法说明描述得很清楚,1.2.0 版本发布的方法,而网友用的版本低于 1.2.0,因此没有这个方法.


/**     * Clear all meters.     * @since 1.2.0     */    @Incubating(since = "1.2.0")    public void clear() {        meterMap.keySet().forEach(this::remove);    }
复制代码

能不能根据根据某些标签来删除特定的 metrics


当然可以!



可以看到每一个 metrics 的 tag 列表都可以拿得到,那就好办了,通过标签对比筛选出自己想要删除的 metrics,然后用remove方法删除就可以了.

总结

当程序有动态新增 metrics 时就要考虑无用 metrics 清除的机制,如果 metrics 数量太多的话就会影响到业务应用.

发布于: 2021 年 04 月 12 日阅读数: 23
用户头像

LanLiang

关注

天道酬勤 2018.04.28 加入

爱好开源,追随云原生。 github.com/liangyuanpeng 公众号:四颗咖啡豆

评论

发布
暂无评论
清理SpringBoot应用无用的metrics指标