prometheus理论+实践(2)

目录

Prometheus promQL查询语言

prometheus实例

直接查询特定的metric_name

带标签查询

 查询两分钟的时序数列值

正则匹配

 函数

irate

子查询

count_over_time

复杂查询:

 实用查询样例

计算所有的实例cpu核心数

​编辑

计算单个的实例cpu核心数 

计算单个实例的内存使用率

 计算根分区使用率

预测磁盘空间

prometheus常见表达式

内存使用率

计算使用内存的百分比

收集cpu

磁盘使用率

磁盘io

网络

prometheus常用函数

rate 函数

sum() 叠加函数

by () 拆分函数

increase({}[time]) 增量函数

topk() 函数

count() 函数


Prometheus promQL查询语言

Prometheus提供了一种名为PromQL (Prometheus查询语言)的函数式查询语言,允许用户实时选择和聚合时间序列数据。表达式的结果既可以显示为图形,也可以在Prometheus的表达式浏览器中作为表格数据查看,或者通过HTTP API由外部系统使用。

在 Prometheus 的表达语言中,一个表达式或子表达式可以计算为以下四种类型之一:
瞬时向量(Instant vector):它是指在同一时刻,抓取所有度量指标数据。这些度量指标数据的key都是相同的,也就是相同的时间戳.
范围向量(Range vector):它是指在任何一个时间范围内,抓取所有度量指标数据.
标量(Scalar):一个简单的数字浮点值。
字符串(String):一个未被使用的简单字符串值.

prometheus实例

环境准备 :

配置文件:

 files目录:

直接查询特定的metric_name

如:查进程数、查CPU

node_forks_total        node_context_switches_total

带标签查询

如:100.5的进程数、100.6的cpu

 也可以多标签查询 ,以“,”分隔

 查询两分钟的时序数列值

可以看到两分钟有8个值,平均下来就是15s一个,对应了配置文件中的抓取间隔

正则匹配

正则匹配是模糊查询,需要在=后面加一个~,通俗的说就是(≈)

#意思是查两分钟内instance值是以192.168打头的端口号为20001的进程数的时序数值
node_forks_total{instance=~"192.168.*:20001",job="node"}[2m]

 函数

官方提供的函数比较多, 具体可以参考prometheus官方函数

这里主要就常用函数进行演示。

irate

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

例如:通过标签查询,特定实例特定job,特定cpu 在nice状态下的cpu次数速率

irate(node_cpu_guest_seconds_total{cpu="0",instance="192.168.100.5:20001",job="node",mode="nice"}[1m])

子查询

rate(node_cpu_seconds_total{cpu="0",instance="192.168.100.5:20001",job="node"}[5m])[10m:1m]

count_over_time

计算特定的时序数据中的个数。

这个数值个数和采集频率有关, 我们的采集间隔是15s,在一分钟会有4个点位数据。

count_over_time(node_cpu_guest_seconds_total [1m])

复杂查询:

#(总内存-空闲内存) / 总内存 * 100 可以算出内存使用百分比

(node_memory_MemTotal_bytes -  node_memory_MemFree_bytes) /node_memory_MemTotal_bytes * 100


#也可以 (1 - 空闲内存 / 总内存 ) * 100 也可以算出内存百分比
(1 - node_memory_MemFree_bytes / node_memory_MemTotal_bytes ) * 100

获取所有实例的内存使用百分比前两个

topk(2, node_memory_MemFree_bytes / node_memory_MemTotal_bytes  * 100)

 实用查询样例

计算所有的实例cpu核心数

count by (instance) ( count by (instance,cpu) (node_cpu_seconds_total{mode="system"}) ) 

计算单个的实例cpu核心数 

计算单个实例的内存使用率

#(1 - (可用内存{IP} / (总内存{IP}))) * 100
(1 - (node_memory_MemAvailable_bytes{instance="192.168.100.5:20001"} / (node_memory_MemTotal_bytes{instance="192.168.100.5:20001"}))) * 100 

 计算根分区使用率

# (1- 节点可用字节数{条件} / 节点总字节数{条件}) * 100

(1- (node_filesystem_avail_bytes{instance="192.168.100.5:20001",mountpoint="/",fstype=~"xfs|ext4"} / node_filesystem_size_bytes{instance="192.168.100.5:20001",mountpoint="/",fstype=~"xfs|ext4"}) ) * 100

预测磁盘空间

整体分为 2个部分, 中间用and分割, 前面部分计算根分区使用率大于85的, 后面计算根据近6小时的数据预测接下来24小时的磁盘可用空间是否小于0 。 

(1- (node_filesystem_avail_bytes{mountpoint="/",fstype=~"xfs|ext4"} / node_filesystem_size_bytes{mountpoint="/",fstype=~"xfs|ext4"}) ) * 100 >= 85 and (predict_linear(node_filesystem_avail_bytes[6h],3600*24)<0)

prometheus常见表达式

内存使用率

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)

收集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

磁盘使用率

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

磁盘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)

网络

1、网卡 五分钟内的增长率

node_network_receive_bytes_total{device=~"ens160|docker0"}[5m]

2、五分钟之内的平均值

round(irate(node_network_receive_bytes_total{device=~"ens160|docker0"}[5m])/1024)

prometheus常用函数

rate 函数

rate() 是取一段时间增量的 平均每秒的增量数。专门配合 counter 类型数据使用的函数。它的功能是按照设置一个时间段,取 counter 这个时间段中的 平均每秒的增量。

sum() 叠加函数

可以将输出的内容进行合并,同by()一起使用才有意义

by () 拆分函数

by( ) 这个函数可以把 sum 合并到一起的数值,按照指定的方式进行拆分。( ) 内 填写它指定的方式在当前案例,需要按照集群节点进行拆分。所以采用 instance=“机器名”,by(instance)。by(cluster_name) 将服务器进行分组

increase({}[time]) 增量函数

在prometheus 中,用来针对 Counter 这种持续增长的数值,截取其中一段时间的增量。配合时间使用。

increase() 是 取一段时间增量的总量

topk() 函数

定义:取前几位的最高值。格式:topk(number,key)

count() 函数

把数值符合条件的,输出数目进行加和

例:找出当前(或者历史)TCP 等待数大于200的 机器数量

count(count_netstat_wait_connections > 200)

实际应用:

一般用 count( ) 函数进行一些模糊的监控判断

比如说:企业中有100台服务器,那么当只有10台服务器 CPU 高于 80% 的时候,这个时候不需要报警,但是当符合 80% CPU 的服务器数量超过 30台 的时候,就会触发报警。


 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值