一、基本语法和操作符
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进行监控和数据分析。