如何创建InfluxDB v2图表展示计数器的周期增量值?
在InfluxDB v2中展示SNMP计数器的周期增量值
核心思路
用InfluxDB的Flux查询语言计算相邻数据点的差值,再按需按时间窗口聚合,就能得到你要的周期增量,而非累计值。
1. 基础增量查询(单数据点差值)
直接计算每个数据点与前一个点的差值,对应你要的current_value - last_value:
from(bucket: "你的桶名称") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == "snmp" and r._field == "udpInDatagrams") |> sort(columns: ["_time"], desc: false) // 必须按时间正序排列 |> difference(columns: ["_value"], keepFirst: false) // 计算差值,去掉第一个无前置的点
把你的桶名称换成实际的InfluxDB桶名,执行后就能看到每个周期的增量值。
2. 按指定时间窗口聚合增量(10秒/1分钟/5分钟)
如果需要统计固定时间窗口内的总增量(比如每10秒的总UDP入包数),加上aggregateWindow函数:
from(bucket: "你的桶名称") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == "snmp" and r._field == "udpInDatagrams") |> sort(columns: ["_time"], desc: false) |> difference(columns: ["_value"], keepFirst: false) |> aggregateWindow(every: 10s, fn: sum, createEmpty: false) // 按10秒窗口求和
- 把
every: 10s改成1m就是1分钟窗口,5m就是5分钟窗口 fn: sum表示统计窗口内的总增量,也可以根据需求换成mean(平均值)等
3. 处理SNMP计数器回绕(可选)
SNMP计数器是32位或64位的,达到最大值后会归零(回绕),直接用difference会得到负数,需要修正:
from(bucket: "你的桶名称") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == "snmp" and r._field == "udpInDatagrams") |> sort(columns: ["_time"], desc: false) // 跟踪上一个数据点的值 |> stateTracking(fn: (r, state) => ({ value: r._value, prevValue: if state.prevValue == null then r._value else state.prevValue }), initial: {prevValue: null}) // 处理回绕:如果当前值小于前一个,说明回绕了,加上计数器最大值再计算差值 |> map(fn: (r) => ({ r with _value: if r._value < r.prevValue then (r._value + 4294967296) - r.prevValue else r._value - r.prevValue })) |> filter(fn: (r) => r.prevValue != r._value) // 去掉初始无变化的无效点
- 32位计数器最大值是
4294967296,64位的话换成18446744073709551616
4. 创建图表
- 打开InfluxDB UI的Data Explorer
- 粘贴上面的Flux查询,替换桶名和字段名
- 选择合适的图表类型(折线图、柱状图都可以)
- 调整时间范围、窗口参数,预览没问题后,点击Save As添加到仪表板
内容的提问来源于stack exchange,提问作者Trevor Sullivan
相关产品推荐
相关产品推荐

