PromQL语法详解

发布时间:2023-05-19

一、基本语法和操作符

PromQL是Prometheus Query Language(普罗米修斯查询语言)的缩写,它具有类似SQL的特点,主要用于查询Prometheus中存储的时间序列数据。 PromQL基本语法如下:

metric_name [ "{" label_name "=" *label_value* [ "," label_name "=" *label_value* ] "}" ] [ *offset_modifier* ]

其中,metric_name表示指标的名称,label_name和label_value表示标签的名称和值,offset_modifier表示时间偏移量。 除了基本语法以外,PromQL还包含了一些操作符,主要有:

  • 算术运算符:+、-、*、/
  • 比较运算符:==、!=、>、>=、<、<=
  • 逻辑运算符:and、or、unless
  • 聚合运算符:sum、avg、min、max、stddev、stdvar、count
  • 排序运算符:sort、sort_desc
  • 偏移运算符:offset、timestamp
  • 其他运算符:rate、irate、delta、abs、ceil、floor、clamp_max、clamp_min、absent 下面是一个示例代码:
cpu_usage{instance="localhost:8000"} + disk_usage{instance="localhost:8000"} offset 5m

该代码表示查询本地服务器8000端口上运行的CPU使用率和磁盘使用率在5分钟前的值之和。

二、标签匹配和正则表达式

Prometheus中的时间序列数据通常包含一些标签,用于标识不同的数据来源。PromQL提供了一些标签匹配和正则表达式的功能,方便用户查询和过滤数据。 标签匹配的语法如下:

{label_name=~"regex", label_name!~"regex"}

其中,=~表示匹配正则表达式,!~表示不匹配正则表达式。 下面是一个示例代码:

rate(http_requests_total{method="POST", handler="/api/user"}[5m])

该代码表示查询5分钟内HTTP POST /api/user请求的速率。

三、函数和聚合

PromQL中还包含了一些函数和聚合操作,用于汇总和处理数据。 常用的函数和聚合操作如下:

  • abs(value):返回value的绝对值
  • ceil(value):返回value的上限整数
  • floor(value):返回value的下限整数
  • clamp_min(value, min):如果value小于min,则返回min,否则返回value
  • clamp_max(value, max):如果value大于max,则返回max,否则返回value
  • rate(vector [range]):计算向量中每个时间序列的速率
  • irate(vector [range]):计算向量中每个时间序列的瞬时速率
  • delta(vector [range]):计算向量中每个时间序列的最新值与前一个值之差
  • sum(vector [by...]):对向量中的时间序列进行求和,可以按标签进行分组
  • avg(vector [by...]):对向量中的时间序列进行平均值计算,可以按标签进行分组
  • min(vector [by...]):对向量中的时间序列进行最小值计算,可以按标签进行分组
  • max(vector [by...]):对向量中的时间序列进行最大值计算,可以按标签进行分组
  • stddev(vector [by...]):对向量中的时间序列进行标准差计算,可以按标签进行分组
  • stdvar(vector [by...]):对向量中的时间序列进行方差计算,可以按标签进行分组 下面是一个示例代码:
sum(rate(http_requests_total{method="GET", status="200"}[5m])) by (instance)

该代码表示统计5分钟内HTTP GET请求并且状态码为200的请求速率,并按服务器实例进行分组。

四、向量匹配和聚合

PromQL中的向量是一个包含多个时间序列的列表,用户可以对向量进行匹配和聚合操作。 向量匹配的语法如下:

vector matching_operator value

其中,matching_operator可以是==、!=、>、>=、<、<=等运算符。 下面是一个示例代码:

http_requests_total{method="POST"} > 100

该代码表示查询HTTP POST请求的时间序列中,请求总数大于100的时间序列。

五、模板和重命名

在PromQL中,用户可以利用模板和重命名功能对时间序列和标签进行重构和修改。 模板的语法如下:

label_name:template

其中,label_name是目标标签的名称,template是重构模板。 重命名的语法如下:

label_replace(vector, dst_label, replacement, src_label, regex)

其中,vector是原始向量,dst_label是目标标签的名称,replacement是替换模板,src_label和regex用于匹配原始标签的值。 下面是一个示例代码:

label_replace(http_requests_total{code="2xx", handler="/api/*", method="POST"}, "path", "$1", "handler", "/api/(.*)")

该代码表示将HTTP POST请求中,路径为/api/开头的时间序列的handler标签替换为path标签,并用正则表达式提取/api/后面的内容。

六、总结

本文详细介绍了PromQL语法的基本用法、标签匹配和正则表达式、函数和聚合、向量匹配和聚合、模板和重命名等方面的内容,希望读者对PromQL有更深入的了解,并可以更好地使用Prometheus进行监控和数据分析。