Prometheus内部主要分为三大块,Retrieval是负责定时去暴露的目标页面上去抓取采样指标数据,Storage是负责将采样数据写磁盘,PromQL是Prometheus提供的查询语言模块。
Prometheus提供一个函数式的表达式语言,可以使用户实时地查找和聚合时间序列数据。表达式计算结果可以在图表中展示,也可以在Prometheus表达式浏览器中以表格形式展示,或者作为数据源, 以HTTP API的方式提供给外部系统使用。
Prometheus的查询表达式可以分为四种数据类型:
instant vector 瞬时向量 - 它是指在同一时刻,抓取的所有度量指标数据。这些度量指标数据的key都是相同的,也即相同的时间戳;
range vector 范围向量 - 它是指在任何一个时间范围内,抓取的所有度量指标数据;
scalar 标量 - 一个简单的浮点值,标量浮点值可以直接写成形式;
string 字符串 - 字符串可以用单引号、双引号或者反引号表示;
时间序列选择
1.即时向量选择器
瞬时向量选择器可以对一组时间序列数据进行筛选,并给出结果中的每个结果键值对(时间戳-样本值): 最简单的形式是,只有一个度量名称被指定。在一个瞬时向量中这个结果包含有这个度量指标名称的所有样本数据键值对。如下面这个例子选择了度量指标名称为http_requests_total,且一组标签为job=prometheus, group=canary;http_request_total等价于{__name __=“http_requests_total”}。
http_requests_total{job="prometheus",group="canary"}
标签匹配符:
=: 精确地匹配标签给定的值
!=: 不等于给定的标签值
=~: 选择匹配正则表达式的标签(或子标签)
!~: 选择不匹配正则表达式的标签(或子标签)
例如下面的表达式选择了度量指标名称以job:开头的时间序列数据:
{name=~"^job:.*"}
2.范围向量选择
范围向量类似瞬时向量, 不同在于,它们从当前实例选择样本范围区间。在语法上,时间长度被追加在向量选择器尾部的方括号[]中,用以指定对于每个样本范围区间中的每个元素应该抓取的时间范围样本区间。
时间长度有一个数值决定,后面可以跟下面的单位:
s - seconds
m - minutes
h - hours
d - days
w - weeks
y - years
在下面这个例子中, 选择过去5分钟内,度量指标名称为http_requests_total, 标签为job="prometheus"的时间序列数据:
http_requests_total{job="prometheus"}[5m]
3.偏移修饰符
这个offset偏移修饰符允许在查询中改变单个瞬时向量和范围向量中的时间偏移。
例如,下面的表达式返回相对于当前时间的前5分钟时的时刻, 度量指标名称为http_requests_total的时间序列数据:
http_requests_total offset 5m
注意:offset偏移修饰符必须直接跟在选择器后面,例如:
sum(http_requests_total{method="GET"} offset 5m)
然而,下面这种情况是不正确的
sum(http_requests_total{method="GET"}) offset 5m // INVALID.
offset偏移修饰符在范围向量上和瞬时向量用法一样的。下面这个返回了相对于当前时间的前一周时,过去5分钟的度量指标名称为http_requests_total的速率:
rate(http_requests_total[5m] offset 1w)
Prometheus还支持一些函数及操作符。
Prometheus查询到的数据由三部分组成:
指标(metric):指标和一组描述当前样本特征的labelsets唯一标识;
时间戳(timestamp):一个精确到毫秒的时间戳,一般由采集时间决定; 样本值(value):
一个folat64的浮点型数据表示当前样本的值。
Prometheus会将所有采集到的样本数据以时间序列(time-series)的方式保存在内存数据库中,并且定时保存到硬盘上。每条time-series通过指标名称(metrics name)和一组标签集(labelset)命名。如下所示,可以将time-series理解为一个以时间为X轴的二维矩阵:
一些数据例子如下图:(所有数据均为64bit)