Prometheus 是围绕返回指标的时间序列表示而构建的。然而,在许多情况下,我只关心指标现在的状态,我很难找到一种可靠的方法来获取指标的“最新”值。
因为现在它每 30 秒获取一次指标,所以我尝试了这样的方法:
my_metric[30s]
但这感觉很脆弱。如果指标的日期在数据点之间超过或少于 30 秒,那么我要么得到一个以上的结果,要么得到零个结果。
如何获取指标的最新值?
Prometheus 是围绕返回指标的时间序列表示而构建的。然而,在许多情况下,我只关心指标现在的状态,我很难找到一种可靠的方法来获取指标的“最新”值。
因为现在它每 30 秒获取一次指标,所以我尝试了这样的方法:
my_metric[30s]
但这感觉很脆弱。如果指标的日期在数据点之间超过或少于 30 秒,那么我要么得到一个以上的结果,要么得到零个结果。
如何获取指标的最新值?
您只需要my_metric
,默认情况下将返回不超过 5 分钟的最新值。
如果您直接使用query_range API 端点使用Prometheus ,您将获得时间序列。如果您切换到查询API 端点,您将获得最后一个值。
在Grafana 中,您可以通过切换Instant -toggle 从时间序列切换到最后一个值。
我通过 prom/cloudwatch-exporter 从 AWS 获得的指标也有类似的问题。AWS 似乎需要一段时间才能收敛其 CloudWatch 指标。过去大约需要 10 分钟,但现在更像是 13 分钟。我们一直遗漏诸如磁盘空间不足之类的问题,因为这些指标完全无法到达 prometheus,因此我们的警报毫无用处。
我发现“偏移”在这里很有用,我想要最后一个指标,但它在 5m 截止值之外。因此,通过指定偏移量,我仍然可以获取一个值而不是什么都没有。例子:
aws_ec2_cpuutilization_average offset 15m
鉴于这种:
namespace_metricname_count_sum{id="1",status="to-do"}
namespace_metricname_count_sum{id="1",status="in-progress"}
如果要获取最新值,则需要使用在这种情况下的共同值,即id=~".*"
通过对日志进行分组,您将能够获取时间范围内的最后一个值
count ( max_over_time ( namespace_metricname_count_sum{id=~".*"}[12h])) by (status)
要在不使用 hacky PromQL 查询的情况下获取my_metric
超过 5m的最新值,您可以修改定义query.lookback-delta
此默认5m
值的 Prometheus 选项。
例如,--query.lookback-delta=1d
在 Prometheus 启动选项中指定并重新启动服务将导致 PromQL 查询返回24 小时回顾my_metric
的最新值。my_metric
此“回溯时间窗口”之外的指标称为stale。