我正在使用以下查询根据名称获取一些指标:
{__name__=~"bus_listener.+_processed"}
有多个指标与此名称匹配,并且多个应用程序正在发布这些指标。
我正在尝试计算一个比率,使用:
rate({__name__=~"bus_listener.+_processed"}[5m])
但这给了我以下错误:
vector cannot contain metrics with the same labelset
我不能使用记录指标,我只能访问 grafana,它从普罗米修斯读取指标。
如何使用正则表达式获得此费率?
最佳答案
听起来您有多个具有相同标签的指标(除了 __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 来执行此操作,这既是重量级的,又比其他方式慢:rate(label_replace({__name__=~"bus_listener.+_processed"}, "old_name", "$1", "__name__", "(.+)")[5m:1m])
(可选地将
1m
替换为接近您的抓取间隔的内容,以便尽可能减少混叠。)但理想情况下,如果您确实有权访问 Prometheus 配置(这似乎不太可能,因为您说您不能使用记录规则)您应该在摄取时使用度量重新标记来将度量名称的各个位提取到单独的标签,因此您以后不必跳过箍。或者让导出原始指标的服务使用标签,而不是将它们连接到指标名称中。
关于正则表达式对系列的普罗米修斯率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57788605/