跳转至

阈值

PromQL 通过提供一组过滤的二元运算符(><== 等),允许根据其样本值过滤一组序列,这种过滤最常见的场景就是在报警规则中使用的阈值。比如我们想查找在过去 15 分钟内的 status="500" 错误率大于 20% 的所有 HTTP 路径,我们在 rate 表达式后面添加一个 >0.2 的过滤运算符:

rate(demo_api_request_duration_seconds_count{status="500",job="demo"}[15m]) > 0.2

这个查询只会将错误率大于 20% 的数据过滤出来。

>20%

注意:由于在图形中的每个步长都是完全独立评估表达式的,因此根据每个步骤的过滤条件,某些比率会出现或消失(因此存在间隙)。 一般来说,二元过滤运算符在图形中并不常见,大多数在报警条件中出现,用来表示阈值。

这种过滤方式不仅适用于单个数字,PromQL 还允许你用一组时间序列过滤另一组序列。与上面的二元运算一样,比较运算符会自动应用于比较左侧和右侧具有相同标签集的序列之间。 on() / ignoring()group_left() / group_right() 修饰符的作用也与我们前面学习的二元算术运算符一样。

以下示例是选择所有具有 500 错误率且至少比同一路径的总请求率大 50 倍的路径:

  rate(demo_api_request_duration_seconds_count{status="500",job="demo"}[5m]) * 50
> ignoring(status)
  sum without(status) (rate(demo_api_request_duration_seconds_count{job="demo"}[5m]))

不过需要注意的是我们必须忽略匹配中的 status 标签,因为在左边一直有这个标签,而右边没有这个标签。

错误率

比如我们还可以计算 demo 演示服务实例在一小时内的预测磁盘使用量,但要过滤只有那些预测磁盘已满的实例。

predict_linear(demo_disk_usage_bytes{job="demo"}[1h], 3600) >= demo_disk_total_bytes{job="demo"}

Prometheus 支持以下过滤操作:

  • ==
  • !=
  • <
  • <=
  • >
  • >=

有时你可能想知道比较运算符的结果而不实际删除任何输出系列。要实现这一点,我们可以向运算符添加一个 bool 修饰符来保留所有的序列,但是把输出样本值设置为 1(比较为真)或 0(比较为假)。

例如,要简单地显示一组数据中哪些请求率高于或低于 0.2/s,我们可以这样查询:

rate(demo_api_request_duration_seconds_count{job="demo"}[5m]) > bool 0.2

我们可以看到输入序列的结果为 0 或 1,把数字条件转换为了布尔输出值。

bool修饰符

练习:

1.构建一个查询,显示使用少于 20MB 内存的目标(process_resident_memory_bytes 指标)。

process_resident_memory_bytes / 1024^2 < 20

2.构建一个查询,显示 Prometheus 服务内部所有在过去 5 分钟内没有收到任何查询的 HTTP 处理器。

rate(prometheus_http_requests_total[5m]) == 0