Prometheus promQL查询语言

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台的时候,就会触发报警。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨鸟先飞geigeigei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值