Prometheus云原生监控:运维与开发实战
上QQ阅读APP看书,第一时间看更新

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。