博客/工程

如何使用PromQL连接更有效的普罗米修斯指标的大规模查询

2021年8月4日4分钟

我们最近听说一个客户,一个高级用户普罗米修斯,因为它的设置涉及为每个生成的度量创建一个单独的规则组,所以它正在为其度量处理18,000个单独的规则。肯定有更好、更有效的方法来处理这种规模的指标吗?

事实上,我们确实提出了一个解决方案,这篇博文将告诉你如何从中受益。

我们要做什么

该组织正在为每个生成的度量创建单独的规则组。

例如:

组:—name: slo_metric expr: count(api_response_latency_ms{labelone="xyz", labeltwo="abc"} > 100) labels: reference_label: xyzabc123

上面的记录规则的原因是客户想要添加reference_label到度量的聚合版本。参考标签对应于每个系列上已经存在的两个预先存在的标签。手头的问题是如何使用所需的关联引用标签创建新的聚合系列而不更改底层系列?

在提出替代方案时,我们考虑了以下因素:

信息的度量

Prometheus中的信息度量是一种不编码度量值的度量,而是用于编码高基数标签值。一个信息度量的例子是node_uname_info

node_uname_info{cluster="dev-us-central-0", domainname="(none)", instance="localhost", job="default/node-export ", machine="x86_64", namespace="default", nodename="dev-host-1", release="4.19.150+", sysname="Linux", version="#1 SMP Tue 11月24日07:54:23 PST 2020"} 1 . node_uname_info{cluster="dev-us-central-0", domainname="(none)", instance="localhost", job="default/node-export ", machine="x86_64

上面的度量由节点导出器公开,是一个度量值总是设置为1的度量值。尽管这个指标本身没有用处,但它可以与其他指标一起使用。例如,如果你想通过操作系统版本来确定CPU空闲时间,你可以使用查询:

Sum by (release) (rate(node_cpu_seconds_total{mode="idle"}[5m]) * on (instance) group_left(release) node_uname_info)

您可能遇到的下一个问题是,如何使用正确的标签值轻松创建信息度量,并快速将它们刮到Prometheus中。您总是可以创建一个带有所需指标的应用程序,但还有一种更简单的方法。你可以利用textfile_collector

文本文件出口国

普罗米修斯节点出口商和Grafana代理支持一个文本文件收集器.对象中包含度量的文本文件普罗米修斯展览格式.该功能对于快速生成包含元数据的静态度量非常重要,这些元数据对PromQL查询非常有用。

使用上述功能,您可以创建包含唯一标签集的信息指标,这些标签集可用于与其他指标的PromQL连接查询。您所需要做的就是创建一个包含所需信息指标的文件,并将它们暴露给Prometheus。您可以手动或使用脚本完成此操作。

有关可用于生成包含要由文本文件收集器收集的指标的文件的一些示例脚本,请参见普罗米修斯社区脚本存储库

加入PromQL

PromQL支持将两个指标连接在一起的能力:您可以在查询时从一个指标附加标签集,并将其附加到另一个指标。这在普罗米修斯规则计算中非常有用,因为它允许您通过添加来自另一个信息度量的标签来为一个系列生成一个新的度量。

有关连接运算符的更多信息,请参见普罗米修斯查询操作符文档看看这些博客文章:

把它们结合在一起

您可以重新使用生成18000个规则组的工具,以生成包含度量的Prometheus度量文件sli_info.这个度量将包含seal引用、sealID、checkID以及它适当映射到的任何其他标签。

接下来,收集使用Grafana Agent中内置的文本文件收集器生成的指标,并将它们写入Cortex。

每个度量运行一个规则,该规则使用PromQL连接将适当的引用标签注入到生成的系列中。

例如,基于上面的规则组:

组:—name: slo_metric expr: count(api_response_latency{labelone="xyz", labeltwo="abc"} > 100) labels: reference_label: xyzabc

您将创建以下信息度量文件:

Sli_info {labelone="xyz", labeltwo="abc", reference_label="xyzabz"

该文件将由Grafana Agent收集。然后可以在Cortex中使用以下规则组:

组:- name: slo_metric expr: count by (reference_label) (api_response_latency * on (labelone,labeltwo) group_left(reference_label) sli_info > 100)

这将适用于具有这些标签名称和相关映射的每个度量。

瞧!您将得到与现有规则组相同的结果,但没有18,000个单独的规则。