瞬时向量选择器(Instant Vector Selector)允许选择一组时间序列和每个时间序列在给定时间戳(时间点)上的单个样本值。
这种选择器主要用于获取特定时间点的数据。例如,仅仅只需指定一个指标名称,就能得到一个包含有该指标名称的所有时间序列元素的瞬时向量。如选择具有 prometheus_http_requests_total 指标名称的所有时间序列:
prometheus_http_requests_total
效果如下图:
当然,我们也可以通过在大括号({})中添加逗号分隔的标签匹配器列表,可以进一步过滤这些时间序列。例如:只选择那些具有 prometheus_http_requests_total 指标名称,且 code 状态标签设置为 200,handler 标签设置为以 “/api/” 开头的时间序列:
prometheus_http_requests_total{code="200", handler=~"/api/.+"}
效果如下图:
上面我们用到了 = 和 =~ 匹配符,Prometheus 提供以下标签匹配操作符:
=:选择与所提供字符串完全相等的标签。
!=:选择不等于所提供字符串的标签。
=~:选择与所提供正则字符串匹配的标签。
!~:选择与提供的正则字符串不匹配的标签。
注意:正则匹配是完全匹配,如:env=~"foo" 的匹配会被视为 env=~"^foo$"。
例如,这会选择 prometheus_http_requests_total 指标中,environment 标签为 staging、testing 或 development ,以及 method 不等于 GET 的所有时间序列:
prometheus_http_requests_total{environment=~"staging|testing|development",method!="GET"}
如果我们指定了一个空的标签匹配器(如:code=""),Prometheus 将会选择所有没有 code 标签的时间序列。例如:
(1)给定一个数据集,如下:
http_requests_total http_requests_total{replica="rep-a"} http_requests_total{replica="rep-b"} http_requests_total{environment="development"}
(2)PromQL 查询 http_requests_total{environment=""} 将匹配并返回:
http_requests_total http_requests_total{replica="rep-a"} http_requests_total{replica="rep-b"}
该查询匹配了所有没有包含 environment 标签的时间序列,并将有 environment 标签的时间序列排除在外:
http_requests_total{environment="development"}
在 PromQL 中,支持同一标签名称可使用多个匹配器,必须全部匹配才能返回结果。例如:
(1)给定一个数据集,如下:
http_requests_total http_requests_total{replica="rep-a"} http_requests_total{replica="rep-b"} http_requests_total{environment="development"}
(2)执行 http_requests_total{replica!="rep-a",replica=~"rep.*"} 查询会匹配:
http_requests_total{replica="rep-b"}
向量选择器必须指定一个名称或至少一个不匹配空字符串的标签匹配器。以下表达式是非法的:
{job=~".*"} # 非法,因为可能匹配 job=""
相比之下,下面这些表达式是有效的,因为它们都有一个不匹配空标签值的选择器:
{job=~".+"} # 有效 {job=~".*",method="get"} # 有效
通过与内部 __name__ 标签匹配,标签匹配器也可以应用于指标名称。例如,表达式 http_requests_total 相当于 {__name__="http_requests_total"}。也可以使用 = 以外的匹配器(!=、=~、!~)。下面的表达式选择名称以 job: 开头的所有指标:
{__name__=~"job:.*"}
指标名称不得为关键字 bool、on、ignoring、group_left 和 group_right。以下表达式是非法的:
on{} # Bad!
解决这一限制的办法是使用 __name__ 标签:
{__name__="on"} # Good!
注意:Prometheus 中的所有正则表达式都使用 RE2 语法。