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

时间:2018-11-30 14:38:36

标签: grafana prometheus

我已经设置了Prometheus监控,并且正在基于诸如“错误率

( 
  sum(increase(errors[5m]))
  / sum(increase(requests[5m]))
) <= bool 0.1

这会显示在Grafana的单一状态面板中。

我现在想要实现的是从“停机时间”状态恢复所花费的平均时间。以图形方式,我需要在下面标记为 1 2 的间隔的平均持续时间。

Uptime graph

如何在Prometheus中计算此度量?


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

作为示例,请考虑以下时间序列(假设值每分钟采样一次):

1 1 1 0 0 1 1 1 1 1 0 0 0 1 

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

根据阅读文档和实验得出的理解是,avg_over_time将计算出一个算术组,例如sum(up)/count(up) = 9/14 =~ 0.64

我需要计算第一个度量,而不是第二个。

1 个答案:

答案 0 :(得分:2)

TLDR ;

您需要通过在规则文件中定义的Recording rule将其转换为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])

完整详细信息

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

  

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

     

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

解决方案是使用Recording rules。您可以看到有关此Prometheus githubthis Stack question以及此解释https://www.robustperception.io/composing-range-vector-functions-in-promql的对话。

  

PromQL中有两种通用类型的函数,它们以时间序列作为输入,一种采用矢量并返回矢量(例如,abs,ceil,hour,label_replace),以及采用范围矢量并返回矢量(例如速率,微分,预测线性,* _ over_time)。

     

没有获取范围向量并返回范围向量的函数,也没有方法进行任何形式的子查询。即使支持子查询,您也不想定期使用它们,因为它们会很昂贵。那该怎么办呢?

     

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

因此,正如我在上面解释的以及从Prometheus上的Core开发人员摘录的引文中所述,您应该能够得到所需的东西。


在问题编辑后添加:

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

  1. 如上所述,使用Recording rule定义my_metric_below_threshold。

  2. 使用Node exporter安装Textfile Collector

      

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

  3. 写一个脚本(即:continuous_zeros.py)py / bash,该脚本可在任何地方运行,以使用Prometheus Http API GET /api/v1/query查询该指标。

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

  5. Textfile Collector文档中描述的请求格式写入结果-而不是在Prometheus中使用了Continuous_zeros_metrics。

  6. 对接连的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