Prometheus 教程

PromQL 瞬时向量选择器

瞬时向量选择器(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 语法。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号