正则表达式上的普罗米修斯率

时间:2019-09-04 12:40:10

标签: prometheus

我正在使用以下查询来基于名称获取一些指标:

{__name__=~"bus_listener.+_processed"}

有多个与此名称匹配的指标,并且有多个应用正在发布这些指标。

我正在尝试使用以下方法计算费率:

rate({__name__=~"bus_listener.+_processed"}[5m])

但这给了我以下错误:

vector cannot contain metrics with the same labelset

我无法使用记录指标,我只能访问grafana,后者从prometheus读取指标。

我如何使用正则表达式获得此汇率?

2 个答案:

答案 0 :(得分:1)

我了解您有多个“ 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])

由于您未提供确切的指标名称,因此该规则可能需要进行一些调整

答案 1 :(得分:1)

听起来像您有多个带有相同标签的指标(__name__除外)。 rate()保留除__name__以外的所有标签,但它会丢弃__name__以避免混淆。这意味着如果您有两个时间序列,例如:

bus_listener_foo_processed{job="a_job"} 1
bus_listener_bar_processed{job="a_job"} 2

将它们放入rate()会导致两个时间序列都具有相同的标签集:

{job="a_job"} 0.1
{job="a_job"} 0.2

理论上,您可以通过首先使用__name__并将label_replace()应用于结果来将rate()标签复制为其他标签,从而为每个原始时间序列生成不同的标签集。但是,由于您只能直接在时间序列上计算rate()(而不能计算另一个函数的输出),因此只能使用subqueries来执行此操作,它既笨重又慢于其他方式:< / p>

rate(label_replace({__name__=~"bus_listener.+_processed"}, "old_name", "$1", "__name__", "(.+)")[5m:1m])

((可选用接近您的抓取时间间隔的值替换1m,这样就尽可能减少了混淆现象。)

但是,理想情况下,如果您确实可以访问Prometheus配置(这似乎不太可能,因为您说不能使用记录规则),则应在摄取时使用指标重新标记以提取指标的各个位将其命名为单独的标签,这样您以后就不必再跳了。或者让导出原始指标的服务使用标签,而不是将它们串联到指标名称中。