You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Grafana中指定每日特定时间采集Prometheus日度统计指标?

解决Prometheus每日固定时间点采样的问题

嘿,这个需求我之前做业务监控的时候刚好碰到过,咱们一步步来拆解解决:

首先得明确:你之前用的min_step=24h其实是控制Prometheus查询时的最小采样间隔,它并不会直接指定采样的具体时间点——你看到的20:00采样,是因为你的相对时间范围(7d)是从当前时间往前推7天,采样点会从这个起始时间开始按24h递增,刚好落在了20:00而已。

要实现每日23:50-23:59之间固定采样,有两种靠谱的方案:

方案一:用Prometheus 2.40+的align()函数(推荐)

Prometheus 2.40版本新增了align()函数,专门用来将时间序列对齐到指定的时间点,完美匹配你的需求。

具体PromQL查询

align(24h, 86100) max_over_time(table_row_count[10m]) by (table)

拆解说明:

  • align(24h, 86100):第一个参数是对齐周期(24h),第二个参数是每日0点到目标采样点的秒数偏移。23:55对应的秒数是23*3600 + 55*60 = 86100,这样采样点就会固定在每天的23:55(刚好覆盖你要的23:50-23:59区间)。
  • max_over_time(table_row_count[10m]):因为你的指标是每隔几分钟推送一次,用10分钟的时间范围取最大值(也可以用last或avg,看你需要的是最后一次推送值还是区间内的统计值),确保能拿到23:50-23:59之间的有效样本。
  • 不需要再设置min_step了,align()已经帮你指定了采样时间点和间隔。

方案二:适配低版本Prometheus(2.40以下)

如果你的Prometheus版本还没升级到2.40,可以通过时间戳计算来匹配目标时间点的样本:

具体PromQL查询

max by (table) (
  table_row_count
  and on() group_left
  vector(floor(time() / 86400) * 86400 + 86100)
)

拆解说明:

  • floor(time() / 86400) * 86400:计算当天0点的时间戳。
  • + 86100:加上23:55对应的秒数,得到当天23:55的时间戳。
  • vector(...):把这个时间戳转换成一个无标签的向量,然后用and on() group_left匹配最近的table_row_count样本,相当于拿到23:55附近的指标值。
  • 如果你想覆盖23:50-23:59的区间,可以结合max_over_time调整为:
max by (table) (
  max_over_time(table_row_count[10m])
  and on() group_left
  vector(floor(time() / 86400) * 86400 + 86100)
)

额外注意事项

  • 如果你用的是Grafana,设置相对时间范围为7d时,上述查询会自动返回最近7天每天23:55的采样值,刚好符合你要的周度视图。
  • 确保你的指标在每日23:50-23:59之间有正常推送的样本,否则max_over_time会返回空值(可以考虑用or vector(0)兜底)。

内容的提问来源于stack exchange,提问作者py_guy_5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:50:44