Prometheus 按标签查询范围向量

Posted

技术标签:

【中文标题】Prometheus 按标签查询范围向量【英文标题】:Prometheus query by label with range vectors 【发布时间】:2021-01-20 11:46:20 【问题描述】:

我在我的应用程序中定义了很多计数器(使用 java micrometer),为了触发警报,我将要监视的计数器标记为“错误”:“警报”,因此像 error="alert" 这样的查询将生成多个范围向量:

   error_counter_component1error="alert", label2="random"
   error_counter_component2error="alert", label2="random2"
   error_counter_component3error="none", label2="random3"

我无法控制计数器的名称,我只能将标签添加到我想在警报中使用的计数器。我想要的警报是,如果所有标有 error="alert" 的计数器在一小时内增加超过 3 个,所以我可以使用这种查询:increase(error="alert"[1h]) > 3 但我在 Prometheus 中得到了休闲错误:Error executing query: vector cannot contain metrics with the same labelset

有没有办法合并两个范围向量,或者我应该在计数器名称中包含某种标签?或者我应该有一个错误计数器,并且标签应该指定如下来源:

errors_countersource="component1", use_in_alert="yes"
errors_countersource="component2", use_in_alerts="yes"
errors_countersource="component3", use_in_alerts="no"

【问题讨论】:

【参考方案1】:

带有source="componentX" 标签的版本更适合prometheus 数据模型。这是假设 error_counter 指标确实是一个指标,并且除了 source 标签值之外,它将具有相同的标签等(例如,它由相同的库或框架发出)。

添加use_in_alerts 标签之类的东西并不是一个很好的解决方案。这样的标签不识别时间序列。 我会说在构建警报查询的地方放置一个要警报的组件列表,并动态创建单独的警报规则(不向原始数据添加此类标签)。 其他解决方案是拥有一个单独的伪指标,该指标仅用于提供有关组件的元数据,例如:

   component_alert_onsource="component2" 1

和。将其结合在警报规则中,以仅对您需要的组件发出警报。它可以以任何可能的方式生成,但一种可能性是将其添加到静态记录规则中。这具有以某种方式使警报查询复杂化的缺点。 但当然use_in_alerts 标签也可能有效(至少在您只针对此指标发出警报时)。

【讨论】:

感谢您的回答。当您说“构建警报查询并动态创建单独的警报规则”时,您的意思是有某种查询生成器可以创建 alerts.yml 文件?

以上是关于Prometheus 按标签查询范围向量的主要内容,如果未能解决你的问题,请参考以下文章

从 Prometheus 查询中的返回值生成范围向量

Prometheus 查询按特定标签随时间平均

prometheus 实践

Prometheus/PromQL/Grafana:当右侧范围向量可能不存在时的减法

Prometheus-PQL

将 MIB 变量标签连接到 Prometheus 中其他两个 MIB 变量的另一个查询结果