VictoriaMetrics query_range中avg_over_time窗口时间范围疑问
VictoriaMetrics范围查询结果的时间窗口含义疑问
我通过Java以HTTP方式执行了以下VictoriaMetrics范围查询:
http://localhost:8400/select/0/prometheus/api/v1/query_range?query=avg_over_time(numeric{bom_id = "id1", entry_id = "id2"}) or vector(0)&start=1640995200&end=1735689599&step=31536000s
查询的start为2022年1月1日,end为2024年12月31日,step为365天,目的是计算2022年起的年度平均值。但返回结果包含四个时间戳:
[ [ 1640995200, //Jan1st 2022 "15.1" ], [ 1672531200,// Jan1st 2023 "12.1" ], [ 1704067200, // Jan1st, 2024 "10.8" ], [ 1735603200, // Dec 31st, 2024 12 AM "11.8" ] ]
我的疑问是:时间戳1640995200(2022年1月1日)对应的返回值,代表的是2022年1月1日至12月31日的平均值,还是过去365天(2021年1月2日至12月31日)的平均值?
回答
时间戳1640995200对应的返回值,是从该时间戳往前推365天(即2021年1月1日到2022年1月1日)的数值平均值,核心逻辑如下:
- 在兼容PromQL的VictoriaMetrics中,
query_range查询里的avg_over_time这类范围函数,计算规则是:每个输出时间戳T对应的统计窗口是[T - step, T),也就是从T往前推一个step长度的区间到T本身(不含T点)。 - 你的查询
step设为365天(31536000秒),所以第一个时间戳1640995200(2022-01-01 00:00:00)对应的计算区间是1640995200 - 31536000 = 1609459200(2021-01-01 00:00:00)到1640995200,覆盖的是2021全年到2022年元旦前的所有样本数据。
如果要获取2022年全年(2022-01-01至2022-12-31)的平均值,需要调整查询逻辑:
- 把输出时间戳对齐到年度结束时间,比如将
start设为2023年1月1日,step保持365天,此时第一个时间戳对应的窗口就是2022全年; - 或者使用偏移量调整窗口,示例查询:
avg_over_time(numeric{bom_id="id1", entry_id="id2"}[1y]) offset 1y
内容的提问来源于stack exchange,提问作者underachiever
相关产品推荐
相关产品推荐

