【问题标题】:Prometheus grab series where label matches today's date标签与今天日期匹配的 Prometheus 抓取系列
【发布时间】:2020-08-23 08:24:57
【问题描述】:

我有一个看起来像这样的系列。

events{batch=20200818-00, stage=1} 10
events{batch=20200818-10, stage=1} 10
events{batch=20200818-20, stage=1} 10
events{batch=20200818-10, stage=2}  9
events{batch=20200818-20, stage=2}  8
events{batch=20200818-30, stage=2} 10

它有一个标签batch,它由日期和小时组成。我想设置一个警报,如果 stage2 中今天的事件总数大于 stage1 则触发

如何根据 time() 过滤系列?在 Grafana 中,您可以轻松插入日期并使用正则表达式匹配标签。但是设置和警告这种情况看起来并不简单。请帮忙。

【问题讨论】:

    标签: prometheus prometheus-alertmanager promql


    【解决方案1】:

    目前在 Prometheus 中没有办法跨越标签/值。但是您在某处有一个指标,可以在标签中为您提供当天的日期,并使用它来过滤您的数据。

    使用“今天”指标

    生成它取决于您现有的组件:这可以在 node_exporter 文本文件或您每天更新的记录规则中完成:

    today{date="20200818"} 1
    

    并使用度量重新标记(在configuration 或使用label_replace()),

    label_replace(events, "date", "$1", "batch", "([0-9]+)-.*")
    

    您会获得与您的指标相关的类似标签:

    events{batch=20200818-00, date=20200818, stage=1} 10
    

    然后您可以使用以下方法过滤系列:

    label_replace(events, "date", "$1", "batch", "([0-9]+)-.*") AND ON(date) today
    

    避免重复指标

    在午夜需要考虑一个小变化:之前的 today 指标只有在 5 分钟后变为 stale 时才会消失。您可以通过生成昨天的标签但使用不同的值来解决这个问题:

    today{date="20200817"} 0
    today{date="20200818"} 1
    

    而表达式变为:

    label_replace(events, "date", "$1", "batch", "([0-9]+)-.*") AND ON(date) today == 1
    

    注意:如果您有一个指标为您提供事件的时间戳,您可以使用它来确定今天是什么(这通常是使用批处理完成的)

    【讨论】:

    • 感谢您的详细回答。我确实有另一个指标,我根据 scalar(day_of_month(vector(time())) 和 scalar(year(vector(time())) 选择了另一个指标,它得到了相同的标签,然后使用 label_join 来抓取事件。哪个有效现在还好。但是这个表达式看起来很神秘。
    猜你喜欢
    • 1970-01-01
    • 2020-03-03
    • 2014-08-11
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多