跳转至

选择时间序列

本节我们将学习如何用不同的方式来选择数据,如何在单个时间戳或一段时间范围内基于标签过滤数据,以及如何使用移动时间的方式来选择数据。

过滤指标名称

最简单的 PromQL 查询就是直接选择具有指定指标名称的序列,例如,以下查询将返回所有具有指标名称 demo_api_request_duration_seconds_count 的序列:

demo_api_request_duration_seconds_count

该查询将返回许多具有相同指标名称的序列,但有不同的标签组合 instance、job、method、path 和 status 等。输出结果如下所示:

API 请求响应时长查询

根据标签过滤

如果我们只查询 demo_api_request_duration_seconds_count 中具有 method="GET" 标签的那些指标序列,则可以在指标名称后用大括号加上这个过滤条件:

demo_api_request_duration_seconds_count{method="GET"}

此外我们还可以使用逗号来组合多个标签匹配器:

demo_api_request_duration_seconds_count{instance="demo-service-0:10000",method="GET",job="demo"}

上面将得到 demo 任务下面 demo-service-0:10000 这个实例 method="GET" 的指标序列数据:

过滤 API 请求计数

需要注意的是组合使用多个匹配条件的时候,是过滤所有条件都满足的时间序列。

除了相等匹配之外,Prometheus 还支持其他几种匹配器类型:

  • !=:不等于
  • =~:正则表达式匹配
  • !~:正则表达式不匹配

甚至我们还可以完全省略指标名称,比如直接查询所有 path 标签以 /api 开头的所有序列:

{path=~"/api.*"}

该查询会得到一些具有不同指标名称的序列:

正则表达式匹配的序列

注意: Prometheus 中的正则表达式总是针对完整的字符串而不是部分字符串匹配。因此,在匹配任何以 /api 开通的路径时,不需要以 ^ 开头,但需要在结尾处添加 .*,这样可以匹配 path="/api" 这样的序列。

前面我们说过在 Prometheus 内部,指标名称本质上是一个名为 __name__ 的特性标签,所以查询 demo_api_request_duration_seconds_count 实际上和下面的查询方式是等效的:

{__name__="demo_api_request_duration_seconds_count"}

按上面的方法编写的选择器,可以得到一个瞬时向量,其中包含所有选定序列的单个最新值。事实上有些函数要求你不是传递一个单一的值,而是传递一个序列在一段时间范围内的值,也就是前面我们说的区间向量。这个时候我们可以通过附加一个[<数字><单位>]形式的持续时间指定符,将即时向量选择器改变为范围向量选择器(例如[5m]表示 5 分钟)。

比如要查询最近 5 分钟的可用内存,可以执行下面的查询语句:

demo_memory_usage_bytes{type="free"}[5m]

将得到如下所示的查询结果:

范围向量查询

可以使用的有效的时间单位为:

  • ms -毫秒
  • s -秒
  • m - 分钟
  • h - 小时
  • d - 天
  • y - 年

有时我们还需要以时移方式访问过去的数据,通常用来与当前数据进行比较。要将过去的数据时移到当前位置,可以使用 offset <duration> 修饰符添加到任何范围或即时序列选择器进行查询(例如 my_metric offset 5mmy_metric[1m] offset 7d)。

例如,要选择一个小时前的可用内存,可以使用下面的查询语句:

demo_memory_usage_bytes{type="free"} offset 1h

这个时候查询的值则是一个小时之前的数据:

时移数据查询

练习:

1.构建一个查询,选择所有时间序列。

{job!=""}

或者:

{__name__=~".+"}

2.构建一个查询,查询所有指标名称为 demo_api_request_duration_seconds_count 并且 method 标签不为 POST 的序列。

demo_api_request_duration_seconds_count{method!="POST"}

3.使用 demo_memory_usage_bytes 指标查询一小时前的 1 分钟时间范围的的可用空闲内存。

demo_memory_usage_bytes{type="free"}[1m] offset 1h