计算在转换为1之前将值设置为0的平均时间

Rob*_*anu 7 grafana prometheus

我已经建立了Prometheus监控,并且我正在根据以下标准生成"正常运行时间"报告:'错误率<x%'.相应的PromQL是

( 
  sum(increase(errors[5m]))
  / sum(increase(requests[5m]))
) <= bool 0.1
Run Code Online (Sandbox Code Playgroud)

这将显示在Grafana的单一统计面板中.

我现在想要实现的是从"停机"状态恢复所需的平均时间.从图形上看,我需要下面标记为12的间隔的平均持续时间.

正常运行时间图

如何在普罗米修斯计算这个指标?


更新:我不是在寻找统计数据为0时的平均持续时间,而是寻找统计数据为0时的平均持续时间.

例如,考虑以下时间序列(假设每分钟采样一次):

1 1 1 0 0 1 1 1 1 1 0 0 0 1 
Run Code Online (Sandbox Code Playgroud)

我们基本上有两个"向下"间隔:0 00 0 0.根据定义,持续时间为2分钟和3分钟,因此平均恢复时间为(2+3)/2 = 2.5.

我基于阅读文档和实验的理解是avg_over_time计算算术团队,例如sum(up)/count(up) = 9/14 =~ 0.64

我需要计算第一个测量值,而不是第二个测量值.

Gal*_*l S 5

TLDR ;

您需要通过在规则文件中定义的记录规则将其转换为 0 或 1 ,将文件的路径添加到 prometheus.yml 中以读取规则。

my_metric_below_threshold = (sum(increase(errors[5m])) / sum(increase(requests[5m]))) <= bool 0.1
Run Code Online (Sandbox Code Playgroud)

然后你可以做 avg_over_time(my_metric_below_threshold[5m])

完整的细节

基本上你需要的是值 0 或 1 的 avg_over_time。但是 bool 修饰符的结果是即时向量。但是, avg_over_time 在其调用中需要类型 range vector。即时向量 Vs。范围向量是

即时向量 - 一组时间序列,每个时间序列包含一个样本,所有时间序列都共享相同的时间戳

范围向量 - 一组时间序列,包含每个时间序列随时间变化的数据点范围

对此的解决方案是使用Recording rules。你可以看到关于这个Prometheus github的对话,这个 Stack 问题以及这个解释https://www.robustperception.io/composing-range-vector-functions-in-promql

PromQL 中有两种一般类型的函数以时间序列作为输入,一种采用向量并返回向量(例如 abs、ceil、hour、label_replace),以及采用范围向量并返回向量(例如 rate、 deriv、predict_linear、*_over_time)。

没有接受范围向量并返回范围向量的函数,也没有办法进行任何形式的子查询。即使支持子查询,您也不希望经常使用它们,因为它们很昂贵。那么该怎么做呢?

答案是对内部函数使用记录规则,然后您可以在它创建的时间序列上使用外部函数。

所以,正如我在上面和上面解释的那样——摘自 Prometheus 上的核心开发人员——你应该能够得到你需要的东西。


问题编辑后添加:

这样做并不容易,因为您需要对最后一个样本的“记忆”。但是可以使用Textfile CollectorPrometheus Http API来完成。

  1. 使用上述记录规则定义 my_metric_below_threshold 。

  2. 使用Textfile Collector安装节点导出

    文本文件收集器类似于 Pushgateway,因为它允许从批处理作业中导出统计信息。它还可以用于导出静态指标,例如机器具有的角色。Pushgateway 应该用于服务级别指标。textfile 模块用于与机器相关的指标。要使用它,请在节点导出器上设置 --collector.textfile.directory 标志。收集器将使用文本格式解析该目录中与 glob *.prom 匹配的所有文件。

  3. 编写一个脚本(即连续_zeros.py)py/bash,它可以在任何地方运行以使用Prometheus Http API 查询此指标GET /api/v1/query

  4. 将连续的零保存为环境参数并清除或增加此参数。

  5. Textfile Collector文档中描述的请求格式写入结果- 而不是在 Prometheus 中拥有您的连续_zeros_metrics。

  6. 执行 avg_over_time() 上连续_zeros_metrics

这是我谈论的概念的伪代码:

#!/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
Run Code Online (Sandbox Code Playgroud)