我有一个名为
position
的时间序列存储在 Prometheus 中。它代表线性执行器的位置。我想计算执行器在给定时间范围内行驶的距离。像这样:
如果我手动执行此操作,我将获取时间序列中每个样本之间的绝对增量,并将自选定范围开始以来的它们相加。我正在努力拼凑正确的 PromQL 查询来实现这一目标。
我尝试了一些这样的查询:
sum_over_time(abs(delta(position[$__range])))
(我使用 Grafana 执行查询,因此可以使用一些模板变量,如
$__range
、$__interval
和 $__rate_interval
)
这失败了:
1:15: parse error: expected type range vector in call to function "sum_over_time", got instant vector
我尝试过子查询,但得到的结果随着分辨率的变化而发生根本变化,并且不正确。
我也看了这个问题,但我的输入指标是一个仪表而不是计数器。
我应该编写什么查询才能获得图示的输出?
idelta
:它计算指标的最新样本之间的差异。
sum_over_time
接受作为输入范围向量,因此您需要第二次提供范围选择器(并且由于它应用于比向量选择器更复杂的东西,因此您需要使用 subquery 语法 [range:resolution]
)
因此,您的查询结果将类似于:
sum_over_time(abs(idelta(position[5m]))[$__range:1m])
这里,
5m
是保证比你的scrape_interval
更大的范围。
1m
正是 scrape_interval
。根据您的情况进行相应调整。
请注意,此查询对指标缺失非常敏感,并且可能会产生不正确的结果。
此外,它可能不是从面板左侧的 0 开始(如果面板中显示的内容之前有任何位置数据)。假设您的仪表板的时间范围为一小时。然后每个数据点将代表该数据点之前的最后一小时内执行器移动了多少。
如果您需要每个图表从 0 开始,并且仅从那里开始增加,您可以尝试将
idelta
内部替换为类似
node_cpu_seconds_total{mode="idle"} and on() timestamp(node_cpu_seconds_total)>timestamp(node_cpu_seconds_total@start()))
[5m:5s]
但是我没有任何像这样的输入数据来正确测试它,所以你可能需要稍微调整一下(或不调整一点)。