内置定时任务做什么
InfluxDB 2.x 的 Task 是内置的定时 Flux 任务:用 option task 声明名称、周期与偏移,每次执行读取上一个窗口的数据,聚合后写入低精度 bucket。它是官方推荐的降采样方式,不需要额外部署定时脚本与调度器。
窗口与幂等性
任务每次只处理一个周期的窗口,写入时保留原测量与标签,同一时间点重复执行会覆盖成相同内容,所以重跑是幂等的。但任务停摆期间的历史窗口不会自动补算,恢复后低精度数据会留下缺口,需要时得手工回填。
基本信息
| 声明 | option task = {name: "cpu-downsample", every: 1h, offset: 5m} |
|---|---|
| 聚合 | aggregateWindow(every: 1h, fn: mean, createEmpty: false) |
| 写出 | to(bucket: "downsampled", org: "my-org") |
| 管理 | influx task create / list / run,执行记录用 influx task log 查看 |
| 适用版本 | InfluxDB 2.x |
示例
示例
option task = {name: "cpu-downsample", every: 1h, offset: 5m}
from(bucket: "metrics")
|> range(start: -task.every)
|> filter(fn: (r) => r._measurement == "cpu")
|> aggregateWindow(every: 1h, fn: mean, createEmpty: false)
|> to(bucket: "downsampled", org: "my-org")
// 只保留需要的列,避免把无用字段一起放大到低精度 bucket
// |> keep(columns: ["_time", "_measurement", "_field", "_value", "host"])典型使用场景
- 降低高精度数据的保留压力:原始数据短期保留,降采样长期保存
- 加速长周期看板:查询低精度数据而不是扫描全部原始点
- 跨 bucket 归档:把小时聚合结果写进长期 bucket
- 指标预计算:把均值、最大值等常用聚合提前算好
- 采集与查询解耦:写入高峰与看板查询互不影响
要素与注意
| 要素 | 作用 | 注意 |
|---|---|---|
| option task | 声明任务名与周期 | 名称重复会创建失败 |
| every | 执行周期 | 与聚合窗口保持一致 |
| offset | 相对周期起点的偏移 | 等上游数据落盘后再执行 |
| range(start: -task.every) | 处理窗口 | 只看过去一个周期,缺口不自动补 |
| aggregateWindow | 窗口聚合 | createEmpty: false 跳过空窗口 |
写入降采样 bucket 的结果保留原测量与标签,同一时间点重复执行得到相同内容,任务重跑是幂等的,不必担心重复写导致数据翻倍。
任务停摆期间的历史窗口不会自动补算,恢复后低精度数据会留下缺口;需要时用同样的聚合逻辑手工回填对应的 range,并核对补算结果与实时任务输出是否一致。
offset 的作用是让任务在上游数据落盘之后再执行:采集器与任务周期相近且不留偏移时,最后一个窗口的数据可能还没写完就被聚合,低精度结果会系统性偏低。