一、理解时间序列
1、理解时间序列
Prometheus会将所有采集到的样本数据以时间序列(time-series)的方式保存在内存数据库中,并且定时保存到硬盘上。time-series是按照时间戳和值的序列顺序存放的,我们称之为向量(vector). 每条time-series通过指标名称(metrics name)和一组标签集(labelset)命名。如下所示,可以将time-series理解为一个以时间为Y轴的数字矩阵。
在time-series中的每一个点称为一个样本(sample),样本由以下三部分组成:
指标(metric):metric name和描述当前样本特征的labelsets;
时间戳(timestamp):一个精确到毫秒的时间戳;
样本值(value): 一个float64的浮点型数据表示当前样本的值。
http_request_total{status="200", method="GET"}@1434417560938 => 94355
2、指标(metric)
指标(Metric格式标示:<metric name>{<label name>=<label value>, ...}
指标的名称(metric name)可以反映被监控样本的含义(比如,http_request_total - 表示当前系统接收到的HTTP请求总量)。指标名称只能由ASCII字符、数字、下划线以及冒号组成并必须符合正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*。
标签(label)反映了当前样本的特征维度,通过这些维度Prometheus可以对样本数据进行过滤,聚合等。标签的名称只能由ASCII字符、数字以及下划线组成并满足正则表达式[a-zA-Z_][a-zA-Z0-9_]*。
其中以__作为前缀的标签,是系统保留的关键字,只能在系统内部使用。标签的值则可以包含任何Unicode编码的字符。在Prometheus的底层实现中指标名称实际上是以__name__=<metric name>的形式保存在数据库中的,因此以下两种方式均表示的同一条time-series。
二、Metric类型
指标类型(metric type):Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)
Counter:Counter类型的指标其工作方式和计数器一样,只增不减(除非系统发生重置)。一般在定义Counter类型指标的名称时推荐使用_total作为后缀。
Gauge:可增可减的仪表盘。Gauge类型的指标侧重于反应系统的当前状态。
Histogram和Summary的指标类:Histogram和Summary主用用于统计和分析样本的分布情况。
三、初识PromQL
1、瞬时向量:
返回值中只会包含该时间序列中的最新的一个样本值,这样的返回结果我们称之为瞬时向量。对应的表达式被称为瞬时向量表达式。例: http_requests_total{environment=~"staging|testing|development",method!="GET"}
2、区间向量:
返回值包括过去一段时间范围内的样本数据。区间向量表达式和瞬时向量表达式之间的差异在于在区间向量表达式中我们需要定义时间选择的范围,时间范围通过时间范围选择器[]进行定义。例:http_request_total{}[5m]。
注:除了使用m表示分钟以外,PromQL的时间范围选择器支持其它时间单位:s - 秒、m - 分钟、h - 小时、d - 天、w - 周、y - 年
3、时间位移操作:
在瞬时向量表达式或者区间向量表达式中,都是以当前时间为基准。查过去5m的瞬时向量,或过去一天的区间内的样本数据,就需要位移操作。位移操作的关键字是offset。例:http_request_total{} offset 5m 和 http_request_total{}[1d] offset 1d。
4、聚合操作:
如果描述样本特征的标签(label)在并非唯一的情况下,通过PromQL查询数据,会返回多条满足这些特征维度的时间序列。PromQL提供的聚合操作可以用来对这些时间序列进行处理,形成一条新的时间序列。
5、标量和字符串:
标量(Scalar), 一个浮点型的数字值。字符串(String),一个简单的字符串值。
6、合法的PromQL:
所有的PromQL表达式都必须至少包含一个指标名称(例如http_request_total),或者一个不会匹配到空字符串的标签过滤器(例如{code="200"})。
四、PromQL操作符
1、数学运算符:
+ (加法) 、- (减法)、 * (乘法)、 / (除法)、 % (求余)、 ^ (幂运算)
2、使用布尔过滤时间序列:
== (相等)、 != (不相等)、> (大于)、< (小于)、>= (大于等于)、<= (小于等于)
3、使用bool修饰符改变布尔运算符的行为:
布尔运算符的默认行为是对时序数据进行过滤,但有时我们只是需要真正的布尔结果。使用bool修改符后,布尔运算不会对时间序列进行过滤,而是直接依次瞬时向量中的各个样本数据与标量的比较结果0或者1。从而形成一条新的时间序列。例:http_requests_total > bool 1000
4、集合运算符:
and (并且)、or (或者)、unless (排除)
vector1 and vector2 会产生一个由vector1的元素组成的新的向量。该向量包含vector1中完全匹配vector2中的元素组成。
vector1 or vector2 会产生一个新的向量,该向量包含vector1中所有的样本数据,以及vector2中没有与vector1匹配到的样本数据。
vector1 unless vector2 会产生一个新的向量,新向量中的元素由vector1中没有与vector2匹配的元素组成。
5、操作符优先级
:(1) ^ (2)*, /, % (3) +, - (4)==, !=, <=, <, >=, > (5)and, unless (6)or
6、匹配模式详解:
一对一,一对多或多对一
五、PromQL聚合操作
Prometheus还提供了下列内置的聚合操作符,这些操作符作用域瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。
聚合操作符:sum (求和)、min (最小值)、max (最大值)、avg (平均值)、stddev (标准差)、stdvar (标准差异)、count (计数)、count_values (对value进行计数)、bottomk (后n条时序)、topk (前n条时序)、 quantile (分布统计)
使用语法:<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)] 注:其中只有count_values, quantile, topk, bottomk支持参数(parameter)。
六、PromQL内置函数
increase(v range-vector), increase函数获取区间向量中的第一个到最后一个样本并返回其增长量。
rate(v range-vector),rate函数可以直接计算区间向量v在时间窗口内平均增长速率。
irate(v range-vector),irate同样用于计算区间向量的计算率,但是其反应出的是瞬时增长率。irate函数是通过区间向量中最后两个样本数据来计算区间向量的增长速率。
predict_linear(v range-vector, t scalar), 可以预测时间序列v在t秒后的值
label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string),label_replace标签为时间序列添加额外的标签
label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...),该函数可以将时间序列中v多个标签src_label的值,通过separator作为连接符写入到一个新的标签dst_label中。