最高にわかりやすいネットワークの可視化✨✨

# はじめに
この記事は、[~~知名度の低い穴場中の穴場企業~~](https://twitter.com/XvwRoOKfL3aFEeW/status/1204159204682092544)シスコシステムズの有志による [Cisco Systems Japan Advent Calendar 2019](https://qiita.com/advent-calendar/2019/cisco) の 14 日目として投稿しています。

- 2017年版: https://qiita.com/advent-calendar/2017/cisco
- 2018年版: https://qiita.com/advent-calendar/2018/cisco
- 2019年版: https://qiita.com/advent-calendar/2019/cisco

# TL;DR
- ネットワークの利用状況を可視化するために、端末の通信量に応じて💡⚡✨**イルミネーション**✨⚡💡を色々なパターンで光らせます
- SNMP で通信量の統計情報を取得する方法は一般的に **1 - 5 分間の平均スループット**を計算するため、実際の利用状況を**即座に**イルミネーションに反映させることができません
- **Steaming Telemetry** を使うことで、プログラムに優しい形式 (XML, JSON) でネットワーク機器からリアルタイムに統計情報を取得できます
- この記事では **5 秒間の平均スループット**を元にイルミネーションを制御することができました
- 今年は自宅ラックやネットワーク機器をイルミネーションしましょう！✨✨✨

# 動作例
## クリスマスイルミネーション
クリックで再生されます。
<a href="https://vimeo.com/379236985"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/7c597d51-23f4-3f41-a879-4fb262965fc9.png"></a>

クリスマスツリーはたったの 300 円。ドン・キホーテと関連会社に感謝を申し上げます。

## 自宅ラック
友人の自宅ラックをイルミネーションしてみました😇 (Thanks to @takemon62act)
![takemon62act 宅ラック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/faa541ff-a40d-5bf9-933f-257f2a0c3c99.gif)

# At-A-Glance

![At-A-Glance](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/c1574dc0-dd9d-d05f-1ec8-57f40e093921.png)

- AP = アクセスポイント
- WLC = ワイヤレス LAN コントローラ


# 通信の可視化

企業組織のネットワークに限らず、一般的な家庭で使われているネットワークにおいても、その利用状況は可視化されています。例えば、ルータやスイッチ等の機器には各インターフェイスの接続状態を表す**リンク LED** やトラフィックがあることを示す**アクティビティ LED** が備わっています。これらの LED は極めて限られた面積の中にも関わらず、わかりやすく通信を可視化してくれます。

![outout.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/0c221c69-5835-0ccf-30fa-2da813a964fa.gif)


しかし、どう考えても✨✨**派手さ**✨✨が足りません。

この記事はアドベントカレンダーの一部なわけですから、クリスマスにちなんで、**派手にイルミネーション**する必要があります。そこで、とりあえず Amazon で [LED イルミネーションライト](https://www.amazon.co.jp/gp/product/B07HCC9FDN)を買ってきました。

<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/6b7a34db-9d93-6419-7431-c2c91a42268a.png">

リモコンで 8 つの点灯パターンを切り替えることができます。1,000 円ほどで購入しました。**消費電力ゼロ**と**電池式**が特徴らしいです。


# スループットを計算することの難しさ

この記事では「**ネットワークがたくさん使われているときに✨✨派手に光る✨✨**」ことを目指して、ネットワークのスループットに注目します。

企業組織のネットワークにおいて利用状況を可視化する一般的な方法は、**SNMP** を使って定期的にネットワーク機器から通信量の統計情報を取得し、その差分から帯域幅を算出するものです。

参考: [SNMP を使用した帯域幅使用率の計算方法](https://www.cisco.com/c/ja_jp/support/docs/ip/simple-network-management-protocol-snmp/8141-calculate-bandwidth-snmp.html) (15 年以上前から公開されている)

このような方法では、装置から情報を取得する間隔 (サンプリングレート) によって精度に大きな違いが生まれます。例えば、統計情報を **5 分おき** に取得すると、その 5 分間の中で **💣 爆発的 💣 な変化**があったことに気付くことができません。

では、数秒おきの情報を取得すればいいのでしょうか？？

残念ながらネットワーク機器のリソースは非常に限られているため、SNMP を使って数秒おきに情報を問い合わせてしまうと、ネットワーク機器側の負荷が高くなってしまいます。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/101922fb-9829-17a9-4683-700cdb193d70.png">

そこで**次世代 SNMP**と呼ばれている**Streaming Telemetry** の出番です。Streaming Telemetry では「**いつ（＊秒おきに, 値が変化したら）**」「**どこに（IP アドレス, ポート）**」「**なにが欲しい**」のか、予めネットワーク機器に対して宣言します。ネットワーク装置から能動的に情報を送信するため、SNMP と比較して軽い負荷でリアルタイムなデータを取得することができます。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/63cb2f7f-fb0e-c387-af37-b111d70f2db7.png">

Streaming Telemetry は最近日本でも多く取り上げられているため、色々な情報が Web で見つかります。興味がある方はぜひ以下をご参照ください。

- [Streaming Telemetryで実現！サイレント障害における予兆検知への道 :: JANOG41](https://www.janog.gr.jp/meeting/janog41/program/telemetry)
- [IOS XEのModel Driven Telemetryを試してみた](https://qiita.com/tetsusat/items/eae0f79f445e54ef662f)
- [Cisco Model Driven Telemetryの参考資料メモ](https://qiita.com/tech_kitara/items/3db5b263ac959476f15f)


# 構成部品
## IoT リモコン - Broadlink RM Mini3
<img alt="Broadlink RM Mini3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/e34d9c9c-6a3d-b595-ea45-f6b9a49ce220.png" width="200">
[Broadlink RM Mini3](https://www.amazon.co.jp/dp/B07VMDMGZV)

LED イルミネーションに赤外線を送信するために、スマートホームなどの文脈で話題の「スマートリモコン」「IoT リモコン」を使います。ちゃんとしたものは高価なので、今回はあくまで実験目的として**技適未取得**の怪しい製品を eBay で買ってきました 😈

~~社名を出しながら電波法に違反すると炎上間違いなしですが~~ 総務省関東総合通信局へ[技適未取得機器を用いた実験等の特例](https://www.tele.soumu.go.jp/j/sys/others/exp-sp/index.htm)を届けることで、実験のために合法的に利用しています 🎉
申告書を郵送すると、届出書データとして **yaml** ファイルがメールで送付されてきて感動しました。

<img width="500" alt="技適未取得機器を用いた実験等の特例の届出" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/f5d3ef9c-31c7-6789-6171-f239304576f7.png">


## Cisco Catalyst 9800-CL ワイヤレス コントローラ

Cisco Catalyst といえば **スイッチ** と思いますよね???

> <img src="https://www.cisco.com/c/en/us/products/wireless/catalyst-9800-series-wireless-controllers/index/_jcr_content/Grid/category_atl_36f2/layout-category-atl/anchor_info_61e0/image.img.png/1574509332506.png" alt="Cisco Catalyst 9800 Series Wireless Controllers" width="500">
> [Cisco Catalyst 9800 Series Wireless Controllers (cisco.com)](https://www.cisco.com/c/en/us/products/wireless/catalyst-9800-series-wireless-controllers/index.html)より引用

**違います！** ワイヤレス製品も含めた Catalyst 9000 シリーズとして約 1 年前にブランド統合されました。
従来と大きく異なる点はルータやスイッチと同様に **Cisco IOS XE** が採用されていることです。これによって、**プログラマビリティ**が飛躍的に向上されています。また、ルータでは当たり前の**仮想環境**との親和性も大きく向上しました。

この記事では仮想アプライアンス Catalyst 9800-CL 16.12.1s を利用しています。

## Python プログラム

ソースコードは [Gist](https://gist.github.com/mochipon/0fa4719f25ba5710bf6300cd72b57aff) にアップロードしました。自由に使ってください。Cisco ではないネットワーク機器でも同じように動くはず、です。

```bash
$ python main.py --help
usage: main.py [-h] -u USERNAME [-p PASSWORD] [--port PORT] [--period PERIOD]
               destination ifname

パラメータを入力してください

positional arguments:
  destination           Connects and logs into the specified destination
  ifname                Interface name to check its bandwidth (i.e.,
                        GigabitEthernet1)

optional arguments:
  -h, --help            show this help message and exit
  -u USERNAME, --username USERNAME
                        Username (default: None)
  -p PASSWORD, --password PASSWORD
                        Password (default: Prompt if not specified)
  --port PORT           Port (default: 830)
  --period PERIOD       Period in centiseconds for periodic subscription
                        (default: 500)
```

例えばこんな感じで実行します。

```bash
$ python main.py -u cisco -p cisco switch.example.com GigabitEthernet2
```


# 最後に
- 自宅ラックのイルミネーションを快諾してくれた 10 年来の友人に感謝 🙏
    - <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/faa6eab7-6cf1-57fd-873b-5a86b710cefa.png">

# 免責事項
本サイトおよび対応するコメントにおいて表明される意見は、投稿者本人の個人的意見であり、シスコの意見ではありません。本サイトの内容は、情報の提供のみを目的として掲載されており、シスコや他の関係者による推奨や表明を目的としたものではありません。各利用者は、本Webサイトへの掲載により、投稿、リンクその他の方法でアップロードした全ての情報の内容に対して全責任を負い、本Web サイトの利用に関するあらゆる責任からシスコを免責することに同意したものとします。