PromQL语法总结

 

PromQL查询数据类型:

Instant Vector

瞬时向量/瞬时数据,是对目标实例查询到的同一个时间戳的一组时间序列数据(按照时间的推移对数据进行存储和展示),每个时间序列包含单个数据样本,比如node_memory_MemFree_bytes查询的是当前剩余内存(可用内存)就是一个瞬时向量,该表达式的返回值中只会包含该时间序列中的最新的一个样本值,而相应的这样的表达式称之为瞬时向量表达式,以下是查询node节点可用内存的瞬时向量表达式:

[root@prome1 apps]# curl 'http://192.168.1.28:9090/api/v1/query' --data 'query=node_memory_MemFree_bytes' --data time=1669954495

Range Vector

范围向量/范围数据,是指在任何一个时间范围内,抓取的所有度量指标数据.比如最近一天的网卡流量趋势图、或最近5分钟的node节点内容可用字节数等,以下是查询node节点可用内存的范围向量表达式:

curl 'http://192.168.1.28:9090/api/v1/query' --data 'query=node_memory_MemFree_bytes{instance="192.168.1.28:9100"}[5m]' --data time=1669954493

Instant Vector VS Range Vector:

instant vector :每个指标只含有一个数据

range vector:每个指标含有一组数据(例如指定最近几分钟的数据)

scalar

标量/纯量数据,是一个浮点数类型的数据值,使用node_load1获取到时一个瞬时向量后,在使用prometheus的内置函数scalar()将瞬时向量转换为标量,例如:scalar(sum(node_load1))

[root@prome1 apps]# curl 'http://192.168.1.28:9090/api/v1/query' --data 'query=scalar(sum(node_load1{instance="192.168.1.28:9100"}))' --data time=1669954493

string

简单的字符串类型的数据,目前未使用,(a simple string value; currently unused)。

Querying basics | Prometheus


PromQL指标数据类型

counter

计数器,Counter类型代表一个累积的指标数据,在没有被重启的前提下只增不减(生活中的电表、水表),比如磁盘I/O总数、Nginx/API的请求总数、网卡流经的报文总数等。

Gauge

仪表盘,Gauge类型代表一个可以任意变化的指标数据,值可以随时增高或减少,如带宽速率、CPU负载、内存利用率、nginx 活动连接数等。

Histogram

累积直方图,Histogram会在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),假如每分钟产生一个当前的活跃连接数,那么一天24小时*60分钟=1440分钟就会产生1440个数据,查看数据的每间隔的绘图跨度为2小时,那么2点的柱状图(bucket)会包含0点到2点即两个小时的数据,而4点的柱状图(bucket)则会包含0点到4点的数据,而6点的柱状图(bucket)则会包含0点到6点的数据,可用于统计从当天零点开始到当前时间的数据统计结果,如http请求成功率、丢包率等,比如ELK的当天访问IP统计。

# TYPE prometheus_tsdb_compaction_chunk_size_bytes histogram
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="32"} 28
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="48"} 76
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="72"} 1115
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="108"} 1263
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="162"} 2171
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="243"} 4085
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="364.5"} 4297
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="546.75"} 4412
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="820.125"} 4468
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="1230.1875"} 4524
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="1845.28125"} 4683
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="2767.921875"} 4684
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="+Inf"} 4684
prometheus_tsdb_compaction_chunk_size_bytes_sum 1.053252e+06
prometheus_tsdb_compaction_chunk_size_bytes_count 4684

Summary

摘要图,也是一组数据,默认统计选中的指标的最近10分钟内的数据的分位数,可以指定数据统计时间范围,基于分位数(Quantile),亦称分位点,是指用分割点(cut point)将随机数据统计并划分为几个具有相同概率的连续区间,常见的为四分位,四分位数是将数据样本统计后分成四个区间,将范围内的数据进行百分比的占比统计,从0到1,表示是0%~100%,(0%~25%,%25~50%,50%~75%,75%~100%),利用四分位数,可以快速了解数据的大概统计结果。

如下统计的是 0、0.25、0.5、0.75、1的数据量分别是多少。

go_gc_duration_seconds
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. # TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 1.8479e-05
go_gc_duration_seconds{quantile="0.25"} 6.5059e-05 #25%以内的go_gc_duration_seconds的持续时间
go_gc_duration_seconds{quantile="0.5"} 9.3605e-05 #50%以内的go_gc_duration_seconds的持续时间
go_gc_duration_seconds{quantile="0.75"} 0.000133103 #75%以内的go_gc_duration_seconds的持续时间
go_gc_duration_seconds{quantile="1"} 0.004022673 #100%以内的go_gc_duration_seconds的持续时间
go_gc_duration_seconds_sum 1.446781088 #数据总和
go_gc_duration_seconds_count 7830 #数据个数

node-exporter指标数据格式

没有标签的

#metric_name metric_value

#TYPE node_load15 gauge

node_load15 0.1

一个标签的

#metric_name{label1_name="label1-value"} metric_value

# TYPE node_network_receive_bytes_total counter

node_network_receive_bytes_total{device="eth0"} 1.44096e+07

多个标签的

#metric_name{label1_name="label1-value","labelN_name="labelN-value} metric_value

# TYPE node_filesystem_files_free gauge

node_filesystem_files_free{device="/dev/sda2",fstype="xfs",mountpoint="/boot"} 523984

PromQL查询指标数据示例

node_memory_MemTotal_bytes #查询node节点总内存大小

node_memory_MemFree_bytes #查询node节点剩余可用内存

node_memory_MemTotal_bytes{instance="172.31.1.181:9100"} #基于标签查询指定节点的总内存

node_memory_MemFree_bytes{instance="172.31.1.181:9100"} #基于标签查询指定节点的可用内存

node_disk_io_time_seconds_total{device="sda"} #查询指定磁盘的每秒磁盘io

node_filesystem_free_bytes{device="/dev/sda1",fstype="xfs",mountpoint="/"} #查看指定磁盘的磁盘剩余空间

# HELP node_load1 1m load average. #CPU负载

# TYPE node_load1 gauge

node_load1 0.1

# HELP node_load15 15m load average. # TYPE node_load15 gauge

node_load15 0.17

# HELP node_load5 5m load average. # TYPE node_load5 gauge

node_load5 0.13

基于标签对指标数据进行匹配

  • = :选择与提供的字符串完全相同的标签,精确匹配。
  • != :选择与提供的字符串不相同的标签,去反。
  • =~ :选择正则表达式与提供的字符串(或子字符串)相匹配的标签。
  • !~ :选择正则表达式与提供的字符串(或子字符串)不匹配的标签。

#查询格式<metric name>{<label name>=<label value>, ...}

node_load1{instance="172.31.7.111:9100"}

node_load1{job="promethues-node"}

node_load1{job="promethues-node",instance="172.31.1.181:9100"} #精确匹配

node_load1{job="promethues-node",instance!="172.31.1.181:9100"} #取反

node_load1{instance=~"172.31.1.18.*:9100$"} #包含正则且匹配

node_load1{instance!~"172.31.1.181:9100"} #包含正则且取反

PromQL时间范围示例

对指标数据进行时间范围指定:

  • s - 秒
  • m - 分钟
  • h - 小时
  • d - 天
  • w - 周
  • y - 年

#瞬时向量表达式,选择当前最新的数据

node_memory_MemTotal_bytes{}

#区间向量表达式,选择以当前时间为基准,查询所有节点

node_memory_MemTotal_bytes

查询5分钟内的数据

node_memory_MemTotal_bytes{}[5m]

#区间向量表达式,选择以当前时间为基准,查询指定节点

node_memory_MemTotal_bytes

查询5分钟内的数据

node_memory_MemTotal_bytes{instance="172.31.1.181:9100"}[5m]

PromQL运算符

对指标数据进行数学运算:

  • + 加法
  • - 减法
  • * 乘法
  • / 除法
  • % 模
  • ^ 幂(N次方)

node_memory_MemFree_bytes/1024/1024 #将内存进行单位从字节转行为兆
node_disk_read_bytes_total{device="sda"} + node_disk_written_bytes_total{device="sda"} #计算磁盘读写数据量
(node_disk_read_bytes_total{device="sda"} + node_disk_written_bytes_total{device="sda"}) / 1024 / 1024 #单位转换

PromQL 聚合运算

对指标数据进行进行聚合运算:

  • max() #最大值
  • min() #最小值
  • avg() #平均值

计算每个节点的最大的流量值

max(node_network_receive_bytes_total) by (instance)

计算每个节点最近五分钟每个device的最大流量

max(rate(node_network_receive_bytes_total[5m])) by (device)

对指标数据进行聚合运算

sum()

#求数据值相加的和(总数)

sum(prometheus_http_requests_total)

{} 2495 #最近总共请求数为2495次,用于计算返回值的总数(如http请求次数)

count()

#统计返回值的条数

count(node_os_version)

{} 2 #一共两条返回的数据,可以用于统计节点数、pod数量等

count_values()

#对value的个数(行数)进行计数,并将value赋值给自定义标签,从而成为新的label

count_values("node_version",node_os_version) #统计不同的系统版本节点有多少

{node_version="20.04"} 2

abs()

#返回指标数据的值

abs(sum(prometheus_http_requests_total{handler="/metrics"}))

absent()

#如果监指标有数据就返回空,如果监控项没有数据就返回1,可用于对监控项设置告警通知(如果返回值等于1就触发告警通知)

absent(sum(prometheus_http_requests_total{handler="/metrics"}))

stddev()

#标准差

stddev(prometheus_http_requests_total) #5+5=10,1+9=10,1+9这一组的数据差异就大,在系统是数据波动较大,不稳定

stdvar()

#求方差

stdvar(prometheus_http_requests_total)

topk()

#样本值排名最大的N个数据

#取从大到小的前6个

topk(6, prometheus_http_requests_total)

bottomk()

#样本值排名最小的N个数据

#取从小到大的前6个

bottomk(6, prometheus_http_requests_total)

rate()

#rate函数是专门搭配counter数据类型使用函数,rate会取指定时间范围内所有数据点,算出一组速率,然后取平均值作为结果,适合用于计算数据相对平稳的数据。

rate(prometheus_http_requests_total[5m])

rate(apiserver_request_total{code=~"^(?:2..)$"}[5m])

rate(node_network_receive_bytes_total[5m])

irate()

#函数也是专门搭配counter数据类型使用函数,irate取的是在指定时间范围内的最近两个数据点来算速率,适合计算数据变化比较大的数据,显示的数据相对比较准确,所以官网文档说:irate适合快速变化的计数器(counter),而rate适合缓慢变化的计数器(counter)。

irate(prometheus_http_requests_total[5m])

irate(node_network_receive_bytes_total[5m])

irate(apiserver_request_total{code=~"^(?:2..)$"}[5m])

rate vs irate

by

#在计算结果中,只保留by指定的标签的值,并移除其它所有的

sum(rate(node_network_receive_packets_total{instance=~".*"}[10m])) by (instance)

sum(rate(node_memory_MemFree_bytes[5m])) by (increase)

without

#从计算结果中移除列举的instance,job标签,保留其它标签

sum(prometheus_http_requests_total) without (instance,job)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值