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 按标签查询范围向量的主要内容,如果未能解决你的问题,请参考以下文章