InfluxDB查询:统计各机器最新状态的激活机器总数
解决方案:InfluxDB Flux 查询实现机器可用性统计
基础查询(实时获取当前在用机器总数)
以下是满足你三个需求的完整Flux查询,针对实时获取最新状态的机器总数场景:
// 替换为你的实际bucket名称 option v = {bucket: "your_bucket_name"} from(bucket: v.bucket) // 时间范围:取最近1天的数据,可根据数据写入频率调整(比如-1m表示最近1分钟) |> range(start: -1d) // 过滤目标测量表和字段 |> filter(fn: (r) => r._measurement == "machines_a_laver" and r._field == "status") // 按机器ID分组,确保每个机器单独处理 |> group(columns: ["machine_id"]) // 取每台机器的最新状态记录(需求1) |> last() // 将状态转换为数值:ACTIVATED=1,DEACTIVATED=0(需求2) |> map(fn: (r) => ({ r with _value: if r._value == "ACTIVATED" then 1 else 0 })) // 取消分组,准备全局求和 |> group() // 求和得到当前在用机器总数(需求3) |> sum(column: "_value")
时间序列聚合查询(按时间点统计,适合制作图表)
如果需要生成类似「下午4点10台、晚上7点0台」的时间序列数据(用于可用性图表),可以加上时间窗口聚合:
option v = {bucket: "your_bucket_name"} from(bucket: v.bucket) |> range(start: -7d) // 取最近7天数据,按需调整 |> filter(fn: (r) => r._measurement == "machines_a_laver" and r._field == "status") // 按1小时窗口聚合,可修改every参数调整粒度(比如10m=10分钟) |> aggregateWindow( every: 1h, fn: (tables=<-) => tables |> group(columns: ["machine_id"]) |> last() // 取窗口内每台机器的最新状态 |> map(fn: (r) => ({r with _value: if r._value == "ACTIVATED" then 1 else 0})) |> group() |> sum(column: "_value"), createEmpty: false // 忽略无数据的窗口 )
关键步骤说明
- 获取最新状态:通过
group(columns: ["machine_id"])按机器分组后,last()函数会提取每个机器的最新状态记录,确保统计的是当前最新状态而非历史数据。 - 状态数值转换:使用
map函数的条件判断,将字符串状态转为可计算的数值,为后续求和做准备。 - 求和统计总数:取消分组后,
sum(column: "_value")会对所有机器的数值状态进行汇总,得到在用机器的总数量。
内容的提问来源于stack exchange,提问作者Androz2091
相关产品推荐
相关产品推荐

