如何用PromQL在时间间隔内为实例减去时序数据最小值?
问题:计算Nomad Raft实例间的appliedIndex相对差异
我有一个带有env、job、instance标签的指标nomad_raft_appliedIndex,该指标每个时间间隔都会增长,核心需求是对比实例间的增长差异而非绝对值——需要在每个时间间隔内取所有实例的最小值,再让每个实例的数值减去这个最小值。
示例数据
2022-12-09 11:32:30 1040095 1040095 2022-12-09 11:32:45 1040102 1040100 2022-12-09 11:33:00 1040103 1040106
期望结果
2022-12-09 11:32:30 0 0 2022-12-09 11:32:45 2 0 2022-12-09 11:33:00 0 3
也接受能体现相对差异的替代方案,比如基于Grafana时间间隔,用increase或rate结合最小/最大值计算的结果。
尝试过的语句及问题
语句1
nomad_raft_appliedIndex{env="$env",job="nomad"} - on (env, job) group_left (instance) min without(instance) (nomad_raft_appliedIndex{env="$env",job="nomad"})
报错:
execution: multiple matches for labels: grouping labels must ensure unique matches
语句2
nomad_raft_appliedIndex{env="$env",job="nomad"} - on (env, job) (bottomk by (env, job) (1, nomad_raft_appliedIndex{env="$env",job="nomad"}))
报错:
execution: multiple matches for labels: many-to-one matching must be explicit (group_left/group_right)
语句3
nomad_raft_appliedIndex{env="$env",job="nomad"} - (bottomk by (env, job) (1, nomad_raft_appliedIndex{env="$env",job="nomad"}))
结果:仅得到一个全零值的实例
语句4
nomad_raft_appliedIndex{env="$env",job="nomad"} - (min without(instance) (nomad_raft_appliedIndex{env="$env",job="nomad"}))
结果:Grafana显示“无数据”(标签不匹配),添加[$__interval]后仍无效
解决方案
核心需求实现语句
要实现“每个时间点取同组实例的最小值,每个实例减去该最小值”,需确保标签匹配逻辑正确,使用group_left明确保留instance标签,同时保证分组后结果唯一:
nomad_raft_appliedIndex{env="$env", job="nomad"} - on(env, job) group_left(instance) min by(env, job) (nomad_raft_appliedIndex{env="$env", job="nomad"})
逻辑说明
min by(env, job)将同env、job下的所有instance数据聚合为一个最小值,结果仅保留env和job标签on(env, job) group_left(instance)指定以env、job为匹配键,将聚合后的单条数据匹配到所有对应env、job的instance指标上,完成多对一的减法运算
替代方案(增长幅度差异)
如果关注的是时间间隔内的增长幅度差异,可以用increase结合最小值计算:
increase(nomad_raft_appliedIndex{env="$env", job="nomad"}[$__interval]) - on(env, job) group_left(instance) min by(env, job) (increase(nomad_raft_appliedIndex{env="$env", job="nomad"}[$__interval]))
该语句会计算每个实例在Grafana当前间隔内的增长值,再减去同组内的最小增长值,直接体现实例间的增长差异。
内容的提问来源于stack exchange,提问作者KamilCuk
相关产品推荐
相关产品推荐

