grafana - 计算值在转换为 1 之前设置为 0 的平均时间
问题描述
我已经设置了 Prometheus 监控,并且正在根据以下标准生成“正常运行时间”报告:“错误率 < x%”。对应的 PromQL 是
(
sum(increase(errors[5m]))
/ sum(increase(requests[5m]))
) <= bool 0.1
这会显示在 Grafana 的单一统计面板中。
我现在想要实现的是从“停机”状态恢复所需的平均时间。从图形上看,我需要下面标记为1和2的间隔的平均持续时间。
如何在 Prometheus 中计算此度量?
更新:我不是在寻找统计数据为 0 时的平均持续时间,而是寻找统计数据为 0 时的平均持续时间。
例如,考虑以下时间序列(假设值每分钟采样一次):
1 1 1 0 0 1 1 1 1 1 0 0 0 1
我们基本上有两个“下降”区间:0 0
和0 0 0
。根据定义,持续时间为 2 分钟和 3 分钟,因此平均恢复时间为(2+3)/2 = 2.5
.
我基于阅读文档和实验的理解是,avg_over_time
将计算一个算术团队,例如sum(up)/count(up) = 9/14 =~ 0.64
我需要计算第一个度量,而不是第二个。
解决方案
TLDR ;
您需要通过您在规则文件中定义的记录规则将其转换为 0 或 1 ,将要读取规则的文件路径添加到您的 prometheus.yml 中。
my_metric_below_threshold = (sum(increase(errors[5m])) / sum(increase(requests[5m]))) <= bool 0.1
然后你可以做 avg_over_time(my_metric_below_threshold[5m])
完整的细节:
基本上你需要的是值为 0 或 1 的 avg_over_time。但是 bool 修饰符的结果是即时向量。但是, avg_over_time 在其调用中需要类型范围向量。即时向量 Vs。范围向量是。
即时向量 - 一组时间序列,每个时间序列包含一个样本,都共享相同的时间戳
范围向量 - 一组时间序列,其中包含每个时间序列随时间变化的数据点范围
解决方案是使用Recording rules。你可以看到关于这个Prometheus github的对话,这个 Stack 问题和这个解释https://www.robustperception.io/composing-range-vector-functions-in-promql。
PromQL 中有两种一般类型的函数,它们将时间序列作为输入,一种是采用向量并返回一个向量(例如 abs、ceil、hour、label_replace),另一种是采用范围向量并返回一个向量(例如 rate、推导,预测线性,*_over_time)。
没有接受范围向量并返回范围向量的函数,也没有办法执行任何形式的子查询。即使支持子查询,您也不希望经常使用它们,因为它们会很昂贵。那么该怎么做呢?
答案是对内部函数使用记录规则,然后您可以在它创建的时间序列上使用外部函数。
所以,正如我在上面和上面的引文中解释的那样——取自 Prometheus 上的核心开发人员——你应该能够得到你需要的东西。
问题编辑后添加:
这样做并不简单,因为您需要最后一个样本的“记忆”。但是可以使用Textfile Collector和Prometheus Http API来完成。
如上所述,使用记录规则定义 my_metric_below_threshold 。
使用Textfile Collector安装节点导出器。
文本文件收集器类似于 Pushgateway,因为它允许从批处理作业中导出统计信息。它还可以用于导出静态指标,例如机器的角色。Pushgateway 应该用于服务级别指标。textfile 模块用于与机器相关的指标。要使用它,请在节点导出器上设置 --collector.textfile.directory 标志。收集器将使用文本格式解析该目录中与 glob *.prom 匹配的所有文件。
编写一个脚本(即,successful_zeros.py)py/bash,它可以在任何地方运行,以使用Prometheus Http API
GET /api/v1/query
查询这个指标。将连续的零保存为环境参数并清除或增加此参数。
以Textfile Collector文档中描述的请求格式写入结果- 而不是 Prometheus 中的 Continuous_zeros_metrics。
执行 avg_over_time()
这是我谈论的概念的伪代码:
#!/usr/bin/python
# Run as the node-exporter user like so:
# 0 1 * * * node-exporter /path/to/runner successive_zeros.py
r = requests.get('prometheus/api/v1/query'))
j = r.json()
......
if(j.get('isUp') == 0)
successive_zeros = os.environ['successive_zeros']
else
successive_zeros = os.environ['successive_zeros']+
os.environ['successive_zeros'] = successive_zeros
......
print 'successive_zeros_metrics %d' % successive_zeros
推荐阅读
- asp.net - SSMS 和 ASP.NET 中存储过程的不同输出
- javascript - 如何将图像文件添加到表格单元格,其中这两个元素都是使用 JS 动态创建的?
- ios - 如何同时获取键盘的大小和所选 UITextField 的 CGFrame?
- asp.net - 被 CORS 策略阻止:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段授权
- javascript - 如何按日期对数组对象进行排序?
- docker - ubuntu 18.10 和 docker 上的 ghostscript pdf/a 转换问题
- css - 如何在 CSS 中指定 == $0?
- android - Fabric apiSecret 是做什么用的?
- c - 编写嵌入式驱动程序的序列
- java - 如何让我的 HashMap 正确打印到文件