使用 rrdtool (和 snmp) 设置流量监控

来自 Alpine Linux

安装程序

安装 rrdtool

apk add rrdtool

创建 rrd 数据库

数据库的创建取决于您拥有多少个数据源 (DS) 以及您使用的数据源类型。
在本示例中,我们监控本地机器上的 eth0 和 eth1 (RX 和 TX),并通过 snmp 从另一台计算机获取 (eth0 和 eth1) 信息。

rrdtool create /root/exampledb.rrd \
--step 30 \
DS:pc1eth0rx:COUNTER:120:0:U \
DS:pc1eth0tx:COUNTER:120:0:U \
DS:pc1eth1rx:COUNTER:120:0:U \
DS:pc1eth1tx:COUNTER:120:0:U \
DS:pc2eth0rx:COUNTER:120:0:U \
DS:pc2eth0tx:COUNTER:120:0:U \
DS:pc2eth1rx:COUNTER:120:0:U \
DS:pc2eth1tx:COUNTER:120:0:U \
RRA:AVERAGE:0.5:1:3600 \
RRA:MAX:0.5:1:3600

这将创建一个名为 exampledb.rrd 的循环数据库 (RRD)。

  • "--step 30" 指定了将数据馈送到 RRD 的基本间隔(秒)。
  • 第一个 “DS...” 行分配了一个名称 “pc1eth0rx”。
  • “COUNTER” 用于像路由器中的 ifInOctets 计数器这样的连续递增计数器。DS 行中的其余部分,我希望稍后会回到它。
  • “RRA” 是一个循环轮询归档 (RoundRobinArchive)。它以各种方式存储来自数据源 (DS) 的信息。
  • “RRA:AVARAGE...” 将呈现一个平均值(每秒的平均值),并保留 3600 秒的值(超过 3600 秒的值将被覆盖)。
  • “RRA:MAX” 计算最大值。

收集信息并放入 RRD

收集数据可以通过各种方式和从各种系统完成。
在我们的示例中,我们从 2 台不同的计算机收集数据,我们希望监控每台计算机的 eth0 和 eth1。

向数据库馈送信息

现在我们创建一个新脚本,该脚本首先获取本地信息,然后从下一台计算机获取 snmp 信息,然后将所有信息放入数据库中。

我们将脚本命名为 /root/collect_data.sh

#!/bin/sh
while true; do
sleep 30
ETH0=$(grep eth0 /proc/net/dev)
E0DOWN=$(echo $ETH0|tr \: \ |awk '{print $2}')
E0UP=$(echo $ETH0|tr \: \ |awk '{print $10}')
ETH1=$(grep eth1 /proc/net/dev)
E1DOWN=$(echo $ETH1|tr \: \ |awk '{print $2}')
E1UP=$(echo $ETH1|tr \: \ |awk '{print $10}')
rrdupdate /root/exampledb.rrd N:\
${E0DOWN}:${E0UP}:${E1DOWN}:${E1UP}:\
`/usr/bin/snmpget -v 1 -c general -Oqv 192.168.0.2 IF-MIB::ifInOctets.2`:\
`/usr/bin/snmpget -v 1 -c general -Oqv 192.168.0.2 IF-MIB::ifOutOctets.2`:\
`/usr/bin/snmpget -v 1 -c general -Oqv 192.168.0.2 IF-MIB::ifInOctets.3`:\
`/usr/bin/snmpget -v 1 -c general -Oqv 192.168.0.2 IF-MIB::ifOutOctets.3`:\
done

为了使此操作生效,您需要在 192.168.0.2 计算机上运行配置好的 snmpd。community-name 'general' 可能因您的 snmp 配置而异。

在图表中呈现信息

现在开始有趣的部分。我们将显示收集到的信息。
信息可以通过各种方式呈现(我们将使用 LINE 图)。

rrdtool graph /root/result.png --start -1800  \
-a PNG -t "Network Interfaces" --vertical-label "bits/s" \
-w 1260 -h 800 -r \
DEF:pc1eth0rx=/root/exampledb.rrd:pc1eth0rx:AVERAGE \
DEF:pc1eth0tx=/root/exampledb.rrd:pc1eth0tx:AVERAGE \
DEF:pc1eth1rx=/root/exampledb.rrd:pc1eth1rx:AVERAGE \
DEF:pc1eth1tx=/root/exampledb.rrd:pc1eth1tx:AVERAGE \
DEF:pc2eth0rx=/root/exampledb.rrd:pc2eth0rx:AVERAGE \
DEF:pc2eth0tx=/root/exampledb.rrd:pc2eth0tx:AVERAGE \
DEF:pc2eth1rx=/root/exampledb.rrd:pc2eth1rx:AVERAGE \
DEF:pc2eth1tx=/root/exampledb.rrd:pc2eth1tx:AVERAGE \
CDEF:pc1eth0rxb=pc1eth0rx,8,\* \
CDEF:pc1eth0txb=pc1eth0tx,-8,\* \
CDEF:pc1eth1rxb=pc1eth1rx,8,\* \
CDEF:pc1eth1txb=pc1eth1tx,-8,\* \
CDEF:pc2eth0rxb=pc2eth0rx,8,\* \
CDEF:pc2eth0txb=pc2eth0tx,-8,\* \
CDEF:pc2eth1rxb=pc2eth1rx,8,\* \
CDEF:pc2eth1txb=pc2eth1tx,-8,\* \
AREA:pc1eth0rxb#D7CC00:PC1_EHT0-RX \
AREA:pc1eth0txb#D7CC00:PC1_EHT0-TX \
LINE2:pc1eth1rxb#D73600:PC1_EHT1-RX \
LINE2:pc1eth1txb#D73600:PC1_EHT1-TX \
LINE2:pc2eth0rxb#0101D6:PC2_EHT0-RX \
LINE2:pc2eth0txb#0101D6:PC2_EHT0-TX \
LINE2:pc2eth1rxb#00D730:PC2_EHT1-RX \
LINE2:pc2eth1txb#00D730:PC2_EHT1-TX
  • 首先定义输出名称和时间跨度(我们也可以定义 “--end”)。
  • 我们输出一些标题和 Y 轴信息。
  • 接下来我们定义 png 的大小。
  • “DEF...” 从数据库获取信息。
  • “CDEF...” 重新计算原始信息(在我们的例子中,我们想呈现比特而不是字节)。
  • “AREA...” 在输出上显示一个区域图。
  • “LINE2...”(或 “LINE”)写入一个折线图。
  • 在颜色设置中,您可以在末尾输入不透明度。“LINE3...#FF00007F” 将显示一条约 50% 不透明度的 3 像素红色线。

保存设置

不要忘记保存所有设置

lbu ci floppy