PromQL:检测一个指标何时发生变化而另一个指标没有变化

问题描述 投票:0回答:1

我有两个指标:

my_bytes_in
my_bytes_out
。我想检测
my_bytes_in
何时发生变化,而
my_bytes_out
在几分钟内没有变化。作为伪代码,你可以说:

IF my_bytes_in changed over the last five minutes while my_bytes_out did not 
THEN return 1 
ELSE return 0

在 PromQL 中我构建了这个查询:

((vector(1) and on() (sum(my_bytes_in{project="$Project", stage="$Stage", myname=~"$My_Name"}) - sum(my_bytes_in{project="$Project", stage="$Stage", myname=~"$My_Name"} offset 5m)) != 0 and (sum(my_bytes_out{project="$Project", stage="$Stage", myname=~"$My_Name"}) - sum(my_bytes_out{project="$Project", stage="$Stage", myname=~"$My_Name"} offset 5m)) == 0) or on() vector(0))

您可能可以使用rate()而不是使用偏移方法,但无论如何。这仅适用于一个变量组合:

grafana screenshot

一旦我对

$My_Name
变量进行多重选择,我仍然只得到一张图表。另外,由于使用
vector()
,标签丢失了,所以也许我需要一种非常不同的方法?

是否有可能获得一个指标作为 PromQL 结果来进行异常检测并支持变量输入的多重选择?目前我不知道如何实现这一目标。

prometheus grafana metrics promql
1个回答
0
投票

不确定我是否理解了所有内容,但我会尝试=)

更改()

changes()函数显示其值在提供的时间范围内更改的次数。

F.e 指标

my_bytes_in
在过去 5 分钟内有多少变化(为简单起见,省略标签):

changes(my_bytes_in{}[5m])

布尔

bool运算符可用于将过滤条件转换为

1
0
(稍后我们将使用它们进行乘法)

显示

1
表示公制
my_bytes_in
如果过去 5 分钟内有变化,则显示
0
如果没有变化:

changes(my_bytes_in{}[5m]) > bool 0

显示

1
表示公制
my_bytes_in
如果过去 5 分钟没有任何变化,则显示
1
表示有一些变化:

changes(my_bytes_out{}[5m]) != bool 0

矢量匹配

由于您按标签

project
stage
myname
进行过滤,我想您希望通过所有其他标签来匹配结果。

让我们结合在一起:

(changes(my_bytes_in{project="$Project", stage="$Stage", myname=~"$My_Name"}[5m]) > bool 0) 
  * ignoring (project, stage, myname)
(changes(my_bytes_out{project="$Project", stage="$Stage", myname=~"$My_Name"}[5m]) != bool 0)

因此,结果查询仅对于两个条件均返回

1
1
*
1
=
1
)的时间序列返回
1
,否则返回
0

© www.soinside.com 2019 - 2024. All rights reserved.