Prometheus中的时间加权范围查询

问题描述

我想为记录的跟踪错误计算性能指标,这是Prometheus坚持的时间序列。我感兴趣的是:

  • IAE:绝对绝对误差
  • ISE:积分平方误差
  • ITAE:积分时间绝对误差
  • ITSE:积分时间平方误差

为澄清起见,它们的计算如下:

enter image description here

IAE和ISE应该很简单。如果使用ITAE和ITSE,“较旧的”错误值的影响会减小,并强调新的错误值。

我已经创建了两个普罗米修斯规则:

rules:
- record: tracking_error:absolute
  expr: abs(tracking_error)
- record: tracking_error:squared
  expr: tracking_error*tracking_error

这些使我能够查询IAE和ISE:

# IAE
sum_over_time(tracking_error:absolute[1h])
# ISE
sum_over_time(tracking_error:squared[1h])

但是我在设计时间加权积分ITSE和ITAE的查询时遇到困难。

我当前的方法如下:

我创建了一组附加了带有时间戳记的规则:

rules: 
- record: tracking_error:timestamp
  expr:  time()
- record: tracking_error:timestamp:labelled
  expr: label_replace(tracking_error:timestamp,"errorName","someError","","")

继而可以编写如下查询

sum_over_time(
  (
    tracking_error:absolute * ignoring (endpoint,instance,job,namespace,pod,service) group_left (errorName) (tracking_error:timestamp:labelled-(tracking_error:timestamp:labelled offset 1m))
  )[1m:]
)

感觉非常讨厌。这是否正确,还有其他更好的方法吗?我希望有人可以在这里帮助我。

解决方法

好得多,并且不依赖于其他规则:

sum_over_time(
  (
    tracking_error:absolute 
    * 
    (timestamp(tracking_error:absolute)-timestamp(tracking_error:absolute offset 1m))

  )[1m:]
)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...