在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")
关键步骤说明:
sort():必须确保数据按时间升序排列,否则差值计算会完全错乱。difference():拿到两次采样之间的总传输字节数(比如这次rx是2056872,上次是0,差值就是2056872)。elapsed():拿到两次采样的时间间隔(比如20.31秒),结果存到interval字段里。map():用总字节数除以时间间隔,得到每秒传输的字节数;如果需要比特/秒,乘以8即可。- 负值过滤:如果系统重启,网卡累计值会重置为0,这时候差值会变成负数,需要过滤掉避免影响可视化。
内容的提问来源于stack exchange,提问作者Fibdorius
相关产品推荐
相关产品推荐

