Loading... PromQL 是 Prometheus 的查询语言。它允许进行多种操作,包括聚合,切片和切块,预测和连接 ## 数据类型 * 瞬时/即时向量(instant vector):一组时间序列,每个时间序列包含一个样本,所有样本共享相同的时间戳 * 范围向量(Range vector):一组时间序列,其中包含每个时间序列随时间变化的一系列数据点 * 标量(Scalar):一个简单的数字浮点值 * 字符串(String):一个简单的字符串值 ### String * 可以在单引号,双引号或反引号中将字符串指定为文字 * PromQL遵循与Go相同的转义规则 * 在单引号或双引号反斜杠开头的转义序列,其可以随后a,b,f, n,r,t,v或\。 * 可使用八进制(来提供特定的字符\nnn)或十六进制(\xnn,\unnnn和\Unnnnnnnn) * 反引号内不会处理任何转义。与Go不同,Prometheus不会在反引号内丢弃换行符。 * 例如: ```plaintext "this is a string" 'these are unescaped: \n \\ \t' `these are not unescaped: \n ' " \t` ``` ### Float literals(浮点文字) * 标量浮点值可以按以下格式写为文字整数或浮点数(仅包括空格以提高可读性): * 例如: ``` 23 -2.43 3.4e-9 0x8f -Inf NaN ``` ## 时间序列选择器 ### 即时向量选择器 * 即时矢量选择器允许在给定的时间戳(即时)下选择一组时间序列和每个样本的单个样本值 * 以最简单的形式,仅指定度量名称 * 这将导致一个即时向量,其中包含具有该度量名称的所有时间序列的元素 ```javascript # 本示例选择所有具有prometheus_http_requests_total度量标准名称的时间序列 prometheus_http_requests_total prometheus_http_requests_total{} ``` 通过在大括号({})中添加逗号分隔的标签匹配器列表,可以进一步过滤这些时间序列。 ``` prometheus_http_requests_total{job="prometheus"} ``` 也可以否定地匹配标签值,或将标签值与正则表达式匹配。存在以下标签匹配运算符: - `=` - 选择与提供的字符串完全相同的标签(精确匹配) - `!=` - 选择不等于提供的字符串的标签(反向匹配) - `=~` - 选择与提供的字符串进行正则表达式匹配的标签(正则表达式匹配) - `!~` - 选择正则表达式不匹配提供的字符串的标签(反向正则表达式匹配) ``` node_cpu_seconds_total{cpu="0",mode=~"idle|irq"} node_cpu_seconds_total{mode=~"idle|irq"} ``` 以下表达式是非法的 ``` {job=~"*."} ``` 正确的表达方式 ``` {job=~".+"} {job=~".*"} ``` ### 范围向量选择器 - 范围向量文字的工作方式与即时向量文字相同 - 不同之处在于,它们从当前瞬间选择了一定范围的样本 - 范围持续时间附加在末尾的[] - 以指定应为每个结果范围向量元素提取多远的时间值 ```javascript # 以下示例可以在 表达式浏览器 测试 prometheus_http_requests_total{job="prometheus"}[5m] ``` ### 持续时间 持续时间指定为数字,紧随其后的是以下单位之一: - `ms` - 毫秒 - `s` - 秒 - `m` - 分钟 - `h` - 小时 - `d` - 天(24小时) - `w` - 周(7天) - `y` - 年(365天) ```javascript # 以下示例可以在 表达式浏览器 测试 prometheus_http_requests_total{job="prometheus"}[5m] node_network_receive_bytes_total[1m] irate(node_network_receive_bytes_total[1m]) ``` ### 时间位移 - 在瞬时向量表达式或者区间向量表达式中,都是以当前时间为基准: - 而如果我们想查询,5分钟前的瞬时样本数据,或昨天一天的区间内的样本数据呢? - 这个时候我们就可以使用位移操作,位移操作的关键字为offset。 ```javascript # 以下示例可以在 表达式浏览器 测试 prometheus_http_requests_total{job="prometheus"} offset 5m ``` ## 操作符 ### 数学运算 二元算术运算符 - `+` - 加法 - `-` - 减法 - `*` - 乘法 - `/` - 除法 - `%` - 求余 - `^` - 幂运算 ### 布尔运算 - `==` - 相等 - `!=` - 不相等 - `>` - 大于 - `<` - 小于 - `>=` - 大于等于 - `<=` - 小于等于 ``` # 查看所有主机的内存使用率 node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes # 查看内存使用率大于 40% 的主机 node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes > 0.4 ``` ### 布尔运算符 布尔运算符的默认行为是对时序数据进行过滤 而在其它的情况下我们可能需要的是真正的布尔结果 同时需要注意的是,如果是在两个标量之间使用布尔运算,则必须使用bool修饰符 ```javascript 2 == bool 2 # 结果 1 2 == bool 1 # 结果 0 ``` ### 集合运算符 使用瞬时向量表达式能够获取到一个包含多个时间序列的集合,我们称为瞬时向量 通过集合运算,可以在两个瞬时向量与瞬时向量之间进行相应的集合操作 - `and` - 并且 - `or` - 或者 - `unless` - 排除 ### 聚合操作 Prometheus还提供了下列内置的聚合操作符,这些操作符作用域瞬时向量 可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列 - `sum` - 求和 - `min` - 最小值 - `max` - 最大值 - `avg` - 平均值 - `stddev` - 标准差 - `stdvar` - 标准差异 - `count` - 计数 - `count_values` - 对value进行计数 - `bottomk` - 后n条时序 - `topk` - 前n条时序 - `quantile` - 分布统计 ``` <aggr-op>([parameter,] <vector expression>) [without|by (<label list>)] ``` 其中只有 **count_values**, **quantile**, **topk**, **bottomk** 支持参数(parameter)。 without 用于从计算结果中移除列举的标签,而保留其它标签 by 则正好相反,结果向量中只保留列出的标签,其余标签则移除 通过 without 和 by 可以按照样本的问题对数据进行聚合 count_values 用于时间序列中每一个样本值出现的次数 count_values 会为每一个唯一的样本值输出一个时间序列,并且每一个时间序列包含一个额外的标签 topk 和 bottomk 则用于对样本值进行排序,返回当前样本值前 n 位,或者后 n 位的时间序列 quantile 用于计算当前样本数据值的分布情况 最后修改:2024 年 03 月 05 日 © 来自互联网 赞 如果觉得我的文章对你有用,请随意赞赏