如何用PromQL按实例获取10天内system_name指标的最新值
解决PromQL按实例获取最新system_name的问题
核心问题分析
你遇到的问题是:同一个instance在10天内变更过system_name,导致group(last_over_time(system_name{}[10d])) by (system_name, instance)会返回该instance的两个system_name值,而你需要每个instance只保留最新时间戳对应的system_name,同时不能丢失system_name信息,还要兼容设备离线的场景(必须用基于历史数据的函数)。
解决方案
方法一:通过时间戳匹配筛选最新样本
直接筛选每个instance过去10天内时间戳最大的那个system_name样本,保留对应的system_name标签:
system_name{} * on(instance) group_left() (timestamp(system_name{}) == max_over_time(timestamp(system_name{})[10d]) by (instance))
逻辑说明:
max_over_time(timestamp(system_name{})[10d]) by (instance):计算每个instance在过去10天内的最大样本时间戳(即该instance最新一次上报system_name的时间)- 用
==匹配原指标中时间戳等于这个最大值的样本,再通过group_left()关联保留system_name标签,最终每个instance只会返回最新的那个system_name值。
方法二:利用last聚合函数简化(适用于Prometheus v2.45+)
如果你的Prometheus版本足够新(支持last聚合函数),可以直接用更简洁的语句:
last by (instance) (system_name{}[10d])
逻辑说明:
last by (instance)会按instance分组,取每组内时间戳最新的样本,同时自动保留该样本的所有标签(包括system_name),这样每个instance只会返回最新的system_name值。
原语句问题原因
你原来的group(last_over_time(system_name{}[10d])) by (system_name, instance)是按system_name和instance两个维度分组,同一个instance下不同的system_name会被分成独立的组,自然会返回多个结果。只要去掉system_name分组维度,再确保保留最新的标签值即可解决问题。
内容的提问来源于stack exchange,提问作者charr334
相关产品推荐
相关产品推荐

