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

标签 prometheus

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

{__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/

相关文章:

go - 如何解析Prometheus数据

unix - 密码保护普罗米修斯访问

java - 如何在 Grafana 中创建健康检查?

docker - Prometheus查询以监视按名称和图像过滤的Docker容器

aggregation - 如何聚合普罗米修斯指标

docker - 在 docker 中实时重新加载 Prometheus 配置(-compose)

javascript - 动态创建 Prometheus 仪表名称

kubernetes - 使用 Prometheus 获取总磁盘空间和可用磁盘空间

c# - 在 ASP.NET Core MVC 中使用 Prometheus 的示例项目?

api - 有没有办法以编程方式添加 Prometheus 监控目标和警报