第八讲:prometheus命令行使用扩展

  本讲内容

  • prometheus命令行格式
  • rate函数使用
  • increase函数使用
  • sum函数使用  

 

  (一)prometheus命令行格式

  我们选一个新的key来做讲解

count_netstat_wait_connections #TCP wait_connect数

   这个key值不少我们熟悉的node_exporter挖掘而来

  而是我们自定义并使用bash脚本+pushgateway的方式推送到 prometheus server采集

  类型gauge

  gauge类型的数据,属于随机变化的数值,并不像Counter那样是持续增长的

  把一个key直接输入命令行之后得到的是最原始的数据输出

  相对Counter数据gauge不需要任何increase() rate()之类的函数计算

  直接输入以后就可以看到已经成型的有确实意义的曲线图,如下图

 

   标签:来自于采集数据也可以自定义

  例如上面数据的instance标签是指明备监控的服务器

  可以在命令中使用标签进行进一步过滤例如

process_open_fds{instance="192.168.1.101:9100"}

 

 

   查询多个有多个结果的时候也可以使用鼠标点击进行过滤

 

   过滤后就只显示某一台服务器的信息

  过滤除了精确匹配 还有 模糊匹配

  例如

process_open_fds{instance=~"192.168.1.*"}

   

模糊匹配=~
模糊不匹配!~

   标签过滤之后对数值过滤

process_open_fds{instance="192.168.1.11:9100"}>8

   显示的就是一些片段了

 

 

  (二)rate函数

  rate函数可以说是prometheus提供的最重要的函数

  rate函数是专门搭配Counter类型数据使用的函数

  它的功能是安装设置一个时间段,取Counter在这个时间段中平均每秒的增量  

  举例说明

  网络流量key

node_network_receive_bytes

   获取一分钟内平均每秒的增量

rate(node_network_receive_bytes [1m])

 

 

   注意:所以说 我们以后在使⽤任何counter数据类型的时候,永远记 得 别的先不做 先给它加上⼀个 rate() 或者 increase() 

  接下来我们把rate()做的事情更加细化来解释一下

  例如从09:20:43-09:21:43

  累积量从1031796930910到了1031872038733

  一分钟内增加的1000bytes(假设)

  从9:21-9:26

  五分钟增加了5000bytes(假设)

  加入rate(. [1m])之后

  会把1000bytes除以1m*60秒 =~16bytes

  就是这样计算出在这一分钟内平均每秒增加16bytes

  

 

 

 

 

  修改把1m=》5m

  这样就把5分钟内的增量除以5m*60秒

  5分钟的增量加入是5000那么除以300以后还是约等于16bytes/s

  感觉好像一模一样

  对比1m和5m

 

 

 

   明显1分钟的曲线比5分钟的曲线平缓

  虽然平均每秒的速度都是16bytes

  如果 我们按照 rate(1m)这样来取,那么是取1分钟内的增量 除 以秒数

  如果 我们按照 rate(5m)这样来取,那么是取5分钟内的增量 除 以秒数

  ⽽这种取法 是⼀种平均的取法 ⽽且是假设的

  刚才我们说 counter在 ⼀分钟 5分钟 之内的增量 1000 和 5000  其实是⼀种假设的理想状态

  事实上 ⽣产环境 ⽹络数据接收量 可不是这么平均的 有可能在 第⼀分钟内 增加了 1000 , 到 第⼆分钟 就变成增加 了2500 ….

  所以 rate(1m) 这样的取值⽅法 ⽐起 rate(5m) ,因为它取的时 间段短,所以 任何某⼀瞬间的凸起或者降低  在成图的时候 会体现的更细致 更敏感

  ⽽ rate(5m) 把整个5分钟内的 都⼀起平均了,那么当发⽣瞬时 凸起的时候 ,会显得图平缓了⼀些 (因为 取的时间段长 把 波峰波⾕ 都给平均消下去了)
那么我们再放⼤⼀些 看看 rate(20m) 会怎么样
  

 

   更加平缓了

  在我们的⼯作中 取1m 还是取5m 这个取决于 我们对于监控数据的敏感性程度来挑选

  (3)increase函数

  increase 函数 其实和rate() 的概念及使⽤⽅法 ⾮常相似

  rate(1m) 是取⼀段时间增量的平均每秒数量 increase(1m) 则是 取⼀段时间增量的总量 

  对比

 

 

 

   图形形状基本一样,但是y轴的数值是不一样的

  从这两个图 我们可以看到 其实曲线的⾛势 基本是⼀样的 但是 显⽰出来的数量级bytes 可不⼀样  3106868.4 * 60 = 186412104 (发现) 正好是 60倍  也就很好理理解了了,increase() 是不不会取⼀一秒的平均值的
  生产中应该如何选择两个函数

  采集粗糙例如每五分钟采集一次的数据,如果使用rate函数则因为是每秒的平均使用可能产生断点,则需要使用increase

  采集数据不频繁采用increase

  rate()适用于CPU 内存 硬盘IO 网络流量

  increase()适用于硬盘容量等不会经常性发送突变的

  

  (四)sum函数

  sum就是总取和

  sum会把结果集输出进行总加和

  例如

rate(node_network_receive_bytes[1m]) 

   

  显⽰的结果集 会包含如 下内容

 

   使用sum函数以后

sum(rate(node_network_receive_bytes[1m]) )

   把所有的网络流量汇总了

 

 

   我们之前也说过,如果要进⾏下⼀层的拆分 需要在 sum() 的后⾯ 加上 by (instance)

sum(rate(node_network_receive_bytes[1m]) ) by(instance)

   

 

   但是如果 我们希望 按集群总量输出呢? ⽐如 我们返回了20台机器的数据 其中 有6台 属于 web server 10台属于 DB server 其他的 属于⼀般server

  那么我们这时候 sum() by (cluster_name) 就可以帮我们实现 集 群加合并分三条曲线输出了

  顺带⼀提的是 (cluster_name) 这个标签,默认node_exporter 是没有办法提供的 node_exporter只能按照 不同的机器名去划分

  如果希望 ⽀持cluster_name 我们需要⾃⾏定义标签(往后的课程介绍)

  (五)topk()函数

  取前几位最高值

  例如

topk(3,node_network_receive_bytes)

 

 

 

 

   这个函数一般使用只适合于在console查看(返回当时瞬时的数据),针对graph的意义不大

  如下图所示

 

 

   Topk因为对于每⼀个时间点 都只取前三⾼的数值 那么必然会造成 单个机器的采集数据不连贯

  因为:⽐如 server01在在这⼀分钟的 wait_connection数量排在 所有机器的前三 ,到了下⼀分钟 可能就排到垫底了.. ⾃然其 曲线就会中断 实际使⽤的时候 ⼀般⽤topk()函数 进⾏瞬时报警 ⽽不是为 了观察曲线图

  (六)count()函数

  定义: 把数值符合条件的 输出数⽬进⾏加合

  举例

  找出当前(或者历史的)打开文件描述符大于8的机器数量

count(process_open_fds>8)

 

 

   这个函数在实际⼯作中还是很有⽤的 ⼀般⽤它count进⾏⼀些模糊的监控判断

  count返回的是一个加和的数值

  ⽐如说 企业中有100台服务器,那么当只有10台服务器CPU⾼ 于80%的时候 这个时候不需要报警 但是 当符合80%CPU的服务器数量 超过 30台的时候 那么就 会触发报警 count()
  更多函数查看官网:https://prometheus.io/docs/prometheus/latest/querying/functions/

  

posted @ 2020-07-23 17:47  minseo  阅读(2052)  评论(0编辑  收藏  举报