4.1 初识PromQL
在开始本节介绍之前,先来看几个实战性的PromQL案例。通过案例,读者可直观地感受到PromQL是如何让用户通过指标更好地了解系统的性能的。
案例一:获取当前主机可用的内存空间大小,单位为MB。
node_memory_free_bytes_total / (1024 * 1024)
说明:node_memory_free_bytes_total是瞬时向量表达式,返回的结果是瞬时向量。它可以用于获取当前主机可用的内存大小,默认的样本单位是B,我们需要将单位换算为MB。
案例二:基于2小时的样本数据,预测未来24小时内磁盘是否会满。
IF predict_linear(node_filesystem_free[2h],24*3600)<0
说明:predict_linear(v range-vector,t scalar)函数可以预测时间序列v在t秒后的值,它基于简单线性回归的方式,对时间窗口内的样本数据进行统计,从而对时间序列的变化趋势做出预测。上述命令就是根据文件系统过去2小时以内的空闲磁盘,去计算未来24小时磁盘空间是否会小于0。如果用户需要基于这个线性预测函数增加告警功能,可以按如下方式扩展更新。
ALERT DiskWillFullIn24Hours IF predict_linear(node_filesystem_free[2h],24*3600)<0
案例三:http_request_total(HTTP请求总数)的9种常见PromQL语句。
# 1.查询HTTP请求总数 http_requests_total # 2.查询返回所有时间序列、指标http_requests_total,以及给定 job和handler的标签 http_requests_total{job="apiserver", handler="/api/comments"} # 3.条件查询:查询状态码为200的请求总数 http_requests_total{code="200"} # 4.区间查询:查询5分钟内的请求总量 http_request_total{}[5m] # 5. 系统函数使用 # 查询系统所有HTTP请求的总量 sum(http_request_total) # 6. 使用正则表达式,选择名称与特定模式匹配的作业(如以server结尾的作业)的时间序列 http_requests_total{job=~".*server"} # 7. 过滤除了4XX之外所有HTTP状态码的数据 http_requests_total{status!~"4.."} # 8. 子查询,以1次/分钟的速率采集最近30分钟内的指标数据,然后返回这30分钟内距离当前时间 # 最近的5分钟内的采集结果 rate(http_requests_total[5m])[30m:1m] # 9. 函数rate,以1次/秒的速率采集最近5分钟内的数据并将结果以时间序列的形式返回 rate(http_requests_total[5m])
如上所述,我们仅针对http_request_total这一个指标,就做了9种不一样的具有代表性的监控案例。由此能够看出,PromQL语句是非常灵活的,和MySQL一样,可以应用于多种场景。
上述案例中有两点需要额外注意。
·Prometheus中的所有正则表达式都是基于RE2语法[1]的。
·区间向量range vector的表达式并不能直接被绘制成图表,需要在控制台上的表达式浏览器的表格视图中查看;而瞬时向量表达式instant vector返回的数据类型是唯一可以直接绘制成图表的数据类型。
[1] RE2语法:https://github.com/google/re2/wiki/Syntax。