使用GROUP BY TIME时InfluxDB查询无法正确计算跨数据总和
解决InfluxDB v1.8分片总大小聚合异常的问题
你遇到的问题核心是聚合顺序搞反了:直接用sum(diskBytes)配合大时间窗口分组时,InfluxDB会把窗口内所有shard的所有diskBytes记录全部累加,而不是先计算每个时间点的总分片大小,再对这些总大小做窗口聚合。
正确的做法是用子查询分层聚合:
- 先在子查询里,按原始数据的采集间隔(10秒)分组,计算每个时间点所有shard的
diskBytes总和,得到该时刻的总分片大小; - 再在外层查询里,按你需要的大时间间隔(比如10分钟)分组,对这些总大小取首个值或平均值。
取每个10分钟窗口的首个总大小
SELECT first(total_disk_bytes) FROM ( -- 子查询:计算每个10秒时间点的所有分片总大小 SELECT sum(diskBytes) AS total_disk_bytes FROM "shard" WHERE "database"='_internal' AND time > t1 AND time < t2 GROUP BY time(10s) ) GROUP BY time(10m)
取每个10分钟窗口的平均总大小
如果需要的是窗口内的平均值,把first换成mean即可:
SELECT mean(total_disk_bytes) FROM ( SELECT sum(diskBytes) AS total_disk_bytes FROM "shard" WHERE "database"='_internal' AND time > t1 AND time < t2 GROUP BY time(10s) ) GROUP BY time(10m)
为什么之前的小时间间隔查询正常?
当分组间隔小于10秒(比如5秒)时,每个窗口内最多只有一组同时间点的shard数据,此时sum(diskBytes)自然就是该时间点的总大小,看起来结果正常。但当窗口变大后,窗口内包含多个时间点的shard数据,直接求和就会把所有时间点的所有shard值全部累加,导致结果不符合预期。
内容的提问来源于stack exchange,提问作者teeeeee
相关产品推荐
相关产品推荐

