如何在Grafana中绘制每1秒事件率的max-in- h窗口?



从外部API获取的速率限制为每秒500次。我想知道随着用户基础以周为单位增长,我们离这个极限还有多远。我不需要精确的每秒速率,我需要的是1小时内最大的1秒速率。读取是突发的,所以1秒内的速率可能比1小时甚至1分钟内的平均速率要高得多。

我有一个关于读取的Prometheus计数器,可以使用这个查询:

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

这可以正确地执行max-in-window,但只能以1分钟平均速率执行,而不能以1秒速率执行。当我将结尾改为[1s]))[1h:1s])时,Grafana显示"无数据";

我想也许普罗米修斯不够快,所以我在代码中添加了一个日志,每次读取发生时,我可以使用这个查询从洛基获得日志的速率:

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

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

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的日志数?

在prometheus中,rate()函数将始终返回每秒速率。你指定的时间量只意味着"看那么多时间来计算每秒速率"。

:

rate(metric[5m])

大致意思是"取metric最近5分钟的数据,计算该时间段内metric统计的事件平均每秒率"。

普罗米修斯必须在指定的时间范围内至少有两个数据点来计算速率,所以如果metric几乎每个1m都有一个数据点,那么即使[1m]也可能太短(因为数据点接近它所看到的时间窗口的限制)。可能使用的最小时间范围应该是>3*$刮取间隔(如果你想处理随机丢失的样本-如果不是,那么>3 * scrape_interval美元)

从这里我收集到您的原始查询可能是正确的(假设您的度量每分钟有1个数据点)。

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

我不知道如何在Prometheus中解决这个任务,但它可以很容易地在VictoriaMetrics中使用rollup_rate和label_match函数解决:

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

详情请参阅本文。

相关内容

  • 没有找到相关文章

最新更新