如何在 Prometheus 中一次调用执行多个查询

Posted

技术标签:

【中文标题】如何在 Prometheus 中一次调用执行多个查询【英文标题】:How to execute multiple queries in one call in Prometheus 【发布时间】:2018-05-04 12:49:50 【问题描述】:

我在 kubernetes 集群中运行 prometheus。

我需要每分钟向 Prometheus 发送查询,以从许多容器中收集许多指标的信息。匹配查询太多,所以我必须将它们组合起来。

我知道如何向 Prometheus 询问多个容器的一个指标信息:my_metriccontainer_name=~"frontend|backend|db",但我还没有找到一种方法在一个查询中向 Prometheus 询问多个指标信息。

我在 sql 查询中寻找与 'union' 等价的东西。

【问题讨论】:

【参考方案1】:

我找到了here这个解决方案:__name__=~"metricA|metricB|metricC",container_name=~"frontend|backend|db"

【讨论】:

您链接到的文章特别指出在__name__ 上使用正则表达式是一种反模式。 prometheus.io/docs/prometheus/latest/querying/basics 表示对此结构没有疑虑。 链接的文章说它的带有通配符的示例正则表达式“是一种反模式,因为您应该先验地知道您的指标名称。”我认为这个问题和答案的精神是你确实知道你想要的指标的确切名称(也就是说,你没有在你的正则表达式中使用任何通配符)你只想要更多一次一个。对我来说,这个答案似乎不符合他们担心的反模式。【参考方案2】:

您可以使用or 运算符,但这并不能一概而论,因为它会忽略指标名称。我建议对 API 进行多次查询。

【讨论】:

【参考方案3】:

PromQL 不提供在单个 api 调用中执行多个查询的能力。但是向后兼容 PromQL 的 MetricsQL 通过union 函数提供了这样的能力:

union(
  query1,
  query2,
  ...
  queryN,
)

这将返回来自所有 query* 查询的所有时间序列。请注意,预计每个时间序列都有一组唯一的标签(包括指标名称又名___name__ 标签)。如果不是这种情况,则将从结果中删除具有相同标签集的重复系列。在这种情况下,alias 和 label_set 函数可能有助于为每个 query* 添加唯一标签。

【讨论】:

以上是关于如何在 Prometheus 中一次调用执行多个查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SpriteKit 中一次引用多个 SKNode?

如何在Oracle中一次执行多条sql语句

在 Mongoose 中一次执行多个查询

在 Parse 中一次更新多个对象

在 Django 中一次提交中执行多个 save() 的最佳方法

在 go 中一次处理多个 GET 请求