インフィニットループ 技術ブログ

2016年11月16日 (水)

著者 : mizuno_as

クリスタルシグナルPiとZabbixでネットワークトラフィックを可視化する方法

こんにちは、mizuno_asです。
発表以来、大きなお友達にビミョーな人気を誇るクリスタルシグナルPiですが、みなさんもう使い方は決まりましたか? 今回から何度かにわけて、実際に弊社内でどのように使っているか、実例を紹介していきたいと思います。

トラフィックに応じて点滅パターンが変化します。

ネットワークトラフィックを色と点滅で可視化しよう

ILでは、ルーターおよび社内ネットワークのスイッチのポートごとのトラフィックを、Zabbixで監視しています。インフラ担当としては、ネットワークの輻輳にはすぐに気づける必要があります。しかし、常時グラフを見続ける仕事をするには人生は短すぎますし、直感的でもありません。そこでクリスタルシグナルPiの出番となるわけです。

設計

ルーター、スイッチのトラフィックは、既にZabbixのSNMPテンプレートで可視化、数値化ができています ((ZabbixのSNMP設定については、本記事では省略します。))。あとは適切なトリガーを設定し、アクションを起こせば実現できそうです。
クリスタルシグナルPiを点灯させるには、curlコマンドでAPIを叩ければよいわけです。そこでcurlを実行するだけのシェルスクリプトをZabbixサーバーにデプロイし、トリガー発生時にこれを実行させることとしました。

トリガーの作成

常時トラフィックを可視化するためには、「しきい値を越えた時にアクション」という一般的なアラートではなく、常に情報を流し続ける必要があります。そこでZabbixのトリガーの発生条件を、「あるEthernetのポートの流量が1以上の時」(すなわちなんかデータが流れたら必ずトリガー=常時トリガー状態になる)としてみました。
この設定のため、常にトリガーが発動した状態が続きます。しかしZabbixの仕様上、トリガーが継続している間は、常に「最初にトリガーが発生した時のアクション」が実行され続けてしまうようなのです。トリガーから起動されるアクションには、引数として現時点のトラフィック量が渡されます。しかし常に同じアクションが実行されるため、スクリプトに渡される引数(トラフィック量)が、最初にトリガーされた時から変化しないのです。これでは意味がありません。
これを回避するために「障害イベントを継続して生成」にチェックを入れます。するとトリガーが継続している間、常に新しいトラフィック量でアクションが再起動されます。
また障害ではないため、トリガーの深刻度は情報(information)としました。

「障害イベントを継続して生成」がキモ。

アクションの作成

トリガーができたら、実際に起動するアクションを作成しましょう。常時発生しているのが前提のアクションなので、実行ステップ間隔は最小の60秒、繰り返し回数は無限とします。トリガーの深刻度を情報(information)に設定したので、実行条件もそれに合わせます。

深刻度はinformation、トリガーには先ほど作成したトリガーを指定。

タイプは「カスタムスクリプト」、実行は「Zabbixサーバー」とします。コマンドは「/usr/local/bin/crystal.sh」としました ((もちろん、お使いの環境にあわせて変更してください。)) 。引数は{ITEM.VALUE 1}としてください。

60秒間隔で無限に繰り返すように設定。

スクリプトを実装する

それではアクションに指定した、crystal.shを実装しましょう。スクリプトに渡す引数として{ITEM.VALUE 1}を渡すように設定しましたよね。ここにはトリガー発生時のアイテムの実測値が入ります。具体的には、第1引数にトラフィック量、第2引数に単位が渡されるので、それを前提にスクリプトを組みます。
第2引数には「Kbps」「Mbps」の2パターンがありえます。そこで単位がKbpsであった場合は0Mbpsとみなすようにしました。また少数以下を判定する必要はないため、cutで切り捨てています ((真面目にbcあたりで判定することもできますが、そこまでする必要はないので……。)) 。
あとは単純なif elseで、クリスタルシグナルPiの色と点滅速度を調整しているだけです ((配列使ってもうちょっとすっきり書こうとかいう意見は/dev/null行きです。慈悲はない。)) 。

#!/bin/bash
PIIP=(クリスタルシグナルPiのIPアドレス)
bps=$(echo $1 | cut -d . -f 1)
if [ "$2" = "Kbps" ]; then
    bps=0
fi
if [ $bps -gt 90 ]; then
    red=255
    green=0
    blue=0
    period=200
elif [ $bps -gt 80 ]; then
    red=200
    green=50
    blue=0
    period=500
(...略...)
fi
curl -s "http://${PIIP}/ctrl/?color=${red},${green},${blue}&period=${period}&mode=1&info=$1$2" >/dev/null 2>&1

infoパラメータに引数をそのまま渡すことで、ログにトラフィックを記録してみたり。

これで冒頭の動画のように、トラフィック量に応じて点滅パターンが変化します。Windows Updateの日は朝から真っ赤に点滅してくれたり、なかなか愉快です。
そんなクリスタルシグナルPiですが、弊社アルバイトが心をこめて袋づめした家内制手工業な初回ロットは一瞬で完売してしまいました。そして現在は本格的な量産のため、クラウドファウンディングで支援を募集しています。興味のある方は、ぜひ下記ページから支援をお願いします。
クリスタルシグナルPi公式サイト
ACT NOW プロジェクトページ
それではみなさん、よい監視生活を!

ブログ記事検索

このブログについて

このブログは、札幌市・仙台市の「株式会社インフィニットループ」が運営する技術ブログです。 お仕事で使えるITネタを社員たちが発信します!