Grafana选自定义起止时间时如何计算Prometheus查询的时间间隔
你用相对时间范围时$__range会自动解析为你选择的相对时长,比如最近1小时就对应1h,所以increase(metric[$__range])可以直接取到对应区间的增量。自定义起止时间时不需要手动计算offset,Grafana的内置变量本身就可以适配这种场景,你遇到的异常大概率是配置问题而非写法逻辑错误。
方案1:直接复用内置变量,无需额外调整
Grafana的$__range变量本身兼容所有时间范围选择模式,不管是相对的「最近N分钟/小时/天」还是自定义from/to起止时间,它都会自动计算为结束时间 - 开始时间的时长,你原本的increase(metric[$__range])写法在自定义时间范围下也可以正常生效,如果查询异常可以优先排查两个点:
- 你的Prometheus指标采集间隔是否远小于所选时间区间,区间过短没有采集到对应数据会返回空值
- 检查指标是否存在标签冲突,导致指定时间范围内的时间序列出现断层
方案2:特殊场景下offset的计算方式
如果你有跨区间对比等特殊需求,确实需要手动指定offset,计算规则为offset值等于当前查询时间减去目标查询区间的结束时间,示例如下:
假设你选择的自定义时间范围是2024-05-01 00:00:00到2024-05-02 00:00:00,当前查询时间为2024-05-03 12:00:
- 先算区间时长为24h,对应区间向量范围就是
[24h] - 再算offset为当前时间减去目标区间结束时间的差值,即36h
- 最终PromQL为
increase(metric[24h] offset 36h)
在Grafana中可以用内置变量简化offset计算:
Grafana的自定义时间范围结束时间对应毫秒级时间戳变量$__to,Prometheus的time()函数返回秒级当前时间戳,offset时长可以直接写为time() - $__to / 1000,自动适配任意自定义时间范围。
假设count类型指标名为query_request_count,sum类型指标名为query_request_object_sum:
- 指定时间范围内查询次数:
increase(query_request_count[$__range]) - 指定时间范围内被查询对象总数:
increase(query_request_object_sum[$__range])
内容的提问来源于stack exchange,提问作者Kyuubi

