Prometheus提供了一种名为PromQL (Prometheus查询语言)的函数式查询语言,允许用户实时选择和聚合时间序列数据。表达式的结果既可以显示为图形,也可以在Prometheus的表达式浏览器中作为表格数据查看,或者通过HTTP API由外部系统使用。
准备工作
[root@prometheus ~]# vim /usr/local/prometheus/prometheus.yml
static_configs:
- targets: ["localhost:9090"]
- job_name: "node"
file_sd_configs:
- refresh_interval: 1m
files:
- "/usr/local/prometheus/conf/node*.yml"
remote_write:
- url: "http://localhost:8086/api/vl/prom/write?db=prometheus"
remote_read:
- url: "http://localhost:8086/api/vl/prom/write?db=prometheus"
[root@prometheus ~]# vim /usr/local/prometheus/conf/node-dis.yml
- targets:
- "192.168.100.9:20001"
labels:
__hostname__: node1
__businees_line__: "line_a"
__region_id__: "cn-beijing"
__availability_zone__: "a"
- targets:
- "192.168.100.10:20001"
labels:
__hostname__: node2
__businees_line__: "line_b"
__region_id__: "cn-beijing"
__availability_zone__: "b"
[root@prometheus ~]# systemctl restart prometheus.service
简单时序查询
直接查询metric_name
node_forks_tatal ##进程个数
查询结果如下
带标签的查询
node_forks_total{instance="192.168.100.10:20001"}
多标签查询
node_forks_total{instance="192.168.100.10:20001",job="node"}
查询两分钟的时序数值
node_forks_total{instance="192.168.100.10:20001",job="node"}[2m]
正则表达
node_forks_total{instance=~"192.168.*:20001",job="node"}
常用函数查询
官方提供的函数比较多, 具体可以参考地址如下: https://prometheus.io/docs/prometheus/latest/querying/functions/
这里主要就常用函数进行演示:
irate
irate和rate都会用于计算某个指标在一定时间间隔内的变化速率。但是它们的计算方法有所不同:irate取的是在指定时间范围内的最近两个数据点来算速率,而rate会取指定时间范围内所有数据点,算出一组速率,然后取平均值作为结果。
irate用于计算速率。
# 通过标签查询,特定实例特定job,特定cpu 在idle状态下的cpu次数速率
irate(node_cpu_seconds_total{cpu="0",instance="192.168.100.10:20001",job="node",mode="idle"}[1m])
count_over_time
计算特定的时序数据中的个数。
# 这个数值个数和采集频率有关, 我们的采集间隔是15s,在一分钟会有4个点位数据。
count_over_time(node_boot_time_seconds[1m])
子查询
过去的10分钟内, 每分钟计算下过去5分钟的一个速率值。
rate(node_cpu_seconds_total{cpu="0",instance="192.168.100.10:20001",job="node",mode="idle"}[5m])[10m:1m]
复杂查询
计算内存使用百分比
第一种方式:
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes) /node_memory_MemTotal_bytes * 100
第二种方式:
(1 - node_memory_MemFree_bytes / node_memory_MemTotal_bytes) * 100
获取所有实例的内存使用百分比的前两个
topk(2,node_memory_MemFree_bytes / node_memory_MemTotal_bytes * 100 )
实用查询样例
获取cpu核心个数
# 计算所有的实例cpu核心数
count by (instance) ( count by (instance,cpu) (node_cpu_seconds_total{mode="system"}) )
# 计算单个实例的
count by (instance,cpu) (node_cpu_seconds_total{mode="system",instance="192.168.100.10:20001"})
计算内存使用率
(1 - (node_memory_MemAvailable_bytes{instance=~"192.168.100.10:20001"} / (node_memory_MemTotal_bytes{instance=~"192.168.100.10:20001"})))* 100
计算根分区使用率
1-(node_filesystem_avail_bytes{instance="192.168.100.10:20001",mountpoint="/",fstype=~"ext4|xfs"} /node_filesystem_size_bytes {instance=~"192.168.100.10:20001",mountpoint="/",fstype=~"ext4|xfs"})
预测磁盘空间
# 整体分为 2个部分, 中间用and分割, 前面部分计算根分区使用率大于85的, 后面计算根据近6小时的数据预测接下来24小时的磁盘可用空间是否小于0 。
(1- node_filesystem_avail_bytes{fstype=~"ext4|xfs",mountpoint="/"}
/ node_filesystem_size_bytes{fstype=~"ext4|xfs",mountpoint="/"}) * 100 >= 85 and (predict_linear(node_filesystem_avail_bytes[6h],3600 * 24) < 0)
常用监控指标
prometheus 常见表达式
1、收集内存使用率
prometheus 常见表达式
1、收集内存使用率
node_memory_MemTotal_bytes 主机上的总内存
node_memory_MemFree_bytes主机上的空闲内存
node_memory_Buffers_bytes缓冲区缓存上的内存
node_memory_Cached_bytes页面缓存中的内存
计算使用内存的百分比
(总内存-(空闲内存-缓冲区+缓存))/ 总内存 * 100
round((node_memory_MemTotal_bytes-(node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes))/node_memory_MemTotal_bytes* 100)
2、收集cpu
1 、收集cpu 利用率:使用irate 的函数,用于计算距离向量正宗时间序列每秒瞬时增长率,瞬时增长率
irate(node_cpu_seconds_total{instance="$ip"}[5m])
2、avg 平均使用率
avg(irate(node_cpu_seconds_total{job="server",mode="idle"}[5m])) *100
3 、平均使用百分比
100 - avg(irate(node_cpu_seconds_total{job="server",mode="idle"}[5m])) *100
3、磁盘使用率
1、磁盘使用率百分比 ,空闲的
空闲的空间 / 总空间
node_filesystem_files_free{mountpoint="/",device="/dev/mapper/centos-root",job="server"}/node_filesystem_size_bytes{mountpoint="/",device="/dev/mapper/centos-root",job="server"}* 100
2、剩余的磁盘使用率
100 -node_filesystem_files_free{mountpoint="/",device="/dev/mapper/centos-root"}/node_filesystem_size_bytes{mountpoint="/",device="/dev/mapper/centos-root"}* 100
4、磁盘io
1、io 五分钟的增长率
irate(node_disk_io_time_seconds_total[5m])
2、五分钟之内的平均值
avg(irate(node_disk_io_time_seconds_total[5m]))* 100
3、磁盘io 空闲百分比
100 -(avg(irate(node_disk_io_time_seconds_total[5m])) * 100)
5、网络
1、网卡五分钟内的增长率
node_network_receive_bytes_total{device=~"ens160|docker0"}[5m]
2、五分钟之内的平均值
round(irate(node_network_receive_bytes_total{device=~"ens160|docker0"}[5m])/1024)
常用函数
1、rate 函数
rate 速率函数,prometheus 提供最重要的函数,只要碰上 counter 数据类型,直接套上 rate([m]) / increase([m])
rate() 是取一段时间增量的平均每秒的增量数
rate( )专门配合 counter 类型数据使用的函数
它的功能是按照设置一个时间段,取 counter 这个时间段中的平均每秒的增量。
例如:rate(node_network_receive_bytes[1m]) (用于监控主机上所有网卡每分钟的流量)
比如累积量从440011229804456 --> 440011229805456,1分钟内增加了 1000bytes (假设)
比如累积量从 440011229805456 --> 440011229810456,5分钟之内增加了 5000 bytes(假设)
加入 rate(. [1m]) 之后,会把 1000bytes 除以1m =~ 16bytes
rate(1m) 这样的取值方法比起 rate(5m),因为它取得时间短,所以任何某一瞬间得突起或者降低会在成图得时候体现的更加细致、敏感。
而 rate(5m) 会把整个5分钟内得都一起平均了,当发生瞬间凸起得时候,会显得图平缓了一些 ( 因为取得时间段长把波峰波谷都给平均肖平了)
在工作当中,具体取 rate(1m) 还是 rate(5m) 决定于对监控数据得敏感程度来进行选择。
3、sum() 叠加函数
可以将输出的内容进行合并,同by()一起使用才有意义
4、by () 拆分函数
by( ) 这个函数可以把 sum 合并到一起的数值,按照指定的方式进行拆分。( ) 内填写它指定的方式
在当前案例,需要按照集群节点进行拆分。所以采用 instance=“机器名”,by(instance)。
by(cluster_name) 将服务器进行分组
例如:
用 sum() 提取了 20台服务器的数据
其中 6台属于 web_server ; 10台属于 DB_server ; 4台属于 nfs_server
这种时候就可以用 by(cluster_name) 实现集群分组,三条曲线进行输出
cluster_name这个标签,默认node_exporter 是没有办法提供的,需要自行定义
2、increase({}[time]) 增量函数
在prometheus 中,用来针对 Counter 这种持续增长的数值,截取其中一段时间的增量。配合时间使用
increase() 是取一段时间增量的总量
例如:increase(node_network_receive_bytes_total{device=“ens33”}[1m])
获取了ens33网卡在1分钟的增量总量
在企业监控实例时:
需要采集数据源,会牵扯到频率,如果采样频率比较粗糙,按照 5m 一次来取值,就比较适合用 increase() 函数
如果采样频率比较频繁,按照1m,秒级别采集数据 ( CPU / memory / disk / IO / netstat ) ,比较适合使用 rate() 函数。
5、topk() 函数
定义:取前几位的最高值。格式:topk(number,key)
Gauge 类型的使用
topk(3,count_netstat_wait_connections)
Counter 类型的使用,必须加上 rate/increase 才有意义
topk(3,increase(node_cpu_seconds_total{mode=‘idle’}[1m]))
6、count() 函数
定义:把数值符合条件的,输出数目进行加和
例:找出当前(或者历史)TCP 等待数大于200的机器数量
count(count_netstat_wait_connections
> 200)
实际应用:
一般用 count( ) 函数进行一些模糊的监控判断
比如说:企业中有100台服务器,那么当只有10台服务器 CPU 高于 80% 的时候,这个时候不需要报警,但是当符合 80% CPU 的服务器数量超过 30台的时候,就会触发报警。