正则表达式对系列的普罗米修斯率
Posted
技术标签:
【中文标题】正则表达式对系列的普罗米修斯率【英文标题】:prometheus rate on series by regex 【发布时间】:2020-01-07 08:38:13 【问题描述】:我正在使用以下查询根据名称获取一些指标:
__name__=~"bus_listener.+_processed"
有多个指标与此名称匹配,并且多个应用正在发布这些指标。
我正在尝试计算一个费率,用:
rate(__name__=~"bus_listener.+_processed"[5m])
但这给了我以下错误:
vector cannot contain metrics with the same labelset
我不能使用记录指标,我只能访问从 prometheus 读取指标的 grafana。
如何使用正则表达式获得此费率?
【问题讨论】:
【参考方案1】:听起来您有多个具有相同标签的指标(__name__
除外)。 rate()
保留除 __name__
之外的所有标签,但它会删除 __name__
以避免任何混淆。这意味着如果您有两个时间序列,例如:
bus_listener_foo_processedjob="a_job" 1
bus_listener_bar_processedjob="a_job" 2
将它们通过rate()
将导致两个时间序列都具有相同的标签集:
job="a_job" 0.1
job="a_job" 0.2
理论上,您可以通过首先使用label_replace()
并在其结果上应用rate()
来将__name__
标签复制为其他标签,从而为每个原始时间序列生成不同的标签集。但是,由于您只能直接在时间序列上计算 rate()
(而不是另一个函数的输出),因此您只能使用 subqueries 来执行此操作,这既是重量级的,又比其他情况下要慢:
rate(label_replace(__name__=~"bus_listener.+_processed", "old_name", "$1", "__name__", "(.+)")[5m:1m])
(可选地将1m
替换为接近您的抓取间隔的内容,因此尽可能少地发生混叠。)
但理想情况下,如果您确实可以访问 Prometheus 配置(这似乎不太可能,因为您说您不能使用记录规则),您应该在摄取时使用指标重新标记来提取指标的各个位命名为单独的标签,这样您以后就不必费劲了。或者让导出原始指标的服务使用标签,而不是将它们连接到指标名称中。
【讨论】:
感谢您的回答。您是否有关于为什么删除 name 以及为什么相同的标签集是一个问题的参考资料? 该名称已被删除,因为它在应用操作后很可能在语义上不正确。 (例如,如果up + 1
仍然被称为up
,结果会是什么意思?)至于为什么相同的标签集是一个问题,Prometheus 期望任何一个指标只有一个实例。相同的标签集意味着相同的指标,因此相同指标的两个实例。有关详细信息,请参阅prometheus.io/docs/prometheus/latest/querying/operators、github.com/prometheus/prometheus/issues/380 和 github.com/prometheus/prometheus/issues/5757。【参考方案2】:
我了解到您有多个报告 _processed 指标的“bus_listeners”。 最好的方法是让此类指标符合 Prometheus 数据模型,并将 bus_listener 作为指标中的标签,而不是将其嵌入指标名称中。这将需要更改发出这些指标的应用程序。
如果修改应用程序不可行,那么您可以使用记录规则创建符合要求的新指标。
如果您创建类似于以下内容的录制规则:
- record: processed_count
expr: label_replace(__name__=~"bus_listener.+_processed", "bus_listener", "$1", "__name__", "bus_listener(.+)_processed")
那么你就可以查询新的指标了:
rate(processed_count[5m])
由于您没有提供准确的指标名称,此规则可能需要进行一些调整
【讨论】:
以上是关于正则表达式对系列的普罗米修斯率的主要内容,如果未能解决你的问题,请参考以下文章