Prometheus监控系统(4)PromQL的基本使用
一、PromQL 介绍
PromQL 是 Prometheus 专用查询语言,全称 Prometheus Query Language。通过PromQL可以灵活的对每个指标实现条件查询、算术运算、比较操作符、正则表达式、聚合操作符、逻辑操作符等操作,Grafana的Dashboard也是通过PromQL实现了各种监控需求
二、PromQL 基本查询
在Prometheus的查询窗口输入PromQL就可以进行数据查询,每个exporter都提供了大量的指标(点击执行按钮旁的地球仪符号可以看到所有指标),直接使用指标名称就可以执行查询操作。比如要查询每个node的文件系统可用空间,可以使用node_filesystem_avail_bytes这个Key进行查询。因为该Key查询出来的数据默认单位为字节,我们可以手动转换为GB,最终效果如下
三、PromQL 比较运算符
比较运算符用来对指标进行条件判断,通常用来判断是否达到告警阈值。PromQL支持的比较运算符有=、>、<、!=、>=、<=。使用比较运算符时,如果比较结果为假(即条件不满足),则相关的时间序列默认不会出现在结果中。如果在测试时,想要明确地看到哪些时间序列满足条件、哪些不满足,可以使用bool修饰符将所有的时间序列都显示在结果中,满足条件的序列会有一个值为1(true),不满足的序列会有一个值为0(false)。
#判断node_exporter job中哪些实例不存活 up{job="nodex_exporter"} ==0 #判断内存超过70%的实例 {node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes} / node_memory_MemTotal_bytes * 100 > 70
如果要对不同的向量进行匹配或者比较,被比较的向量之间必须具有相同的标签才能进行运算,否则运算将不会执行。例如,下面两个时间序列可以成功进行一对一匹配,因为它们的标签以及标签值完全一致才能进行比较运算
http_requests_total{job="webserver", instance="192.168.1.100:9100"} http_requests_duration_seconds{job="webserver", instance="192.168.1.100:9100"}
在实际应用中,经常会出现标签不完全相同但是又需要进行比较的场景,这个时候需要使用on或者ingore关键词来声明是只比较哪些标签或者是忽略哪些标签进行比较。使用on或ingore语句的时候还可以使用 group_left 和 group_right 修饰符指定进行多对一或一对多的匹配关系,在进行一对多或多对一匹配时,先用on或ingore语句来去掉多余的标签,然后哪边的标签多就group哪边,通常 group_left 使用更加频繁,因为在 PromQL 中我们习惯把更详细的指标放在表达式左边,二者区别如下:
· group_left:多对一匹配,保留左侧向量的所有标签,使用一个右侧样本与左侧的多个样本进行匹配
· group_right:一对多匹配,保留右侧向量的所有标签,使用一个左侧样本与右侧的多个样本进行匹配
# 使用 on 指定要匹配的标签 # http_requests_total{environment="prod"} / on(instance) cpu_usage{environment="prod"} # 使用 on 匹配 job 和 instance 标签 process_cpu_seconds_total / on(job, instance) process_resident_memory_bytes # 使用 ignore 忽略 environment 标签进行匹配 http_requests_total / ignoring(environment) cpu_usage # 忽略多个标签进行匹配 sum(http_requests_total) / ignoring(job, environment) sum(cpu_usage) # 实际应用,计算每个实例的 HTTP 请求错误率 sum by (instance) (rate(http_requests_total{status=~"5.."}[5m])) / on(instance) sum by (instance) (rate(http_requests_total[5m])) # 计算每个服务的内存使用率(已用/总量) process_resident_memory_bytes / on(instance, job) group_left process_memory_limit_bytes * 100 sum(node_cpu_seconds_total) by (instance,job,mode) / ignoring(mode) group_left sum(node_cpu_seconds_total)by(instance,job) # group_left 示例(多对一匹配) # 1、假设有以下指标: # node_cpu_seconds_total{cpu="0", mode="idle", instance="host1"} 1234 # node_cpu_seconds_total{cpu="1", mode="idle", instance="host1"} 5678 # node_memory_total_bytes{instance="host1"} 8589934592 # 2、计算每个 CPU 核心的内存使用率 node_cpu_seconds_total / on(instance) group_left node_memory_total_bytes # 3、结果会保留 cpu 和 mode 标签 # {cpu="0", mode="idle", instance="host1"} 1234/8589934592 # {cpu="1", mode="idle", instance="host1"} 5678/8589934592 # group_right 示例(一对多匹配) # 1、假设有以下指标: # http_requests_total{instance="host1"} 1000 # node_cpu_seconds_total{cpu="0", mode="idle", instance="host1"} 1234 # node_cpu_seconds_total{cpu="1", mode="idle", instance="host1"} 5678 # 2、计算每个 CPU 核心处理的请求数 http_requests_total / on(instance) group_right(cpu,mode) node_cpu_seconds_total # 3、结果会保留右侧向量的 cpu 和 mode 标签: # {cpu="0", mode="idle", instance="host1"} 1000/1234 # {cpu="1", mode="idle", instance="host1"} 1000/5678
四、PromQL标签匹配
在指标后面使用花括号{ }可以进行标签匹配,通过标签匹配可以实现更细化的监控需求,比如只查询符合xx条件的xx主机,标签支持精确匹配、正则匹配等
# = 精确匹配 http_requests_total{environment="production"} # != 不等于 http_requests_total{environment!="development"} # !~ 正则表达式匹配 http_requests_total{environment!~"dev.*"} # 多标签匹配 http_requests_total{environment="production", method="GET"}
五、PromQL基于时间范围查询
在标签后面使用方括号[ ]并指明一个时间范围就可以查询出该时间区间内的数据,时间范围的单位支持s,m,h,比如查询符合xx条件的xx主机最近5分钟的数据
#语法示例 http_requests_total{environment="production"}[5m]
使用offset关键词可以进行时间偏移量查询,主要用于对比不同时间点的数据,例如今天QPS是10000,昨天这个时间是5000,然后计算增长率
# 1小时前的数据 http_requests_total offset 1h # 计算同比增长率 (http_requests_total - http_requests_total offset 1d) / http_requests_total offset 1d # 查询一周前基于某个时间范围的数据,比如从当前时间往回推一周,持续5分钟的数据范围内的node load1指标 node load1 [5m] offset 1w
同环比对比分析示例:
对比“当前时间点接收的网络流量”与"1小时前的流量”,以判断流量是增长还是减少。而计算同环比的增长率或减少率的公式:同环比率=当前流量-过去1小时的流量/过去1小时的流量 x 100。例如,当前总接收流量是6000MB,1小时前接收的总流量是5000MB,那么计算公式为:(6000-5000)/5000*100=20%(意味着相比1小时前,当前流量增长了20%)
(node_network_receive_bytes_total - node_network_receive_bytes_total offset 1h) / node_network_receive_bytes_total offset 1h * 100
评论
老部落运维
回复朋友 交换链接吗
TangLu
回复@老部落运维 @老部落运维:欢迎交换啊 地址来一发
老部落运维
回复@TangLu @TangLu:https://www.laobuluo.com/ 老部落运维
已添加贵站链接
TangLu
回复@老部落运维 @老部落运维:已添加友链