基于VictoriaMetrics,如何编写PromQL计算全维度的方法调用成功次数
基于VictoriaMetrics,如何编写PromQL计算全维度的方法调用成功次数
嘿,这个问题我太熟悉了——你现在踩的是PromQL二元运算默认标签匹配的坑!直接用减法的话,只有两个指标标签完全一致的时间序列才会被保留,那些没有错误记录的维度自然就被过滤掉了。
为什么原来的写法不行?
当你执行method_totalCall{host='h1'} - method_totalCall_ERROR{host='h1'}时,PromQL的减法运算会自动做标签匹配:只有两边host、dst、src标签完全对应的序列才会参与计算。像dst="a1", src="a2"和dst="b1", src="b2"这些维度,因为method_totalCall_ERROR里没有对应数据,减法后就直接消失了。
解决方法:给缺失的错误维度补0
我们只需要给那些没有错误记录的维度补上0值,让减法能覆盖所有method_totalCall的维度。在VictoriaMetrics里有两种简洁可行的写法:
写法一:用default函数兜底
method_totalCall{host='h1'} - method_totalCall_ERROR{host='h1'} default method_totalCall{host='h1'}
逻辑很直白:
- 有错误记录的维度,正常计算
total - error得到成功数; - 没有错误记录的维度,减法结果不存在,这时用
default直接取method_totalCall的值(等同于total - 0)。
写法二:给错误指标显式补0(更严谨)
method_totalCall{host='h1'} - (method_totalCall_ERROR{host='h1'} or on(host, dst, src) vector(0))
这个写法的核心是:
- 用
or on(host, dst, src) vector(0)为所有method_totalCall存在但method_totalCall_ERROR不存在的标签组合,生成值为0的序列; - 再用
total减去补全后的错误指标,确保所有维度都被保留。
最终效果
不管用哪种写法,你都能得到想要的完整结果:
methed_succ_count{host="h1", dst="a1", src="a2"}@t1 = 24 methed_succ_count{host="h1", dst="b1", src="b2"}@t1 = 30 methed_succ_count{host="h1", dst="c1", src="c2"}@t1 = 2 methed_succ_count{host="h1", dst="d1", src="d2"}@t1 = 4 methed_succ_count{host="h1", dst="e1", src="e2"}@t1 = 18
备注:内容来源于stack exchange,提问作者i_have_a_question
相关产品推荐
相关产品推荐

