CiscoルータのトラフィックをRRDtoolを使って30秒平均のグラフを作る（準備）

## 目的
一般的なルータのトラフィックをグラフ化するツールは5分平均です。
スパイクなどの一瞬のトラフィック増減を把握するために、30秒平均でグラフ化します。
トラフィックのグラフ化にはRRDtoolを利用します。

この記事ではRRDtoolの使い方を確認するために、コマンドで実行する方法について記載します。

Ciscoルータと``snmp``については、[Ciscoルータのポート一覧をSNMPで取得する](http://qiita.com/kooshin/items/1853e245d7162498cea9)で記載しています。


## 実行イメージ
下記のようにパケットデータ量とパケット数を30秒平均のグラフにします。
ここでは、サンプルデータとしてサインカーブを保存し、RRDtoolで描画しています。

送受信トラフィック（転送データ量）　※正方向は受信、負方向は送信
![286ec4c0-4233-4460-b8ca-2a0393e5edb3-traffic.png](https://qiita-image-store.s3.amazonaws.com/0/12026/7de8b1d3-bfb6-1eac-8f9c-afba66859ee3.png)

送受信パケット数　※正方向は受信、負方向は送信
![286ec4c0-4233-4460-b8ca-2a0393e5edb3-packet.png](https://qiita-image-store.s3.amazonaws.com/0/12026/bfb3fd9e-51dd-54aa-8a0c-7f6020e44770.png)


## 収集対象のSNMP OID
下記のOIDを定期的に``snmpget``で取得して、RRDファイルに保存します。

* トラフィック
  * 受信: ifHCInOctets
  * 送信: ifHCOutOctets
* ユニキャストパケット数
  * 受信: ifHCInUcastPkts
  * 送信: ifHCOutUcastPkts
* マルチキャストパケット数
  * 受信: ifHCInMulticastPkts
  * 送信: ifHCOutMulticastPkts
* ブロードキャストパケット数
  * 受信: ifHCInBroadcastPkts
  * 送信: ifHCOutBroadcastPkts

## RRDtoolコマンド

### 対象
今回はCisco1812JルータのFastEthernet0のインタフェースを取得対象とする。
下記の``snmpwalk``の実行結果から、インデックス番号は``1``と確認できる。

```zsh:snmpwalk
% snmpwalk -v2c -c public 192.168.88.101 ifDescr
IF-MIB::ifDescr.1 = STRING: FastEthernet0
IF-MIB::ifDescr.2 = STRING: FastEthernet1
IF-MIB::ifDescr.3 = STRING: BRI0
IF-MIB::ifDescr.4 = STRING: BRI0:1
IF-MIB::ifDescr.5 = STRING: BRI0:2
IF-MIB::ifDescr.6 = STRING: FastEthernet2
IF-MIB::ifDescr.7 = STRING: FastEthernet3
IF-MIB::ifDescr.8 = STRING: FastEthernet4
IF-MIB::ifDescr.9 = STRING: FastEthernet5
IF-MIB::ifDescr.10 = STRING: FastEthernet6
IF-MIB::ifDescr.11 = STRING: FastEthernet7
IF-MIB::ifDescr.12 = STRING: FastEthernet8
IF-MIB::ifDescr.13 = STRING: FastEthernet9
IF-MIB::ifDescr.14 = STRING: Null0
IF-MIB::ifDescr.15 = STRING: Vlan1
IF-MIB::ifDescr.16 = STRING: BRI0-Physical
IF-MIB::ifDescr.17 = STRING: BRI0-Signaling
IF-MIB::ifDescr.18 = STRING: BRI0:1-Bearer Channel
IF-MIB::ifDescr.19 = STRING: BRI0:2-Bearer Channel
```

### 作成
RRD形式のデータベースを作成します。ファイル名はUUIDをつけました。
30秒間隔で1ヶ月間、ルータの各カウンタを保存できるようにします。

```zsh:create
# 1447167590 => 2015-11-10 23:59:90 +0900
# 1447167600 => 2015-11-11 00:00:00 +0900
rrdtool create 286ec4c0-4233-4460-b8ca-2a0393e5edb3.rrd \
  --start 1447167590 \
  --step 30 \
  DS:InOctets:COUNTER:120:0:U \
  DS:OutOctets:COUNTER:120:0:U \
  DS:InUcastPkts:COUNTER:120:0:U \
  DS:OutUcastPkts:COUNTER:120:0:U \
  DS:InMulticastPkts:COUNTER:120:0:U \
  DS:OutMulticastPkts:COUNTER:120:0:U \
  DS:InBroadcastPkts:COUNTER:120:0:U \
  DS:OutBroadcastPkts:COUNTER:120:0:U \
  RRA:MAX:0.5:1:86400
```

### 更新
watchコマンドで30秒毎にsnmpgetでトラフィックを取得して、更新します。

```zsh:update
watch -n 30 rrdtool update 286ec4c0-4233-4460-b8ca-2a0393e5edb3.rrd N:\
`snmpget -v2c -Oqv -c public 192.168.88.101 ifHCInOctets.1`:\
`snmpget -v2c -Oqv -c public 192.168.88.101 ifHCOutOctets.1`:\
`snmpget -v2c -Oqv -c public 192.168.88.101 ifHCInUcastPkts.1`:\
`snmpget -v2c -Oqv -c public 192.168.88.101 ifHCOutUcastPkts.1`:\
`snmpget -v2c -Oqv -c public 192.168.88.101 ifHCInMulticastPkts.1`:\
`snmpget -v2c -Oqv -c public 192.168.88.101 ifHCOutMulticastPkts.1`:\
`snmpget -v2c -Oqv -c public 192.168.88.101 ifHCInBroadcastPkts.1`:\
`snmpget -v2c -Oqv -c public 192.168.88.101 ifHCOutBroadcastPkts.1`
```

### 描画
トラフィックとパケット数のグラフを別々に描画します。
受信方向をグラフの正の領域に、送信方向をグラフの負の領域に描画します。
startとendに、前日〜本日までの範囲指定をしています。

トラフィック

```zsh:graph
rrdtool graph 286ec4c0-4233-4460-b8ca-2a0393e5edb3-traffic.png \
  --start -1day \
  --end start+1day \
  --title "R1 Fa0 - Traffic" \
  --width 800 \
  --height 200 \
  --slope-mode \
  --rigid \
  --vertical-label "bits per second (bps)" \
  "DEF:a=286ec4c0-4233-4460-b8ca-2a0393e5edb3.rrd:InOctets:MAX" \
  "DEF:b=286ec4c0-4233-4460-b8ca-2a0393e5edb3.rrd:OutOctets:MAX" \
  "CDEF:bita=a,8,*" \
  "CDEF:bitb=b,8,*,-1,*" \
  "VDEF:maxa=bita,MAXIMUM" \
  "VDEF:maxb=bitb,MINIMUM" \
  "VDEF:avga=bita,AVERAGE" \
  "VDEF:avgb=bitb,AVERAGE" \
  "VDEF:lsta=bita,LAST" \
  "VDEF:lstb=bitb,LAST" \
  "HRULE:0#888888" \
  "AREA:bita#54EC48:Inbound " \
  "LINE1:bita#24BC14" \
  "GPRINT:avga:Average\\:%8.1lf %sbps" \
  "GPRINT:maxa:Maximum\\:%8.1lf %sbps" \
  "GPRINT:lsta:Current\\:%8.1lf %sbps\\n" \
  "AREA:bitb#48C4EC:Outbound" \
  "LINE1:bitb#1598C3" \
  "GPRINT:avgb:Average\\:%8.1lf %sbps" \
  "GPRINT:maxb:Maximum\\:%8.1lf %sbps" \
  "GPRINT:lstb:Current\\:%8.1lf %sbps\\n"
```

パケット数

```zsh:graph
rrdtool graph 286ec4c0-4233-4460-b8ca-2a0393e5edb3-packet.png \
  --start  \
  --start -1day \
  --end start+1day \
  --title "R1 Fa0 - Packets" \
  --width 800 \
  --height 200 \
  --slope-mode \
  --rigid \
  --vertical-label "packets per second (pps)" \
  "DEF:a=286ec4c0-4233-4460-b8ca-2a0393e5edb3.rrd:InUcastPkts:MAX" \
  "DEF:b=286ec4c0-4233-4460-b8ca-2a0393e5edb3.rrd:OutUcastPkts:MAX" \
  "DEF:c=286ec4c0-4233-4460-b8ca-2a0393e5edb3.rrd:InMulticastPkts:MAX" \
  "DEF:d=286ec4c0-4233-4460-b8ca-2a0393e5edb3.rrd:OutMulticastPkts:MAX" \
  "DEF:e=286ec4c0-4233-4460-b8ca-2a0393e5edb3.rrd:InBroadcastPkts:MAX" \
  "DEF:f=286ec4c0-4233-4460-b8ca-2a0393e5edb3.rrd:OutBroadcastPkts:MAX" \
  "CDEF:bita=a" \
  "CDEF:bitb=b,-1,*" \
  "CDEF:bitc=c" \
  "CDEF:bitd=d,-1,*" \
  "CDEF:bite=e" \
  "CDEF:bitf=f,-1,*" \
  "CDEF:ace=bita,bitc,+,bite,+" \
  "CDEF:bdf=bitb,bitd,+,bitf,+" \
  "VDEF:maxa=bita,MAXIMUM" \
  "VDEF:maxb=bitb,MINIMUM" \
  "VDEF:maxc=bitc,MAXIMUM" \
  "VDEF:maxd=bitd,MINIMUM" \
  "VDEF:maxe=bite,MAXIMUM" \
  "VDEF:maxf=bitf,MINIMUM" \
  "VDEF:maxace=ace,MAXIMUM" \
  "VDEF:maxbdf=bdf,MINIMUM" \
  "VDEF:avga=bita,AVERAGE" \
  "VDEF:avgb=bitb,AVERAGE" \
  "VDEF:avgc=bitc,AVERAGE" \
  "VDEF:avgd=bitd,AVERAGE" \
  "VDEF:avge=bite,AVERAGE" \
  "VDEF:avgf=bitf,AVERAGE" \
  "VDEF:avgace=ace,AVERAGE" \
  "VDEF:avgbdf=bdf,AVERAGE" \
  "VDEF:lsta=bita,LAST" \
  "VDEF:lstb=bitb,LAST" \
  "VDEF:lstc=bitc,LAST" \
  "VDEF:lstd=bitd,LAST" \
  "VDEF:lste=bite,LAST" \
  "VDEF:lstf=bitf,LAST" \
  "VDEF:lstace=ace,LAST" \
  "VDEF:lstbdf=bdf,LAST" \
  "HRULE:0#888888" \
  \
  "AREA:bita#54EC48:Unicast   Packets In " \
  "GPRINT:avga:Average\\:%8.1lf %spps" \
  "GPRINT:maxa:Maximum\\:%8.1lf %spps" \
  "GPRINT:lsta:Current\\:%8.1lf %spps\\n" \
  "AREA:bitc#7648EC:Multicast Packets In :STACK" \
  "GPRINT:avgc:Average\\:%8.1lf %spps" \
  "GPRINT:maxc:Maximum\\:%8.1lf %spps" \
  "GPRINT:lstc:Current\\:%8.1lf %spps\\n" \
  "AREA:bite#DE48EC:Broadcast Packets In :STACK" \
  "GPRINT:avgc:Average\\:%8.1lf %spps" \
  "GPRINT:maxc:Maximum\\:%8.1lf %spps" \
  "GPRINT:lstc:Current\\:%8.1lf %spps\\n" \
  "LINE1:bita#24BC14" \
  "LINE1:bitc#4D18E4::STACK" \
  "LINE1:bite#B415C7::STACK" \
  "COMMENT:  Total     Packets In " \
  "GPRINT:avgace:Average\\:%8.1lf %spps" \
  "GPRINT:maxace:Maximum\\:%8.1lf %spps" \
  "GPRINT:lstace:Current\\:%8.1lf %spps\\n" \
  "COMMENT: \\n" \
  \
  "AREA:bitb#48C4EC:Unicast   Packets Out" \
  "GPRINT:avgb:Average\\:%8.1lf %spps" \
  "GPRINT:maxb:Maximum\\:%8.1lf %spps" \
  "GPRINT:lstb:Current\\:%8.1lf %spps\\n" \
  "AREA:bitd#EA644A:Multicast Packets Out:STACK" \
  "GPRINT:avgd:Average\\:%8.1lf %spps" \
  "GPRINT:maxd:Maximum\\:%8.1lf %spps" \
  "GPRINT:lstd:Current\\:%8.1lf %spps\\n" \
  "AREA:bitf#EC9D48:Broadcast Packets Out:STACK" \
  "GPRINT:avgf:Average\\:%8.1lf %spps" \
  "GPRINT:maxf:Maximum\\:%8.1lf %spps" \
  "GPRINT:lstf:Current\\:%8.1lf %spps\\n" \
  "LINE1:bitb#1598C3" \
  "LINE1:bitd#CC3118::STACK" \
  "LINE1:bitf#CC7016::STACK" \
  "COMMENT:  Total     Packets Out" \
  "GPRINT:avgbdf:Average\\:%8.1lf %spps" \
  "GPRINT:maxbdf:Maximum\\:%8.1lf %spps" \
  "GPRINT:lstbdf:Current\\:%8.1lf %spps\\n"
```