正则表达式对系列的普罗米修斯率

sim*_*mao 8 prometheus

我正在使用以下查询根据名称获取一些指标:

{__name__=~"bus_listener.+_processed"}
Run Code Online (Sandbox Code Playgroud)

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

我正在尝试计算一个比率,使用:

rate({__name__=~"bus_listener.+_processed"}[5m])
Run Code Online (Sandbox Code Playgroud)

但这给了我以下错误:

vector cannot contain metrics with the same labelset
Run Code Online (Sandbox Code Playgroud)

我不能使用记录指标,我只能访问 grafana,它从普罗米修斯读取指标。

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

Ali*_*ean 14

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

bus_listener_foo_processed{job="a_job"} 1
bus_listener_bar_processed{job="a_job"} 2
Run Code Online (Sandbox Code Playgroud)

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

{job="a_job"} 0.1
{job="a_job"} 0.2
Run Code Online (Sandbox Code Playgroud)

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

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

(可选地替换1m为接近您的抓取间隔的内容,因此尽可能少地出现混叠。)

但理想情况下,如果您确实有权访问 Prometheus 配置(这似乎不太可能,因为您说您不能使用记录规则)您应该在摄取时使用度量重新标记来将度量名称的各个位提取到单独的标签,因此您以后不必跳过箍。或者让导出原始指标的服务使用标签,而不是将它们连接到指标名称中。

  • 该名称被删除是因为在应用操作后它很可能在语义上不正确。(例如,如果仍称为“up”,“up + 1”的结果意味着什么?)至于为什么相同的标签集是一个问题,Prometheus 期望任何一个指标只有一个实例。相同的标签集意味着相同的指标,因此同一指标的两个实例。请参阅 https://prometheus.io/docs/prometheus/latest/querying/operators/ 、 https://github.com/prometheus/prometheus/issues/380 和 https://github.com/prometheus/prometheus/issues/ 5757了解详情。 (2认同)

bja*_*ski 3

据我所知,您有多个报告 _processed 指标的“bus_listeners”。最好的方法是让此类指标符合 Prometheus 数据模型,并将 Bus_listener 作为指标中的标签,而不是将其嵌入指标名称中。这需要更改发出这些指标的应用程序。

如果修改应用程序不可行,那么您可以使用记录规则创建符合要求的新指标。

如果您创建类似于以下内容的记录规则:

 - record: processed_count
   expr: label_replace({__name__=~"bus_listener.+_processed", "bus_listener", "$1", "__name__", "bus_listener(.+)_processed")
Run Code Online (Sandbox Code Playgroud)

然后你就可以查询新的指标了:

  rate(processed_count[5m])
Run Code Online (Sandbox Code Playgroud)

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