1

我们从外部 API 获取的速率限制为每秒 500 次。我想跟踪随着用户群以周为单位增长,我们离这个限制有多近。我不需要每秒的准确速率,我需要 1 小时窗口内的最大 1 秒速率。提取是突发的,因此超过 1 秒的速率可能远高于 1 小时甚至 1 分钟的平均速率。

我在 fetches 上有一个 Prometheus 计数器,可以使用这个查询:

max_over_time(sum(rate(fetches_counter_total{namespace="$namespace"}[1m]))[1h:1m])

这会正确执行最大窗口,但仅适用于 1 分钟平均速率而不是 1 秒速率。当我将结尾更改为[1s]))[1h:1s])Grafana 时说“没有数据”并且没有显示任何情节。

我认为可能是 Prometheus 不够快,所以我在代码中添加了一个日志,每次提取发生时,我可以使用以下查询从 Loki 获取日志速率:

sum(count_over_time({namespace="$namespace"} |= "Fetch happened log text" [1s]))

这准确地给出了 1 秒的速率,但是当我将范围设置为一周时,点数比一周内的秒数少得多,并且每次刷新都会显示不同的点子集。为了获得最大窗口,我尝试了这个查询:

max_over_time(sum(count_over_time({namespace="$namespace"} |= "Fetch happened log text" [1s]))[5m:1s])

但它会抛出一个错误: parse error at line 1, col 15: syntax error: unexpected SUM, expecting NUMBER or { or (

现在我被困住了。从文档看来,unwrap记录日志可能会有所帮助,但我没有任何标签,也不知道如何应用于unwrap这种情况。

总之,是否有可能从 Prometheus 获得 1 秒速率或从 Loki 获得日志数量的 max_over_time?

4

2 回答 2

0

在 prometheusrate()函数中总是会返回每秒的速率。您指定的时间量仅意味着“查看那么多时间来计算每秒速率”。

所以:

   rate(metric[5m])

大致意思是“获取最后 5 分钟的数据并计算在该时间范围内metric计数的事件的平均每秒速率”。metric

Prometheus 必须在此处指定的时间范围内至少有两个数据点才能计算速率,因此如果metric大致每隔一个数据点1m甚至[1m]可能太短(因为数据点接近它查看的时间窗口的限制) . 可能使用的最小时间范围应该是 > 3*$scrape_interval (如果你想处理随机丢失的样本 - 如果不是那么 > 3*$scrape_interval )

据此,我认为您的原始查询可能是正确的(假设您的指标中每分钟有 >1 个数据点)。

如果您对该数据的抓取间隔小于 1 秒,那么这对于 Prometheus 来说是相当不寻常的,我认为它不会很好地工作。查看您拥有数据点的频率并相应地调整使用的时间范围。

于 2021-10-24T16:16:30.990 回答
-1

我不知道如何解决 Prometheus 中的任务,但可以在 VictoriaMetrics 中使用rollup_ratelabel_match函数轻松解决:

label_match(
  rollup_rate(fetches_counter_total[1h]),
  "rollup",
  "max",
)

有关更多详细信息,请参阅本文

于 2021-10-25T14:55:43.330 回答