VictoriaMetrics查询求助:获取Top100节点温值及5m窗口导数
问题:获取温度最高的前100组(node_id, system_id)及其5分钟窗口内的每秒导数
temperature是gauge类型指标,每个node_id+system_id的标签组合对应唯一温度值(比如{"1","1"}对应10、{"2","1"}对应23等)。需求是:
- 筛选出温度最高的前100组标签组合
- 同时获取这些组合在5分钟回溯窗口内的每秒温度导数
尝试过的查询语句
第一次尝试
topk(100, temperature)[5m] , on(node_id, system_id) group_left() deriv(temperature[5m])
第二次尝试
with ( top_nodes = topk(100, temperature[5m]) by (node_id) ) ( label_set(label_del(top_nodes,"__name__"),"metric","top-100") ) or ( label_set(deriv(temperature[5m]),"metric", "deriv") and on(node_id) top_nodes )
可行查询方案
方案1:直接关联topk结果与导数
topk(100, temperature) | on(node_id, system_id) group_left() deriv(temperature[5m])
这个查询先获取当前时刻温度最高的100组标签组合,再通过on(node_id, system_id) group_left()关联这些组合对应的5分钟窗口内每秒导数。
方案2:带标签区分的写法(方便可视化)
如果需要在结果中明确区分原始温度和导数指标,可以用with子句加标签标记:
with ( top_temp = topk(100, temperature) ) label_set(top_temp, "metric", "temperature") or label_set(deriv(temperature[5m]) * on(node_id, system_id) group_left() top_temp, "metric", "rate_of_change")
特殊场景调整:基于5分钟窗口内的最高温度筛选
如果需求是筛选5分钟窗口内曾达到最高温度的前100组,而非当前时刻的温度,可将topk的输入替换为窗口内的最大值:
topk(100, max_over_time(temperature[5m])) | on(node_id, system_id) group_left() deriv(temperature[5m])
注意事项
deriv仅支持gauge类型指标,且要求5分钟窗口内至少有2个样本点才能计算有效导数- 确保
node_id和system_id是所有目标时间序列都包含的标签,避免关联失败
内容的提问来源于stack exchange,提问作者crr
相关产品推荐
相关产品推荐

