首页 文章

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

提问于
浏览
6

我已经 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 00 0 0 . 根据定义,持续时间为2分钟和3分钟,因此平均恢复时间为 (2+3)/2 = 2.5 .

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

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

1 回答

  • 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])

    The full details

    基本上你需要的是值为0或1的avg_over_time . 然而,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),以及采用范围向量并返回向量的函数(例如,速率) ,deriv,predict_linear,* _over_time) . 没有函数采用范围向量并返回范围向量,也没有办法做任何形式的子查询 . 即使支持子查询,您也不希望经常使用它们,因为它们很昂贵 . 那又怎么办呢?答案是对内部函数使用记录规则,然后可以在它创建的时间序列上使用外部函数 .

    因此,正如我上面所解释的以及上面引用的 - 来自Prometheus的核心开发人员 - 你应该能够得到你需要的东西 .


    问题编辑后添加:

    这样做并不简单,因为您需要"memory"的最后样本 . 但是可以使用Textfile CollectorPrometheus Http API来完成 .

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

    • 编写一个脚本(即successive_zeros.py)py / bash,它运行在任何地方,使用Prometheus Http API GET /api/v1/query 查询该指标 .

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

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

    • 对successive_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
    

相关问题