如何为含OR条件的指标使用changes函数并实现初始峰值
解决PromQL首次出现指标时显示峰值的问题
你之前遇到的错误是因为changes函数要求参数是范围向量,而范围向量只能直接基于原始指标选择器生成(比如metric{public!="0"}[1d]),不能是or运算后的结果——这就是"range query can only be applied to vector selectors"报错的原因。
要实现「首次出现指标时显示1的峰值,之后回落至0(或正常显示变化次数)」的需求,可以用以下两种方案:
方案1:首次出现显示1,之后正常显示变化次数
这个方案会在指标首次出现时返回1,后续指标有变化时返回变化次数,无变化时返回0:
changes(metric{public!="0"}[1d]) + ignoring() (vector(1) unless last_over_time(metric{public!="0"}[1d] offset 1s))
逻辑拆解:
changes(metric{public!="0"}[1d]):计算1天窗口内指标的变化次数,首次出现时该值为0last_over_time(metric{public!="0"}[1d] offset 1s):查询当前时刻前1秒开始的1天窗口内的指标最后值,为空则说明当前是首次出现vector(1) unless ...:仅当首次出现时返回1,其余情况返回空(等价于0)+ ignoring():忽略标签差异,将两部分结果相加
方案2:仅首次出现显示1,之后始终返回0
如果只需要首次出现的峰值,后续不管指标是否变化都显示0,用这个查询即可:
ignoring() (vector(1) unless last_over_time(metric{public!="0"}[1d] offset 1s))
内容的提问来源于stack exchange,提问作者samiullah ilyas
相关产品推荐
相关产品推荐

