InfluxDB v2使用Flux脚本发送Telegram消息时出现类型错误
解决InfluxDB Flux脚本调用Telegram API的类型错误问题
问题背景
尝试编写Flux脚本在InfluxDB v2中向Telegram发送消息,编写的脚本如下:
import "contrib/sranka/telegram" token = "TOKEN" lastReported = from(bucket: "system_stats") |> range(start: -1m) |> filter(fn: (r) => r["_measurement"] == "mem") |> filter(fn: (r) => r._field == "used_percent") |> last() telegram.message(token: token, channel: "xxx", text: "Test ${lastReported._value}") lastReported
执行时出现类型错误:
type error @11:68-11:80: expected {A with _value:B} but found [{C with _value:D, _time:time, _stop:time, _start:time, _measurement:string, _field:string}]
确认查询结果包含_value字段,但仍报错。
问题原因
last()函数返回的是表(记录集合/数组),即使结果只有一条记录,它依然是包含单个元素的集合类型,而非单个记录对象。直接用lastReported._value访问字段时,Flux无法从集合中提取单个记录的_value,因此抛出类型不匹配错误。
解决方案
需要先将表转换为单个记录对象,再访问_value字段,有两种常用方法:
方法1:使用findRecord提取记录
在last()之后添加findRecord,提取表中的第一个(也是唯一一个)记录:
import "contrib/sranka/telegram" token = "TOKEN" lastReported = from(bucket: "system_stats") |> range(start: -1m) |> filter(fn: (r) => r["_measurement"] == "mem") |> filter(fn: (r) => r._field == "used_percent") |> last() |> findRecord(fn: (key) => true, idx: 0) // 提取唯一记录 telegram.message(token: token, channel: "xxx", text: "Test ${lastReported._value}") lastReported
方法2:使用tableFind + getRecord提取记录
先获取结果表,再通过tableFind定位表,最后用getRecord提取记录:
import "contrib/sranka/telegram" token = "TOKEN" lastReportedTable = from(bucket: "system_stats") |> range(start: -1m) |> filter(fn: (r) => r["_measurement"] == "mem") |> filter(fn: (r) => r._field == "used_percent") |> last() // 从表中提取单个记录 lastReported = lastReportedTable |> tableFind(fn: (key) => true) |> getRecord(idx: 0) telegram.message(token: token, channel: "xxx", text: "Test ${lastReported._value}") lastReportedTable
两种方法都能将集合类型的表转换为单个记录对象,从而正确访问_value字段,解决类型错误问题。
内容的提问来源于stack exchange,提问作者Andrey Khataev
相关产品推荐
相关产品推荐

