InfluxDB任务更新失败:如何将查询首个值888设为ref?
解决InfluxDB任务脚本错误:提取首个值赋值给变量
在InfluxDB中更新任务时遇到错误:Failed to update task : Invalid flux script,目标是把查询结果里的首个值888赋值给ref变量,原脚本如下:
import "influxdata/influxdb/monitor" import "influxdata/influxdb/v1" option task = {name: "Demo3 Grocery Task", every: 1m, offset: 0s} data = from(bucket: "demo3") |> range(start: 0) |> filter(fn: (r) => r["_measurement"] == "may") |> filter(fn: (r) => r["_field"] == "order_original_billing_amount") |> group(columns: ["marketplace_id"], mode: "by") |> filter(fn: (r) => r.marketplace_id == "GROCERY") |> aggregateWindow(every: 1d, fn: count, createEmpty: false) // Extracting _value from data directly reference = data |> first(column: "_value") ref= reference._value check = { _check_id: "Demo3 Check", _check_name: "Demo3 Grocery Count Check per day", _type: "threshold", tags: {}, } // Define crit and ok functions based on ref crit = (r) => r._value > ref ok = (r) => r._value <= ref // Define messageFn to format the message messageFn = (r) => "Check: ${r._check_name} is: ${r._level} at ${r._time} with value=${r._value}" // Monitor check based on crit, ok, and messageFn data |> v1["fieldsAsCols"]() |> monitor["check"](data: check, messageFn: messageFn, crit: crit, ok: ok)
查询返回的数据:
| table | _value | _time | marketplace_id |
|---|---|---|---|
| 0 | 888 | 2024-05-02T00:00:00Z | GROCERY |
| 0 | 830 | 2024-05-03T00:00:00Z | GROCERY |
| 0 | 744 | 2024-05-04T00:00:00Z | GROCERY |
| 0 | 600 | 2024-05-04T00:00:00Z | GROCERY |
错误原因
原脚本中reference = data |> first(column: "_value")得到的是Flux表对象,不是单个数值,直接用reference._value无法正确提取值,这导致脚本无效。
修正方法
需要从表对象中提取具体的记录,再获取_value字段,推荐用findRecord函数实现:
关键修正代码
把原脚本中ref= reference._value替换为:
// 从reference表中提取第一条记录,再获取_value字段 ref = reference |> findRecord(fn: (key) => true, idx: 0)._value
完整修正后的脚本
import "influxdata/influxdb/monitor" import "influxdata/influxdb/v1" option task = {name: "Demo3 Grocery Task", every: 1m, offset: 0s} data = from(bucket: "demo3") |> range(start: 0) |> filter(fn: (r) => r["_measurement"] == "may") |> filter(fn: (r) => r["_field"] == "order_original_billing_amount") |> group(columns: ["marketplace_id"], mode: "by") |> filter(fn: (r) => r.marketplace_id == "GROCERY") |> aggregateWindow(every: 1d, fn: count, createEmpty: false) // 提取首个值对应的记录 reference = data |> first(column: "_value") // 从记录中获取具体的_value数值 ref = reference |> findRecord(fn: (key) => true, idx: 0)._value check = { _check_id: "Demo3 Check", _check_name: "Demo3 Grocery Count Check per day", _type: "threshold", tags: {}, } // Define crit and ok functions based on ref crit = (r) => r._value > ref ok = (r) => r._value <= ref // Define messageFn to format the message messageFn = (r) => "Check: ${r._check_name} is: ${r._level} at ${r._time} with value=${r._value}" // Monitor check based on crit, ok, and messageFn data |> v1["fieldsAsCols"]() |> monitor["check"](data: check, messageFn: messageFn, crit: crit, ok: ok)
验证说明
修正后ref会被正确赋值为查询结果的首个值888,脚本可以正常通过任务更新,不会再触发无效脚本的错误。
内容的提问来源于stack exchange,提问作者Nisrayani Raj
相关产品推荐
相关产品推荐

