瞬时向量,区间向量,瞬时查询,区间查询。
Request URL: http://139.198.166.235:9090/api/v1/query?query=demo_api_http_requests_in_progress&time=1644905624.121
可以看到这个是查询promql的接口,query参数其实就是promql的一个语句,time其实就是评估的时间戳,这种只包含一个promql语句和一个时间戳这样的查询其实就是一个瞬时查询。
得到的结果是一个瞬时的向量。
这还是一个瞬时的查询,只是瞬时查询的结果里面是一个区间向量。
瞬时查询的结果可能是瞬时向量,也可能是区间向量。在table里面视图里面查询都是瞬时查询。
如果切换到Graph这里来,还是之前的查询,可以看到接口变了
Request URL: http://139.198.166.235:9090/api/v1/query_range?query=demo_api_http_requests_in_progress&start=1644904540.348&end=1644906340.348&step=7
query_range 这是一个范围查询,或者区间查询。因为需要绘图,所以不是一个点,是一个时间范围内的。
在graph里面的查询都是区间查询。
选择时间序列
本节我们将学习如何用不同的方式来选择数据,如何在单个时间戳或一段时间范围内基于标签过滤数据,以及如何使用移动时间的方式来选择数据。
过滤指标名称
最简单的 PromQL 查询就是直接选择具有指定指标名称的序列,例如,以下查询将返回所有具有指标名称 demo_api_request_duration_seconds_count
的序列:
demo_api_request_duration_seconds_count
该查询将返回许多具有相同指标名称的序列,但有不同的标签组合 instance、job、method、path 和 status 等。输出结果如下所示:
根据标签过滤
如果我们只查询 demo_api_request_duration_seconds_count
中具有 method="GET"
标签的那些指标序列,则可以在指标名称后用大括号加上这个过滤条件:
demo_api_request_duration_seconds_count{method="GET"}{__name__="demo_api_request_duration_seconds_count",instance="192.168.100.5:10000",method="GET",status="200"}
此外我们还可以使用逗号来组合多个标签匹配器:
demo_api_request_duration_seconds_count{instance="demo-service-0:10000",method="GET",job="demo"}
上面将得到 demo 任务下面 demo-service-0:10000
这个实例且 method="GET"
的指标序列数据:
需要注意的是组合使用多个匹配条件的时候,是过滤所有条件都满足的时间序列。
除了相等匹配之外,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]
将得到如下所示的查询结果:这是区间向量,里面包含多个样本,区间向量是无法去graph去绘制的,也就是同一个时间点
可以使用的有效的时间单位为:
ms
-毫秒s
-秒m
- 分钟h
- 小时d
- 天y
- 年
有时我们还需要以时移方式访问过去的数据,通常用来与当前数据进行比较。要将过去的数据时移到当前位置,可以使用 offset <duration>
修饰符添加到任何范围或即时序列选择器进行查询(例如 my_metric offset 5m
或 my_metric[1m] offset 7d
)。
例如,要选择一个小时前的可用内存,可以使用下面的查询语句:
demo_memory_usage_bytes{type="free"} offset 1h
这个时候查询的值则是一个小时之前的数据:
练习:
1.构建一个查询,选择所有时间序列。时间序列里面都包含标签_name_,这里使用=~正则匹配(仅仅在测试的时候调试,在生产环境序列会非常多的,不能这样操作)
{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 分钟时间范围的的可用空闲内存。首先要将空闲内存过滤出来,一分钟是[1m],一个小时之前是offset 1h
demo_memory_usage_bytes{type="free"}[1m] offset 1h