如何在Grafana中绘制1小时窗口内1秒级请求速率的最大值
解决方案
Prometheus获取1秒级速率方案
你遇到的[1s]窗口查询无数据的核心原因是:rate()函数的计算窗口必须大于等于Prometheus对该指标的抓取间隔,默认Prometheus抓取间隔通常为15s/30s,1s窗口内没有足够样本支撑计算,因此返回无数据。
可行配置步骤:
- 调整对应指标的抓取job配置,将
scrape_interval设置为1s,该操作会增加Prometheus写入负载,指标基数不高的场景可直接使用 - 配置Recording Rule预计算指标,避免实时查询的性能损耗,示例规则如下:
groups: - name: fetches_rate_record rules: # 预计算1秒级请求速率 - record: fetches_counter:rate_1s expr: sum(rate(fetches_counter_total{namespace="$namespace"}[1s])) # 预计算1小时窗口内的最大1秒速率 - record: fetches_counter:rate_1s_max_1h expr: max_over_time(fetches_counter:rate_1s[1h])
后续直接查询fetches_counter:rate_1s_max_1h即可快速获取周粒度的每小时最大1秒速率,完全满足你的监控需求。
Loki实现日志数量max_over_time方案
你遇到的语法报错是因为Loki要求嵌套聚合时,内层聚合必须作为子查询用括号包裹,调整后的正确查询语句如下:max_over_time((sum(count_over_time({namespace="$namespace"} |= "Fetch happened log text" [1s])))[5m:1s])
查询大范围周期时数据点少、每次返回结果不同的原因是Loki默认对大范围查询做了采样限制,避免查询压力过高,你可以通过两种方式解决:
- 调整Grafana Loki数据源的最大查询步长/采样参数,关闭大范围查询的自动采样
- 配置Loki Ruler预计算每秒的日志计数,将结果作为指标写入Prometheus,后续直接通过Prometheus查询最大值即可
另外unwrap语法用于提取日志内容中的数值字段做聚合计算,你当前仅需统计日志行数,无需使用该语法。
内容的提问来源于stack exchange,提问作者Alexander Tarnavsky
相关产品推荐
相关产品推荐

