# 初识PromQL

## 查询时间序列

Prometheus通过指标名称（metrics name）以及对应的一组标签（labelset）唯一标识一条时间序列，我们可以通过PromQL来查询时间序列。

比如，我们可以通过下面的语句查询各主机的空闲内存

```
node_memory_MemAvailable_bytes
```

由于该表达式没有指定标签，所以通过模糊匹配，该表达式会返回两台主机的数据

```
node_memory_MemAvailable_bytes{instance="peng01",job="node_exporter"}    3341881344
node_memory_MemAvailable_bytes{instance="peng02",job="node_exporter"}    3514314752
```

### 完全匹配与正则匹配

PromQL支持使用`=`和`!=`两种完全匹配模式来进行查询。比如，我们可以查询主机`peng01`的可用内存

```
node_memory_MemAvailable_bytes{instance="peng01"}
```

也可以用下面的语句查询除主机`peng01`以外的主机的可用内存

```
node_memory_MemAvailable_bytes{instance!="peng01"}
```

PromQL支持使用`=~`和`!~`两种完全匹配模式来进行查询，比如

```
node_memory_MemAvailable_bytes{instance=~"peng01|peng02"}
```

## 瞬时向量与区间向量

上面语句查询到的结果只会包含时间序列中最新的那个样本值，这样的返回结果我们称为**瞬时向量**。而相应的这样的表达式称之为瞬时向量表达式。

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

```
node_memory_MemAvailable_bytes{}[5m]
```

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

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

* s - 秒
* m - 分
* h - 时
* d - 天
* w - 周
* y - 年

## 时间位移操作

在瞬时向量表达式或者区间向量表达式中，都是以当前时间为基准：

```
node_memory_MemAvailable_bytes    # 选择当前最新的数据
node_memory_MemAvailable_bytes    # 选择以当前时间为基准，5分钟内的数据
```

而如果我们想查询，5分钟前的瞬时样本数据，或昨天一天的区间内的样本数据呢? 这个时候我们就可以使用位移操作，位移操作的关键字为offset。

可以使用offset时间位移操作：

```
node_memory_MemAvailable_bytes offset 5m
node_memory_MemAvailable_bytes[5m] offset 1d
```
