You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在InfluxDB 2.x中用Flux计算Glances导出的网络传输速率

解决Glances+InfluxDB中Flux查询网络传输速率的问题

Glances写入InfluxDB的rx、tx字段是累计字节数,不是实时传输速率——直接取均值得到的是累计值的平均,完全不符合每秒速率的需求。你需要计算相邻数据点的差值除以时间间隔,才能得到真实的传输速率。

下面是修正后的Flux查询,每一步都做了注释说明:

from(bucket: "glances_fibdonas")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "network")
  |> filter(fn: (r) => r["_field"] == "rx" or r["_field"] == "tx")
  |> filter(fn: (r) => r["hostname"] == "FibdoNAS")
  |> filter(fn: (r) => r["interface_name"] == "eth0")
  // 按时间排序,确保差值计算的顺序正确(避免数据乱序导致错误)
  |> sort(columns: ["_time"])
  // 计算相邻数据点的rx/tx差值,得到两次采样之间传输的总字节数
  |> difference(columns: ["_value"])
  // 计算相邻数据点的时间间隔,结果存到interval字段,单位为秒
  |> elapsed(unit: 1s, columnName: "interval")
  // 计算每秒字节数;如果需要比特/秒,就把公式改成 (r._value / r.interval) * 8
  |> map(fn: (r) => ({
      r with
      _value: r._value / r.interval,
      _field: "${r._field}_bps" // 重命名字段,方便区分原始累计值和速率值
  }))
  // 过滤掉可能出现的负值(比如系统重启后累计值重置导致的差值为负)
  |> filter(fn: (r) => r._value >= 0)
  // 按窗口聚合均值,保持你原有的可视化逻辑
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> yield(name: "rate")

关键步骤说明:

  1. sort():必须确保数据按时间升序排列,否则差值计算会完全错乱。
  2. difference():拿到两次采样之间的总传输字节数(比如这次rx是2056872,上次是0,差值就是2056872)。
  3. elapsed():拿到两次采样的时间间隔(比如20.31秒),结果存到interval字段里。
  4. map():用总字节数除以时间间隔,得到每秒传输的字节数;如果需要比特/秒,乘以8即可。
  5. 负值过滤:如果系统重启,网卡累计值会重置为0,这时候差值会变成负数,需要过滤掉避免影响可视化。

内容的提问来源于stack exchange,提问作者Fibdorius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:25:19