【问题标题】: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。

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

【问题讨论】:

    标签: prometheus


    【解决方案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
    

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

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

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

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

    【讨论】:

    【解决方案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])
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-15
      • 2022-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多