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_name
和label_value
:用来标识监控指标,是一组键值对。element-specifier
:表示查询的数据值。例如,一个整个时间序列可以用它的名称表示,北京市在2021年的天气可以用它的名称,也可以用一些关键字来表示,如TOPK,AVG等。range-vector-selector
和offset
:可选参数。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的阅读对初学者来说可能会比较困难。在这里,我们推荐使用以下技巧来更好地掌握它:
- 深入理解查询的目的,以便更好地理解需要查询哪些数据和如何使用PromQL来搜索数据。
- 在复杂的查询中使用括号来明确查询的顺序和意图。
- 使用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)