PromQL: Prometheus 查询语言的全面解析

发布时间:2023-05-20

Prometheus是一个流行的开源监控系统,PromQL是它的查询语言。PromQL 的强大功能使其成为一个容易使用而有力的工具。在本文中,我们将全面深入地了解PromQL,包括其语法、函数、数据查询和模糊匹配等方面的详细内容。

一、PromQL 语法

首先,让我们看一下PromQL的基本语法。PromQL的语法类似于SQL,它使用一个表格来表示时序数据,而每个行代表一个时间戳和相应的数据值。

# 示例基本语法
metric_name [ "{" label_name "=" `label_value` [ "," label_name "=" `label_value` ] "}" ] element-specifier [ range-vector-selector | offset ]

其中:

  • metric_name:是一个字符串,表示监控指标的名称。
  • label_namelabel_value:用来标识监控指标,是一组键值对。
  • element-specifier:表示查询的数据值。例如,一个整个时间序列可以用它的名称表示,北京市在2021年的天气可以用它的名称,也可以用一些关键字来表示,如TOPK,AVG等。
  • range-vector-selectoroffset:可选参数。range-vector-selector 用来指定一个时间范围,而 offset 用户指定相对时间的时间位移。

二、PromQL判断数据是否存在

在进行数据检索之前,通常需要先判断数据是否存在。PromQL 提供了一些函数来帮助我们进行这个工作。

1. absent() 函数

absent() 函数可用于检查在请求的时间范围内是否有指定的指标名称或标签/键值对的数据存在。

absent(metric_name [ "{" label_name "=" `label_value` [ "," label_name "=" `label_value` ] "}" ]) 

例如以下查询会返回 1,因为名为 my_metric 的指标不存在:

# 查询 my_metric 指标是否存在
absent(my_metric)  

2. label_replace() 函数

label_replace() 函数可用于条件转换:如果存在符合给定模式的标签,则用新标签覆盖原始标签。

# 示例将源标签名称与 value 进行正则表达式替换,新标签的名称为 dest_label,替换后的值为 $1
label_replace(source_metric_name{source_label="value"}, "dest_label", "$1", "source_label", "regex") 

三、PromQL 函数

PromQL提供了许多有用的函数帮助我们对数据进行精确查询和处理。下面我们就来介绍一下它提供的几种函数。

1. rate() 函数

rate() 函数被用来对计数器类型指标进行转换,得到每秒钟的增量速率。例如:获取过去5分钟内的接口流量

# query data from counter metric
irate(api_requests_total[5m])  

2. increase() 函数

increase() 函数被用来计算子查询内计数器类型指标的增量值。例如,下面这段查询用于比较过去5分钟和过去10分钟的接口请求增量:

increase(api_requests_total[5m]) / increase(api_requests_total[10m])

3. sum() 函数

sum() 函数用于汇总同一标签下的数据,并将多个时序数据之和作为一个新时序数据返回。例如,下面这段查询计算出了所有服务中广告流量的总和:

sum(ad_traffic{service="*"})

4. count() 函数

count() 函数用于计算提取出的指标集合中的元素数量。下面这段查询计算每个标签的数据数量:

count by (label_name) (metric_name) 

四、PromQL怎么读

PromQL的阅读对初学者来说可能会比较困难。在这里,我们推荐使用以下技巧来更好地掌握它:

  1. 深入理解查询的目的,以便更好地理解需要查询哪些数据和如何使用PromQL来搜索数据。
  2. 在复杂的查询中使用括号来明确查询的顺序和意图。
  3. 使用PromQL解释器测试你的查询语句,以便确定你所查询的实际数据是否符合你的预期。

五、PromQL 模糊匹配

PromQL也支持模糊匹配。

1. =~ 运算符

适用于正则表达式匹配。例如,匹配 CPU 使用率中以 http 开头的数据:

# Using the 'http.*' regex pattern to match CPU usage metrics that begin with "http"
node_cpu{instance=~"http.*"}

六、PromQL 语法解析

PromQL的语法解析使得它可以轻松地查询时序数据。使用PromQL解析器,你可以将查询转换为可视化数据图表以及其他处理结果,帮助你更好地理解与管理大规模时序数据。

七、PromQL 中文手册

为了帮助更多的开发人员更好地理解PromQL,社区提供了PromQL中文手册,详细介绍了PromQL的基本语法、常见问题、函数等内容。如果你是一个PromQL新手,这个手册一定对你大有帮助。

八、PromQL BY

BY 关键字用于分组聚合。下面这段代码计算每个主机的 CPU 平均负载:

avg(cpu_load) by (host)

九、PromQL SUM

SUM 函数用于汇总数据。下面这段代码计算服务 http_requests_total 的总请求次数:

sum(http_requests_total)

十、PromQL TOPK

使用 TOPK 函数,你可以获取请求最高的前几个元素。下面这段代码查询了最大的 5 个 CPU 负载值:

topk(5, cpu_load)