You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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"})

逻辑说明

  1. min by(env, job) 将同env、job下的所有instance数据聚合为一个最小值,结果仅保留env和job标签
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:05:20