我有两个指标:
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()而不是使用偏移方法,但无论如何。这仅适用于一个变量组合:
一旦我对
$My_Name
变量进行多重选择,我仍然只得到一张图表。另外,由于使用 vector()
,标签丢失了,所以也许我需要一种非常不同的方法?
是否有可能获得一个指标作为 PromQL 结果来进行异常检测并支持变量输入的多重选择?目前我不知道如何实现这一目标。
不确定我是否理解了所有内容,但我会尝试=)
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
。