标签匹配查询

Prometheus通过指标名称(metrics name)以及对应的一组标签(labelset)唯一定义一条时间序列。指标名称反映了监控样本的基本标识,而label则在这个基本特征上为采集到的数据提供了多种特征维度。用户可以基于这些特征维度过滤,聚合,统计从而产生新的计算后的一条时间序列。

当Prometheus通过Exporter采集到相应的监控指标样本数据后,我们就可以通过PromQL对监控样本数据进行查询。

当我们直接使用监控指标名称查询时,可以查询该指标下的所有时间序列。如:

node_cpu_seconds_total

等同于:

node_cpu_seconds_total{}

该表达式会返回指标名称为node_cpu_seconds_total的所有时间序列:

image-20210503173844289

标签匹配查询

PromQL还支持用户根据时间序列的标签匹配模式来对时间序列进行过滤,目前主要支持两种匹配模式:完全匹配和正则匹配。

PromQL支持使用=!=两种完全匹配模式:

  • 通过使用label=value可以选择那些标签满足表达式定义的时间序列;
  • 反之使用label!=value则可以根据标签匹配排除时间序列;

例如,如果我们只需要查询所有node_cpu_seconds_total时间序列中满足标签mode为iowait的时间序列,则可以使用如下表达式:

node_cpu_seconds_total{mode="iowait"}

image-20210503172711139 如果只想查询cpu为1,且mode为iowait的时间序列,则可以添加多个查询条件:

node_cpu_seconds_total{mode="iowait", cpu="1"}

image-20210503172812471 反之使用cpu!="1"则可以排除这些时间序列:

node_cpu_seconds_total{mode="iowait", cpu!="1"}

image-20210503172857496 除了使用完全匹配的方式对时间序列进行过滤以外,PromQL还可以支持使用正则表达式作为匹配条件,多个表达式之间使用|进行分离:

  • 使用label=~regx表示选择那些标签符合正则表达式定义的时间序列;
  • 反之使用label!~regx进行排除;

例如,如果想查询mode为idle或user的时间序列序列可以使用如下表达式:

node_cpu_seconds_total{mode=~"idle|user"}

image-20210503173140965 想要查询mode不以s开头的序列:

node_cpu_seconds_total{mode!~"s.*"}

image-20210503173431219

范围查询

直接通过类似于PromQL表达式node_cpu_seconds_total查询时间序列时,返回值中只会包含该时间序列中的最新的一个样本值,这样的返回结果我们称之为瞬时向量(Instant Vector)。而相应的这样的表达式称之为瞬时向量表达式

而如果我们想过去一段时间范围内的样本数据时,我们则需要使用区间向量表达式(Range Vector)。区间向量表达式和瞬时向量表达式之间的差异在于在区间向量表达式中我们需要定义时间选择的范围,时间范围通过时间范围选择器[]进行定义。例如,通过以下表达式可以选择最近1分钟内的所有样本数据:

node_cpu_seconds_total{mode="idle"}[1m]

该表达式将会返回查询到的时间序列中最近1分钟的所有样本数据:

image-20210503173910002 通过区间向量表达式查询到的结果我们称为区间向量

除了使用m表示分钟以外,PromQL的时间范围选择器支持其它时间单位:

  • s - 秒
  • m - 分钟
  • h - 小时
  • d - 天
  • w - 周
  • y - 年