Prometheus 是一个开源的服务监控系统和时间序列数据库。而提供了PromQL则是其提供的一种功能表达式语言 ,允许用户实时选择和集聚时间序列数据。表达式的结果可以在浏览器中显示为图形,也可以显示为表格数据,或者由外部系统通过API进行调用。
一、表达式语言数据类型
在 Prometheus 的表达式语言中,表达式或子表达式包括以下四种类型之一:
- 瞬时向量(Instant vector) - 一组时间序列,每个时间序列包含单个样本,它们共享相同的时间戳。也就是说,表达式的返回值中只会包含该时间序列中的最新的一个样本值。而相应的这样的表达式称之为瞬时向量表达式。
- 区间向量(Range vector) - 一组时间序列,每个时间序列包含一段时间范围内的样本数据。
- 标量(Scalar) - 一个浮点型的数据值。
- 字符串(String) - 一个简单的字符串值。
根据用户输入的表达式返回的数据类型是否合法取决于用例的不同,例如:瞬时向量表达式返回的数据类型是唯一可以直接绘制成图表的数据类型。
字符串可以用单引号、双引号或反引号指定为文字常量。PromQL 遵循与 Go 相同的转义规则。在单引号或双引号中,用反斜杠来表示转义序列,后面可以跟 a, b, f, n, r, t, v 或 \。特殊字符可以使用八进制(\nnn)或者十六进制(\xnn,\unnnn 和 \Unnnnnnnn)。而与 Go 不同,Prometheus 不会对反引号内的换行符进行转义。
二、时间序列过滤器
主要分为瞬时向量过滤器,区间向量过滤器,时间位移操作。
1.瞬时向量过滤器:
瞬时向量过滤器允许在指定的时间戳内选择一组时间序列和每个时间序列的单个样本值。在最简单的形式中,仅指定指标(metric)名称。这将生成包含此指标名称的所有时间序列的元素的瞬时向量。例如:选择指标名称为 http_requests_total 的所有时间序列,同时,可以通过向花括号({})里附加一组标签来进一步过滤时间序列。例如:要选择指标名称为 http_requests_total,job 标签值为 prometheus,group 标签值为 canary 的时间序列:http_requests_total{job="prometheus",group="canary"}
2.区间向量过滤器:
区间向量与瞬时向量的工作方式类似,唯一的差异在于在区间向量表达式中我们需要定义时间选择的范围,时间范围通过时间范围选择器 [] 进行定义,以指定应为每个返回的区间向量样本值中提取多长的时间范围。时间范围通过数字来表示,单位可以使用秒,分钟,小时,天,周,年其中之一的时间单位。
3.时间位移操作
在瞬时向量表达式或者区间向量表达式中,都是以当前时间为基准,而如果我们想查询,5 分钟前的瞬时样本数据,或昨天一天的区间内的样本数据呢? 这个时候我们就可以使用位移操作,位移操作的关键字为 offset。例如:以下表达式返回指标 http_requests_total 一周前的 5 分钟之内的 HTTP 请求量的增长率:rate(http_requests_total[5m] offset 1w)
三、操作符
PromQl运算符主要分为二元运算符,布尔运算符,集合运算符。同时支持包括一对一匹配模式,多对一和一对多匹配模式。内置的聚合操作符则作用于瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个具有较少样本值的新的时间序列。同时二元运算符优先级从高到低的顺序为:1.^,2.*,/,%,3.+-,4.==,!=,<=,<,>=,>,5.and,unless,6.or.
四、内置函数
Prometheus 提供了其它大量的内置函数,可以对时序数据进行丰富的处理。某些函数有默认的参数,例如:year(v=vector(time()) instant-vector)
。其中参数 v 是一个瞬时向量,如果不提供该参数,将使用默认值 vector(time())。instant-vector 表示参数类型。