从外部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",
)
详情请参阅本文。