如何通过标签筛选获取最新的指标版本值(以application_version为例)
如何通过标签筛选获取最新的指标版本值(以application_version为例)
嗨Rémy,我之前处理go_info这类带版本标签的指标时,也碰到过完全一样的问题——用last_over_time拿到一堆版本记录,却没法直接提取最新的那个。分享几个亲测有效的解决方法,你可以根据自己的场景选:
方法一:利用版本号的数值化排序(适合x.y.z格式的版本)
如果你的版本号是类似21.1.3这种纯数字加小数点的格式,可以把版本号转换成纯数字,通过数值大小排序来拿到最新版本:
last(sort_desc( last_over_time(application_version{site="NYC", instance="Test", id!=""}[1h]) * on(version) group_left() to_number(label_replace(application_version{site="NYC", instance="Test", id!=""}, "version_num", "$1$2$3", "version", "(\\d+)\\.(\\d+)\\.(\\d+)")) ))
原理:
- 用
label_replace把version标签里的数字部分提取出来(比如21.1.3变成2113),再转成数值 - 把原指标的样本值和这个数值相乘,这样新版本对应的样本值会更大
- 用
sort_desc按样本值从大到小排序,最后用last取最大的那个,就是最新版本的记录
方法二:按样本时间戳排序(适合版本更新时生成新样本的场景)
如果每次版本升级时,旧版本的指标就会停止生成,新版本会生成时间戳更晚的样本,那可以直接按时间戳排序取最新的:
topk(1, last_over_time(application_version{site="NYC", instance="Test", id!=""}[1h]))
原理:topk(1, ...)会返回样本值最大的前1条,但如果你的指标值都是1,Prometheus在样本值相同时会默认按时间戳排序,刚好返回时间戳最晚的那条,也就是最新的版本记录。
为什么你用without没成功?
without只是在聚合操作中移除指定标签,它的作用是简化结果的标签集,而不是帮你筛选出最新的版本记录。比如你用last_over_time(...) without (id),只会去掉id标签,但还是会保留所有不同版本的记录,所以解决不了你的问题。
备注:内容来源于stack exchange,提问作者Rémy J.
相关产品推荐
相关产品推荐

