第八讲: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/