Prometheus监控系统(4)PromQL的基本使用

TangLu 系统运维 2025-01-24 31027 4

一、PromQL 介绍

PromQL 是 Prometheus 专用查询语言,全称 Prometheus Query Language。通过PromQL可以灵活的对每个指标实现条件查询、算术运算、比较操作符、正则表达式、聚合操作符、逻辑操作符等操作,Grafana的Dashboard也是通过PromQL实现了各种监控需求

360截图20201126215519368.jpg


二、PromQL 基本查询

在Prometheus的查询窗口输入PromQL就可以进行数据查询,每个exporter都提供了大量的指标(点击执行按钮旁的地球仪符号可以看到所有指标),直接使用指标名称就可以执行查询操作。比如要查询每个node的文件系统可用空间,可以使用node_filesystem_avail_bytes这个Key进行查询。因为该Key查询出来的数据默认单位为字节,我们可以手动转换为GB,最终效果如下

PROMQL.png


企业微信截图_20211217093504.png


三、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_group.png



四、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


评论

精彩评论
2019-06-18 08:56:10

朋友 交换链接吗

2019-06-18 11:17:48

@老部落运维 @老部落运维:欢迎交换啊 地址来一发

2019-06-19 09:20:55

@TangLu @TangLu:https://www.laobuluo.com/ 老部落运维
已添加贵站链接

2019-06-19 10:51:40

@老部落运维 @老部落运维:已添加友链