使用 rrdtool (和 snmp) 设置流量监控
安装程序
安装 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