PromQL 语句使用

https://prometheus.io/docs/prometheus/latest/querying/basics/

Prometheus 提供一个函数式的表达式语言PromQL (Prometheus Query Language),可以使用户实时地查找和聚合时间序列数据,表达式计算结果可以在图表中展示,也可以在 Prometheus 表达式浏览器中以表格形式展示, 或者作为数据源, 以 HTTP API 的方式提供给外部系统使用。

PromQL 数据基础

数据分类

1
2
3
4
5
6
7
瞬时向量、瞬时数据(instant vector):是一组时间序列,每个时间序列包含单个数据样本,比如node_memory_MemTotal_bytes查询当前剩余内存就是一个瞬时向量,该表达式的返回值中只会包含该时间序列中的最新的一个样本值,而相应的这样的表达式称之为瞬时向量表达式,例如: prometheus_http_requests_tota

范围向量、范围数据(range vector):是指在任何一个时间范围内,抓取的所有度量指标数据.比如最近一天的网卡流量趋势图,例如: prometheus_http_requests_total[5m]

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

字符串(string):字符串类型的数据,目前使用较少

数据类型

Counter : 计数器, Counter 类型代表一个累积的指标数据, 在没有被重置的前提下只增不减,比如磁盘I/O 总数、nginx的请求总数、网卡流经的报文总数等。

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

例如在Graph 的 Gauge 查看 node_load1 可以看到相对应图标指标

Histogram:累积直方图 , Histogram 会在一段时间范围内对数据进行采样 (通常是请求持续时间或响应大小等), 假如每分钟产生一个当前的活跃连接数, 那么一天就会产生1440个数据, 查看数据的每间隔的绘图跨度为2小时, 那么2点的柱状图 (bucket) 会包含 0点 到 2点 即两个小时的数据, 而 4点 的柱状图 (bucket) 则会包含0点到 4点 的数据 , 而 6点 的柱状图 (bucket) 则会包含 0点 到 6点 的数据。

1
2
3
4
5
6
7
8
9
10
prometheus_tsdb_compaction_chunk_range_seconds_bucket
# TYPE go_gc_heap_frees_by_size_bytes_total histogram
go_gc_heap_frees_by_size_bytes_total_bucket[le="8.999999999999998"] 1.489766e+06
go_gc_heap_frees_by_size_bytes_total_bucket[le="24.999999999999996"] 3.1621269e+07
go_gc_heap_frees_by_size_bytes_total_bucket[le=" 64.99999999999999 "] 3.9805887e+07
go_gc_heap_frees_by_size_bytes_total_bucket[le="144.99999999999997"] 4.5192143e+07
go_gc_heap_frees_by_size_bytes_total_bucket [le=" 320.99999999999994"] 4.5981675e+07
go_gc_heap_frees_by_size_bytes_total_bucket[le="704.9999999999999 "] 4.6231281e+07
go_gc_heap_frees_by_size_bytes_total_bucket[le="1536.9999999999998") 4.6293065e+07
go_gc_heap_frees_by_size_bytes_total_bucket[le=" 3200.9999999999995"] 4.6357758e+07
1
2
3
4
5
6
7
8
9
10
11
12
Summary: 摘要,也是一组数据,统计的不是区间的个数而是统计分位数,从0到1,表示是0%~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
go_gc_duration_seconds {quantile="0.5"} 9.3605e-05
go_gc_duration_seconds {quantile="0.75"} 0.000133103 #百分75的go_gc_duration_seconds的持续时间
go_gc_duration_seconds {quantile="1"} 0.004022673
go_gc_duration_seconds_sum 1.446781088
go_gc_duration_seconds_count 7830

PromQL-指标数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
node_memory_MemTotal_bytes #查询node节点总内存大小
node_memory_MemFree_bytes #查询node节点剩余可用内存
node_memory_MemTotal_bytes{instance="192.168.15.100:9100"} #基于标签查询指定节点的总内存
node_memory_MemFree_bytes{instance="192.168.15.100:9100"} #基于标签查询指定节点的可用内存

node_disk_io_time_seconds_total{device="sda"} #查询指定磁盘的每秒磁盘io
node_filesystem_free_bytes{device="/dev/sda1",fstype="xfs", mountpoint="/"} #查看指定磁盘的磁盘剩余空间
# 例如查询 node_filesystem_free_bytes{device="/dev/sda1"} 指定查看

# HELP node_loadl 1m load average. #CPU负载
# TYPE node_loadl 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

PromeQL-匹配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
=  :选择与提供的字符串完全相同的标签,精确匹配。
!= :选择与提供的字符串不相同的标签,去反。
=~ :选择正则表达式与提供的字符串(或子字符串)相匹配的标签。
!~ :选择正则表达式与提供的字符串(或子字符串)不匹配的标签。

#查询格式 <metric name>{<label name>=<label value>, ...}
node_loadl {instance="192.168.15.100:9100"}
node_loadl {job="promethues-node"}

node_load1{job="promethues-node",instance="192.168.15.100:9100"} #精确匹配
node_load1{job="promethues-node",instance!="192.168.15.100:9100"} #取反
node_loadl{instance=~"192.168.15.100.*:9100$"} #包含正则且匹配
node_loadl{instance!~"192.168.15.100:9100"} #包含正则且取反

PromQL-时间范围

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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="192.168.15.100:9100"}[5m]

PromQL-运算符

1
2
3
4
5
6
7
8
9
10
11
+ 加法
- 减法
* 乘法
/ 除法
%
^ 幕等

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

PromQL-聚合运算

max、min、avg

1
2
3
4
5
6
7
8
9
10
max() #最大值
min() #最小值
avg() #平均值

# 计算每个节点的最大的流量值:
max(node_network_receive_bytes_total) by (instance)

# 计算每个节点最近五分钟每个device的最大流量
max(rate(node_network_receive_bytes_total[5m])) by (device)

sum、sount

1
2
3
4
5
6
7
8
9
10
11
sum() #求数据值相加的和(总数)
sum(prometheus_http_requests_total)
{} 2495 #最近总共请求数为2495次,用于计算返回值的总数(如http请求次数)

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

count_values() #对value的个数(行数)进行计数
count_values("node_version",node_os_version) #统计不同的系统版本节点有多少

abs、absent

1
2
3
4
5
6
7
8
9
abs()  #返回指标数据的值
abs(sum(prometheus_http_requests_total{handler="/metrics"}))

absent() #如果监指标有数据就返回空,如果监控项没有数据就返回1,可用于对监控项设置告警通知
absent(sum(prometheus_http_requests_total{handler="/metrics"}))

# 当一个指标没有返回数据,则返回1如 : {} 1
# 比如说查询 absent(sum(prometheus_http_requests_total{handler="/metricsAAA"}))
# 则是没有数据,会返回 {} 1

stddev、stdvar

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

stdvar() #求方差
stdvar(prometheus_http_requests_total)

topk、bottomk

1
2
3
4
5
6
7
topk() #样本值排名最大的N个数据
#取从大到小的前6个
topk(6, prometheus_http_requests_total)

bottomk() #样本值排名最小的N个数据
#取从小到大的前6个
bottomk(6, prometheus_http_requests_total)

rate、irate

1
2
3
4
5
6
7
rate()  #函数是专门搭配counter数据类型使用函数,功能是取counter数据类型在这个时间段中平均每秒的增量平均数
rate(prometheus_http_requests_total[5m])
rate(node_network_receive_bytes_total[5m])

irate() #函数是专门搭配counter数据类型使用函数,功能是取counter数据类型在这个时间段中平均每秒的峰值
irate(prometheus_http_requests_total[5m])
irate(node_network_receive_bytes_total[5m])

by、without

1
2
3
4
5
6
#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)