我已经 Build 了Prometheus监控,并根据以下标准生成“正常运行时间”报告:'错误率<x%' . 相应的PromQL是
(
sum(increase(errors[5m]))
/ sum(increase(requests[5m]))
) <= bool 0.1
这将显示在Grafana的单一统计面板中 .
我现在想要实现的是从'downtime'状态恢复所需的平均时间 . 从图形上看,我需要下面标记为1和2的间隔的平均持续时间 .
我怎样才能在普罗米修斯计算出这个指标?
更新:我不是在寻找统计数据为0时的平均持续时间,而是寻找统计数据为0时的平均持续时间 .
例如,考虑以下时间序列(假设每分钟采样一次):
1 1 1 0 0 1 1 1 1 1 0 0 0 1
我们基本上有两个"down"间隔: 0 0
和 0 0 0
. 根据定义,持续时间为2分钟和3分钟,因此平均恢复时间为 (2+3)/2 = 2.5
.
我基于阅读文档和实验的理解是 avg_over_time
将计算算术团队,例如 sum(up)/count(up) = 9/14 =~ 0.64
我需要计算第一个测量值,而不是第二个测量值 .
1 回答
TLDR ;
您需要通过在规则文件中定义的Recording rule将其转换为0或1,将文件的路径添加到prometheus.yml中以读取规则 .
然后你可以做avg_over_time(my_metric_below_threshold [5m])
The full details :
基本上你需要的是值为0或1的avg_over_time . 然而,bool修饰符的结果是即时向量 . 但是,avg_over_time在其调用中需要类型范围向量 . instant vector Vs. range vector is .
解决方法是使用Recording rules . 你可以看到关于这个Prometheus github,this Stack question和这个解释https://www.robustperception.io/composing-range-vector-functions-in-promql的对话 .
因此,正如我上面所解释的以及上面引用的 - 来自Prometheus的核心开发人员 - 你应该能够得到你需要的东西 .
问题编辑后添加:
这样做并不简单,因为您需要"memory"的最后样本 . 但是可以使用Textfile Collector和Prometheus Http API来完成 .
如上所述使用Recording rule定义my_metric_below_threshold .
使用Textfile Collector安装Node exporter .
编写一个脚本(即successive_zeros.py)py / bash,它运行在任何地方,使用Prometheus Http API
GET /api/v1/query
查询该指标 .将连续的零保存为环境参数,并清除或增加此参数 .
以Textfile Collector文档中描述的请求格式写入结果 - 而不是在Prometheus中使用successive_zeros_metrics .
对successive_zeros_metrics执行avg_over_time()
这是我所谈论的概念的伪代码: