目录
本篇讲PromQL函数,可以直接看官网的FUNCTIONS
通过前面2章,怎么通用webUI操作prom相信已经熟悉了,我这里不做截图,只列出函数作用。
一、PromQL函数
Prometheus提供了多种功能的函数供用户使用,包括数学函数、时间函数、标签操作函数、Counter指标增长率计算函数等。本节中,我们对实际工作中经常使用的函数进行介绍。
二、数学函数
abs():该函数输入即时向量,返回其每个值的绝对值。
sqrt():该函数返回即时向量中值的平方根,例如表达式sqrt(vector(25))
round():该函数将即时向量中的值四舍五入到最近的整数。例如表达式round(vector(7.5)),返回结果是{}8。
clamp_max()和clamp_minx():clamp_max和clamp_min函数,分别允许对即时向量中的值设置上限和下限。
三、时间函数
Prometheus使用的是协调世界时(UTC),没有时区的概念。为了使用户在使用中不用自己实现与日期相关的逻辑,Prometheus提供了一些时间函数。
3.1 time()
该函数是最基本的时间函数,它将查询的计算时间以秒为单位返回。
3.2 时钟和日历类函数
这些函数都将查询计算时间的值作为具有一个样本且没有标签的即时向量返回。
例如,时间是2019年4月7日星期日,UTC时区03:35
四、标签操作函数
4.1 label_replace()
该函数的格式如下:
label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)
label_replace函数输入即时向量(v instant-vector),对即时向量中的每个时间序列进行处理,将正则表达式(regex)与标签值(src_label)匹配。如果匹配,则返回时间序列,且把dst_label标签值替换为replacement。如果不匹配,则时间序列不会更改。
4.2 label_join()
该函数的格式如下:
label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string,
...)
label_join函数输入即时向量(v instant-vector),输出都保留指标名称。该函数可以将标签值连接在一起,使用分隔符(separator)连接所有src_label的所有值,并返回包含连接值的标签dst_label的时间序列。
五、Counter指标增长率
5.1 increase()
increase(v range-vector)函数只能与计数器一起使用,用于区间向量(v range-vector)中时间序列增量的计算。它获取区间向量中的第一个和最后一个样本,并返回其增长量。例如,指标process_cpu_seconds_total(用户和系统CPU总时间,均以秒为单位)是counter类型,通过process_cpu_seconds_total[3m]获取时间序列最近3分钟的所有样本,increase计算出最近3分钟的增长量,最后除以时间180秒得到process_cpu_seconds_total样本在最近3分钟的平均增长率。可以使用表达式increase(process_cpu_seconds_total[3m])/180
5.2 rate()
rate(v range-vector)同样是与计数器一起使用的函数,用于计算区间向量中时间序列每秒的平均增长率。当因目标重启而导致计数器重置时,会自动调整。它是在实际工作中使用PromQL时的主要函数,最适用于告警和缓慢移动计数器的图形。
例如表达式rate(process_cpu_seconds_total[3m])
5.3 irate()
irate(v range-vector)计算区间向量中时间序列的每秒即时增长率,是一个灵敏度更高的函数。当因目标重启而导致计数器重置时,会自动调整。irate函数是通过区间向量中最后两个数据点来计算区间向量的增长速率,反映的是即时增长率,绘制出的图形可以更好地反映样本数据的即时变化状态。
例如表达式:irate(process_cpu_seconds_total[3m])
PS:由于irate函数相比于rate函数灵敏度更高,在需要分析长期趋势或者告警规则的场景中,irate的这种灵敏度会容易形成干扰,所以在长期趋势分析或者告警中建议使用rate函数。
六、Gauge指标趋势变化预测
predict_linear(v range-vector,t scalar)基于区间向量,使用简单的线性回归预测时间序列t秒的值,从而可以对时间序列的变化趋势做出预测。
例如,根据过去1小时的样本数据,预测主机的可用磁盘空间是否在4小时内被占满,可以使用如下表达式
predict_linear(node_filesystem_free_bytes{job="node_exporter"}[1h], 4 * 3600) < 0
在传统监控环境中,管理员可以对资源使用最高值设定阈值,只要资源使用达到或超过该阈值,告警通知管理员进行人工问题处理。但是对于突发式增长类业务,或因不可预知的程序bug而造成主机或云资源使用暴涨时,传统监控告警机制中,管理员或对应业务人员收到告警后,可能已经无法进行问题处理了,此时系统已经是宕机状态了。这种场景刚好适合使用本节介绍的predict_linear函数,通过设定合理的时间范围,对资源消耗趋势做出预测。