zoukankan      html  css  js  c++  java
  • prometheus.(4).函数计算公式

    数学理论基础-计算公式

    作者声明:本博客内容是作者在学习以及搭建过程中积累的内容,内容采自网络中各位老师的优秀博客以及视频,并根据作者本人的理解加以修改(由于工作以及学习中东拼西凑,如何造成无法提供原链接,在此抱歉!!!)

    作者再次声明:作者只是一个很抠脚的IT工作者,希望可以跟那些提供原创的老师们学习

    原文:大米运维

    CPU的构思

    %Cpu(s): 2.2 us, 1.9 sy, 0.0 ni, 95.5 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
    

    CPU的使用率 = (所有非空闲状态的CPU使用时间总和 )/(所有状态CPU时间的总和)

    (1-((sum(increase(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) / (sum(increase(node_cpu_seconds_total[5m])) by (instance)))) * 100
    
    
    (sum(increase(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance) / sum(increase(node_cpu_seconds_total[5m])) by (instance) )* 100
    

    函数

    rate()

    rate函数,rate用来计算两个 间隔时间内发生的变化率(一段时间内平均每秒的增量)。

    专门用来搭配Counters类型的数据,rate(指标名{筛选条件}[时间间隔])

    比如 查看1分钟内非idle的cpu使用率

    rate(node_cpu_seconds_total{mode!="idle"}[1m])
    

    irate()

    rate与irate的区别

    irate和rate都会用于计算某个指标在一定时间间隔内的变化速率。但是它们的计算方法有所不同:irate取的是在指定时间范围内的最近两个数据点来算速率,而rate会取指定时间范围内所有数据点,算出一组速率,然后取平均值作为结果。

    所以官网文档说:irate适合快速变化的计数器(counter),而rate适合缓慢变化的计数器(counter)。

    根据以上算法我们也可以理解,对于快速变化的计数器,如果使用rate,因为使用了平均值,很容易把峰值削平。除非我们把时间间隔设置得足够小,就能够减弱这种效应。

    相同函数,截取不同时间的图形分析

    rate(node_network_receive_bytes_total{device="ens32",instance="k8s-node1"}[1m])
    

    1分钟内 增加了 1000bytes (假设)

    5分钟内 增加了 5000bytes (假设)

    会把1000bytes除以 1m*60秒,=~16bytes/s 就是这样计算出在这1分钟内,平均每秒钟增加 16bytes

    1584428753976

    把5分钟内的增量 除以 5m*60s ,5分钟的增量 假如是 5000 , 那么除以300 以后 也还是约等于 =~ 16bytes/s

    1584428799672

    以上两种时间段的取法,都是假设成⼀种平均的取法,这是一种假设的理想状态,事实上生产环境 网络数据接收量 可不是这么平均的。有可能在 第一分钟 增加了 1000, 到 第二分钟 就变成增加了2500….

    所以 rate(1m) 这样的取值方法比起 rate(5m) ,因为它取的时间段短,所以 任何某⼀瞬间的凸起或者降低在成图的时候会体现的更细致 更敏感而rate(5m)把整个5分钟内的都⼀起平均了,那么当发生瞬时凸起的时候,会显得图平缓了⼀些 (因为 取的时间段长 把波峰波谷都给平均消下去了)

    increase()

    increase 函数 在promethes中,是用来针对Counter 这种持续增长的数值,截取其中⼀段时间的 增量(一段时间内的总增量)

    increase(node_cpu_seconds_total[1m]) =》 这样 就获取了 CPU总使用时间在1分钟内的增量

    sum( )

    比如上面得到各个指标的cpu使用率,如果我想计算总的cpu使用率怎么办?

    sum( ) 就如其字⾯意思⼀样 起到value 加合的作用 sum( increase(node_cpu_seconds_total[1m]) ) 外⾯套⽤⼀个sum 即可把所有核数值加合

    问题1:所有机器的CPU 也全都加到⼀起了,变成 服务器集群 总CPU平均值了?

    by()

    by (instance) 这个函数 可以把 sum加合到⼀起的数值 按照指定的⼀个方式进行一层的 拆分

    instance 代表的是 机器名

    意思就是说 把sum函数中 服务器加合的这个糗事 再给它强行拆分出来

    sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)
    

    sum() by (cluster_name) 可以帮我们实现集群加合并分三条曲线输出了,顺带一提的是 (cluster_name) 这个标签,默认node_exporter是没有办法提供的,node_exporter只能按照不同的机器名去划分。如果希望支持cluster_name 我们需要自行定义标签。

    topk()

    topk() 函数的定义是:取前面x位的最高值,最简单理解就是数学的top,当我们有很多服务器我们想要获取某个key的数据排在前3位的服务器。

    Gauge类型使用方式:

    topk(3,key)
    

    Counter类型使用方式

    topk(3,rate(key[1m]))
    

    注意:此种函数获得数据并不是很适用图形化展示,实际使用的时候 ⼀般用topk()函数 进行瞬时报警而不是为了观察曲线图

    count()

    定义: 把数值符合条件的 输出数目进行加合

    例如:找出当前(或者历史的)当数值数大于2000的机器数量

    1584432005529

    更多函数:https://prometheus.io/docs/prometheus/latest/querying/functions/

    标签匹配

    模糊匹配 =~

    模糊不匹配 !~

  • 相关阅读:
    springboot属性类自动加载配置文件中的值
    mysql修改root密码
    idea各种图标说明
    nginx安装配置
    notepad++下载32位,安装插件管理
    crontab 定时执行脚本出错,但手动执行脚本正常
    jenkins安装配置
    VirtualBox从USB设备(PE)启动图文教程
    如何卸载windows的服务?卸载服务?
    在Windows的CMD中如何设置支持UTF8编码?
  • 原文地址:https://www.cnblogs.com/orange-lsc/p/12825562.html
Copyright © 2011-2022 走看看