Edited at

ネットワークメトリクスを視覚化してみた(collectd + Graphite + Grafana)

More than 1 year has passed since last update.

ルータのトラフィックなど、ネットワーク機器のメトリクスを収集・蓄積・描画して視覚化してみました。使用したツールは下記のとおりです。


  • 収集:collectd - SNMPでルータからメトリクスを収集する

  • 蓄積:Graphite - 収集したメトリクスを保存する

  • 描画:Grafana - メトリクスを時系列で表示する

今回は、上記のツールを利用して、ルータのトラフィックを視覚化してみました。下記のようなグラフを描くことができます。

Grafanaで描画.png

図. Grafana実行画面


はじめに

今回はSNMPで取得できるネットワークメトリクス(トラフィックやパケット数など)をGraphite + Grafanaで視覚化してみました。SNMPの取得にはGraphiteに対応したcollectdを利用しました。

NetOpsCoding#3で、日本マイクロソフトの北島さんの発表「Monitoring Intelligence」でネットワークメトリクスのデモを見て、導入したいと思いこの記事を書きました。デモでは、オープンソースのGraphite + Grafanaを使ってコアネットワークの監視や状態確認の事例が紹介され、非常に使い勝手が良さそうだと感じました。

拙著のGrafanaとInfluxDBでネットワークリソースの視覚化で、Grafanaを利用していました。実際に利用してみて、ネットワークメトリクスの視覚化は、InfluxDBよりGraphiteが楽でした。InfluxDBとGraphiteを比較すると、Graphiteはシンプルなため、理解しやすいと思います。ただ、InfluxDBはSQLライクな言語でデータベースの操作ができるため、GraphiteよりInfluxDBの方がデータの柔軟性は高いと思います。また、GraphiteとGrafanaの親和性が高く、簡単に複数のルータやインタフェースを比較するグラフを作成できます。


仕組み

collectd + Graphite + Grafanaの組み合わせると下図の通りとなります。



  • collectd - メトリクス収集:SNMPでメトリクスを収集します


  • Graphite - メトリクス蓄積:メトリクスを蓄積します。


  • Grafana - メトリクス描画:Webブラウザでグラフを表示します。

20160709_collectd+graphite+grafana.002.png

図. collectd + Graphite + Grafana連携の仕組み


メトリクス収集 - collectd

collectdは、システムのパフォーマンスなどのメトリクスを定期的に収集するツールです。昔からあるツールで様々なプラグインがあり、入力と出力をcollectdが仲介します。今回は下記のプラグインを使います。


  • snmp入力プラグイン

    SNMPでネットワーク機器からメトリクスを収集するプラグイン


  • write_graphite出力プラグイン

    収集したデータをGraphiteに保存するプラグイン



メトリクス蓄積 - Graphite

Graphiteは、下記の2つの機能(蓄積と描画)があります。データの収集の機能はありません。


  • 時系列の数値データを保存する機能

  • ダイナミックにグラフ描画する機能

2006年から開発されているツールです。グラフ描画機能はGrafanaの方が優れいているため、Graphiteのグラフ描画機能は使いません。Graphiteは下記の3つのコンポーネントで成り立っています。


  • carbon:ネットワーク経由でデータを受信するコンポーネント

    PythonのライブラリTwistedを使ったイベントドリブン型のネットワークエンジン


  • whisper:データを保存するコンポーネント

    PythonのライブラリWhisperを使った時系列データに特化したデータベース。RRDと似ている。


  • graphite webapp:グラフを描画するWebアプリ

    PythonのWebフレームワークDjangoとグラフィックライブラリCairoを利用した管理アプリ


一番の特徴は、データの保存がライブラリなど必要でなく、TCPでデータを送信するだけで、データを保存できます。プログラミングの知識がなくても、下記のようにnetcatコマンドで、データを保存できます。


PORT=2003

SERVER=graphite.your.org
echo "local.random.diceroll 4 `date +%s`" | nc -c ${SERVER} ${PORT}

引用元:Graphite - Feeding In Your Data - The plaintext protocol



メトリクス描画 - Grafana

Grafanaは、下記の機能があります。かなり、かっこよくて、綺麗なダッシュボードやグラフをWeb画面から構築できます。


  • ダッシュボードを作成・表示する機能

  • 時系列のグラフを描画する機能

グラフ機能が優れており、様々な演算処理を組み合わせることで、下記のようなグラフを描画できます。


  • データを積み重ねて、複数インタフェースのトラフィック総量を表示するスタック機能

  • トラフィックの多いインタフェースの内、トップ10のみ表示する機能

  • 1週間前や1ヶ月前など、過去のグラフと比較して描画する機能


インストール

collectd + Graphite + Grafanaのインストール方法について説明します。今回はVirtualBox上に構築したLinuxのUbuntuにすべてのツールをインストールします。インストールにあたって、下記のサイトを参考にしています。


インストール環境

インストールしたソフトウェアのパッケージ名とバージョンは下記のとおりです。基本的にUbuntu16.04のパッケージからインストールします。Grafanaのみ、最新版を利用するため、Stableパッケージをダウンロードしてインストールします。その他はUbuntu16.04の標準パッケージが最新版でした。


  • 基本


    • Linuxディストリビューション:Ubuntu 16.04 LTS

    • カーネル4.4.0-28-generic x86_64



  • 収集 - collectd 標準パッケージ


    • collectd 5.5.1-1build2



  • 蓄積 - Graphite 標準パッケージ


    • graphite-carbon 0.9.15-1

    • graphite-web 0.9.15+debian-1

    • python-whisper 0.9.15-1

    • apache 2.4.18-2ubuntu

    • libapache2-mod-wsgi 4.3.0-1.1build1



  • 描画 - Grafana 個別パッケージ


    • grafana 3.0.4



インストールは、蓄積=>収集=>描画の順で実施します。


  1. Ubuntuのインストール

  2. Graphiteのインストール

  3. collectdのインストール

  4. Grafanaのインストール


Ubuntuのインストール

今回はUbuntu 16.04のサーバ版ubuntu-16.04-server-amd64.isoをインストールします。Ubuntuのインストール手順は省略します。

この記事では、$記号はBashシェルのプロンプトを示し、#はコメントを示します。

Ubuntu16.04のインストール後、パッケージを最新版にアップグレードし、再起動します。

# 1. APTリポジトリをアップデート

$ sudo apt update

# 2. インストール済みのパッケージをアップグレード
$ sudo apt upgrade

# 3. 再起動
$ sudo shutdown -r now


Graphiteのインストール

GraphiteをUbuntu 16.04の標準パッケージでインストールします。インストールするパッケージは次のとおりです。


  • graphite-carbon:データ蓄積パッケージ

  • graphite-web:グラフ描画パッケージ


    • apache2

    • libapache2-mod-wsgi



変更する設定ファイルは次のとおりです。


  • graphite-carbonの設定ファイル


    • /etc/default/graphite-carbon:自動起動設定

    • /etc/carbon/carbon.conf:データベースの設定

    • /etc/carbon/storage-schemas.conf:データベースのポリシー定義



  • graphite-webの設定ファイル


    • /etc/graphite/local_settings.py:GraphiteWebアプリの設定

    • /etc/apache2/sites-available/apache2-graphite.conf:Apache用の設定ファイル


      • 元ファイル:/usr/share/graphite-web/apache2-graphite.conf





必要なパッケージをAPTでインストールします。

$ sudo apt install graphite-carbon graphite-web graphite-web apache2 libapache2-mod-wsgi

graphite-carbonのインストール途中に下記の入力画面が表示された場合は、Noを選択してください。graphite-carbonをアンインストール(parge)した場合、データベースも一緒に消すかという質問です。今回は消さないため、Noを選択します。

    ┌────────────────────────────────────────┤ Configuring graphite-carbon ├─────────────────────────────────────────┐     

│ │
│ The /var/lib/graphite/whisper directory contains the whisper database files. │
│ │
│ You may want to keep these database files even if you completely remove graphite-carbon, in case you plan to │
│ reinstall it later. │
│ │
│ Remove database files when purging graphite-carbon? │
│ │
│ <Yes> **<No>** │
│ │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘


graphite-carbonの設定

graphite-carbonの起動設定ファイルを変更します。設定ファイルは/etc/default/graphite-carbonです。

$ sudo mv /etc/default/graphite-carbon /etc/default/graphite-carbon.orig

$ cat << EOF | sudo tee /etc/default/graphite-carbon
CARBON_CACHE_ENABLED=true
EOF

graphite-carbonの設定ファイルを変更します。設定ファイルは/etc/carbon/carbon.confです。設定の詳細はGraphiteのドキュメントを参照してください。修正箇所は次の1箇所です。


  • ログローテーションの有効化:ENABLE_LOGROTATION = True

# 設定ファイルのバックアップ

$ sudo mv /etc/carbon/carbon.conf /etc/carbon/carbon.conf.orig
# 設定変更
$ cat << EOF | sudo tee /etc/carbon/carbon.conf
[cache]
STORAGE_DIR = /var/lib/graphite/
LOCAL_DATA_DIR = /var/lib/graphite/whisper/
CONF_DIR = /etc/carbon/
LOG_DIR = /var/log/carbon/
PID_DIR = /var/run/
ENABLE_LOGROTATION = True
USER = _graphite
MAX_CACHE_SIZE = inf
MAX_UPDATES_PER_SECOND = 500
MAX_CREATES_PER_MINUTE = 50
LINE_RECEIVER_INTERFACE = 0.0.0.0
LINE_RECEIVER_PORT = 2003
ENABLE_UDP_LISTENER = False
UDP_RECEIVER_INTERFACE = 0.0.0.0
UDP_RECEIVER_PORT = 2003
PICKLE_RECEIVER_INTERFACE = 0.0.0.0
PICKLE_RECEIVER_PORT = 2004
LOG_LISTENER_CONNECTIONS = True
USE_INSECURE_UNPICKLER = False
CACHE_QUERY_INTERFACE = 0.0.0.0
CACHE_QUERY_PORT = 7002
USE_FLOW_CONTROL = True
LOG_UPDATES = False
LOG_CACHE_HITS = False
LOG_CACHE_QUEUE_SORTS = True
CACHE_WRITE_STRATEGY = sorted
WHISPER_AUTOFLUSH = False
WHISPER_FALLOCATE_CREATE = True

[relay]
LINE_RECEIVER_INTERFACE = 0.0.0.0
LINE_RECEIVER_PORT = 2013
PICKLE_RECEIVER_INTERFACE = 0.0.0.0
PICKLE_RECEIVER_PORT = 2014
LOG_LISTENER_CONNECTIONS = True
RELAY_METHOD = rules
REPLICATION_FACTOR = 1
DESTINATIONS = 127.0.0.1:2004
MAX_DATAPOINTS_PER_MESSAGE = 500
MAX_QUEUE_SIZE = 10000
QUEUE_LOW_WATERMARK_PCT = 0.8
USE_FLOW_CONTROL = True

[aggregator]
LINE_RECEIVER_INTERFACE = 0.0.0.0
LINE_RECEIVER_PORT = 2023
PICKLE_RECEIVER_INTERFACE = 0.0.0.0
PICKLE_RECEIVER_PORT = 2024
LOG_LISTENER_CONNECTIONS = True
FORWARD_ALL = False
DESTINATIONS = 127.0.0.1:2004
REPLICATION_FACTOR = 1
MAX_QUEUE_SIZE = 10000
USE_FLOW_CONTROL = True
MAX_DATAPOINTS_PER_MESSAGE = 500
MAX_AGGREGATION_INTERVALS = 5
EOF

graphite-carbonのデータ保存ポリシーを変更します。設定ファイルは/etc/carbon/storage-schemas.confです。設定の詳細はGraphiteのドキュメントを参照してください。データの保存頻度と保存期間を定義します。1つのデータについて複数のポリシーを定義でき、直近90日は30秒間隔で保持し、1年間は300秒間隔の平均値で保存できます。複数ポリシーを定義することで、データ保存の総量を減らしたり、グラフの描画速度を早くできます。今回は下記を定義します。


  • carbonポリシー


    • 「carbon.」から始まるパターンに適用

    • 60秒間隔で90日保存



  • collectdポリシー


    • 「collectd.」から始まるパターンに適用

    • 30秒間隔で90日保存

    • 300秒間隔で365日保存



  • デフォルトポリシー


    • 上記のパターンに一致しない場合に適用

    • 60秒間隔で1日保存



# 設定ファイルのバックアップ

$ sudo mv /etc/carbon/storage-schemas.conf /etc/carbon/storage-schemas.conf.orig
# 設定変更
$ cat << EOF | sudo tee /etc/carbon/storage-schemas.conf
[carbon]
pattern = ^carbon
\.
retentions = 60:90d

[collectd]
pattern = ^collectd\.
retentions = 30:90d,300:365d

[default_1min_for_1day]
pattern = .*
retentions = 60s:1d
EOF

設定変更が完了したのでgraphite-carbonデーモンを再起動します。

# プロセスを再起動(graphite-carbon)

$ sudo systemctl restart carbon-cache.service

# エラーがないか確認
$ sudo systemctl status carbon-cache.service

systemctl statusコマンドでは、graphite-carbonが問題なく稼働している場合は、下記のメッセージが表示されます。

kooshin@xenial2:~$ sudo systemctl status carbon-cache.service 

● carbon-cache.service - Graphite Carbon Cache
Loaded: loaded (/lib/systemd/system/carbon-cache.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2016-07-07 22:00:06 JST; 1s ago
Process: 15077 ExecStart=/usr/bin/carbon-cache --config=/etc/carbon/carbon.conf --pidfile=/var/run/c
Main PID: 15086 (carbon-cache)
Tasks: 2
Memory: 18.1M
CPU: 226ms
CGroup: /system.slice/carbon-cache.service
└─15086 /usr/bin/python /usr/bin/carbon-cache --config=/etc/carbon/carbon.conf --pidfile=/v

Jul 07 22:00:06 xenial2 systemd[1]: Stopped Graphite Carbon Cache.
Jul 07 22:00:06 xenial2 systemd[1]: Starting Graphite Carbon Cache...
Jul 07 22:00:06 xenial2 systemd[1]: Started Graphite Carbon Cache.


graphite-webの設定

graphite-webの設定ファイル/etc/graphite/local_settings.pyを修正します。設定の詳細はGraphiteのドキュメントを参照してください。修正箇所は次の2箇所です。


  • タイムゾーンを日本時間に変更

    TIME_ZONE = 'Asia/Tokyo'


  • WebフレームワークDjangoのシークレットキーの修正

    ランダムな値に変更します。

    SECRET_KEY = 'RANDAMU NA MOJIRETU WO SETTEI SIMASU'


# 設定ファイルのバックアップ

$ sudo cp /etc/graphite/local_settings.py /etc/graphite/local_settings.py.orig
# 設定ファイルを修正
$ cat << EOF | sudo tee /etc/graphite/local_settings.py
TIME_ZONE = 'Asia/Tokyo'
SECRET_KEY = 'RANDAMU NA MOJIRETU WO SETTEI SIMASU'
LOG_RENDERING_PERFORMANCE = True
LOG_CACHE_PERFORMANCE = True
LOG_METRIC_ACCESS = True
GRAPHITE_ROOT = '/usr/share/graphite-web'
CONF_DIR = '/etc/graphite'
STORAGE_DIR = '/var/lib/graphite/whisper'
CONTENT_DIR = '/usr/share/graphite-web/static'
WHISPER_DIR = '/var/lib/graphite/whisper'
LOG_DIR = '/var/log/graphite'
INDEX_FILE = '/var/lib/graphite/search_index' # Search index file
DATABASES = {
'default': {
'NAME': '/var/lib/graphite/graphite.db',
'ENGINE': 'django.db.backends.sqlite3',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': ''
}
}
EOF

local_settings.pyを修正した場合、Webアプリのデータベースを同期します。同期はgraphite-manage syncdbで実行します。初回実行時には管理用のスーパーユーザが未定義のため、併せてスーパーユーザを作成します。必ずスーパーユーザを作成してください。ここでは、adminをいう名前でスーパーユーザを作成します。

# Webアプリ用のデータベースを同期

$ sudo -u _graphite -g _graphite graphite-manage syncdb
# スーパーユーザの作成
You have installed Django's auth system, and don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use '_graphite'): admin ★アカウント名
Email address: ★メールアドレス
Password: ★パスワード
Password (again): ★パスワード
Superuser created successfully.

Apacheの設定をします。設定は変更せずに元ファイル/usr/share/graphite-web/apache2-graphite.confをそのまま利用します。

# デフォルトの000-defaultを無効化

$ sudo a2dissite 000-default
# 設定変更
$ cat << EOF | sudo tee /etc/apache2/sites-available/apache2-graphite.conf
<VirtualHost *:80>

WSGIDaemonProcess _graphite processes=5 threads=5 display-name='%{GROUP}' inactivity-timeout=120 user=_graphite group=_graphite
WSGIProcessGroup _graphite
WSGIImportScript /usr/share/graphite-web/graphite.wsgi process-group=_graphite application-group=%{GLOBAL}
WSGIScriptAlias / /usr/share/graphite-web/graphite.wsgi

Alias /content/ /usr/share/graphite-web/static/
<Location "/content/">
SetHandler None
</Location>

ErrorLog ${APACHE_LOG_DIR}/graphite-web_error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog ${APACHE_LOG_DIR}/graphite-web_access.log combined

</VirtualHost>
EOF
# apache2-graphiteを有効化
$ sudo a2ensite apache2-graphite

設定変更が完了したのでapache2を再起動します。

# プロセスを再起動(apache2)

$ sudo systemctl restart apache2.service

# エラーがないか確認
$ sudo systemctl status apache2.service

systemctl statusコマンドで、apache2が問題なく稼働している場合は、下記のメッセージが表示されます。

kooshin@xenial2:~$ sudo systemctl status apache2.service

● apache2.service - LSB: Apache2 web server
Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Thu 2016-07-07 22:25:02 JST; 1 day 9h ago
Docs: man:systemd-sysv-generator(8)
Process: 25758 ExecReload=/etc/init.d/apache2 reload (code=exited, status=0/SUCCESS)
Tasks: 95
Memory: 133.9M
CPU: 2min 29.577s
CGroup: /system.slice/apache2.service
├─18802 /usr/sbin/apache2 -k start
├─25831 (wsgi:_graphite) -k start
├─25832 (wsgi:_graphite) -k start
├─25833 (wsgi:_graphite) -k start
├─25834 (wsgi:_graphite) -k start
├─25835 (wsgi:_graphite) -k start
├─25836 /usr/sbin/apache2 -k start
└─25837 /usr/sbin/apache2 -k start

Jul 07 22:25:01 xenial2 systemd[1]: Stopped LSB: Apache2 web server.
Jul 07 22:25:01 xenial2 systemd[1]: Starting LSB: Apache2 web server...
Jul 07 22:25:01 xenial2 apache2[18786]: * Starting Apache httpd web server apache2
Jul 07 22:25:01 xenial2 apache2[18786]: AH00558: apache2: Could not reliably determine the serv...sage
Jul 07 22:25:02 xenial2 apache2[18786]: *
Jul 07 22:25:02 xenial2 systemd[1]: Started LSB: Apache2 web server.
Jul 09 06:25:01 xenial2 systemd[1]: Reloading LSB: Apache2 web server.
Jul 09 06:25:01 xenial2 apache2[25758]: * Reloading Apache httpd web server apache2
Jul 09 06:25:01 xenial2 apache2[25758]: *
Jul 09 06:25:01 xenial2 systemd[1]: Reloaded LSB: Apache2 web server.
Hint: Some lines were ellipsized, use -l to show in full.


Graphiteの動作確認

Graphiteの動作確認をします。Webブラウザから次のURLを指定して、Graphiteのトップ画面が表示されるか確認します。

http://インストール先ホストのIPアドレス/

同じマシンで実行している場合のURL
http://localhost/
別のマシン192.168.88.18で実行している場合のURL
http://192.168.88.18

Graphite画面.png

図. Graphiteのトップ画面


collectdのインストール

collectdをUbuntu 16.04の標準パッケージでインストールします。インストールするパッケージは次のとおりです。

collectdのsnmpプラグインを使う場合、SNMPのMIBが必要のため、snmpsnmp-mibs-downloaderを併せてインストールします。


  • snmp:SNMPパッケージ


    • snmp-mibs-downloader



  • collectd:データ収集パッケージ

設定ファイルは次のとおりです


  • snmpの設定ファイル


    • /etc/snmp/snmp.conf



  • collectdの設定ファイル


    • /etc/collectd/collectd.conf



必要なパッケージをAPTでインストールします。SNMPのMIBもダウンロードされます。

$ sudo apt install collectd snmp snmp-mibs-downloader


SNMPの設定

SNMPのMIBはライセンスの問題から、標準ではインストールされません。そのため、snmp-mibs-downloaderでMIBファイルをダウンロードします。また、snmpのデフォルトの設定ではMIBファイルの読み込みが無効されています。MIBファイルの読み込みを有効化するため、下記のsって居変更を実施します。

# SNMPの設定ファイルをバックアップ

$ sudo cp /etc/snmp/snmp.conf /etc/snmp/snmp.conf.orig

# MIBファイルを読み込むよう変更
# mibs行をコメントアウト
$ cat << EOF | sudo tee /etc/snmp/snmp.conf
# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loading them by commenting out the following line.
#mibs :
EOF


collectdの収集設定

SNMPの収集対象を設定します。今回は下記の通りSNMPの収集対象を設定します。設定の詳細は次のドキュメントを参照してください。


  • (collectd-snmp(5))[https://collectd.org/documentation/manpages/collectd-snmp.5.shtml]



  • SNMP収集対象


    • ifmib_if_octets64: ifHCInOctets, ifHCOutOctets(IN/OUTのバイト数)

    • ifmib_if_ucastpkts64: ifHCInUcastPkts, ifHCOutUcastPkts(IN/OUTのユニキャストパケット数)




  • SNMP収集ホスト


    • ホスト名:c1812j

    • IPアドレス:192.168.88.101

    • SNMPバージョン:2

    • SNMPコミュニティ:public

    • 収集間隔:30秒



# 設定ファイルのバックアップ

$ sudo cp /etc/collectd/collectd.conf /etc/collectd/collectd.conf.orig
# 設定を変更
$ cat << EOF | sudo tee /etc/collectd/collectd.conf
LoadPlugin snmp
LoadPlugin write_graphite

<Plugin snmp>
<Data "ifmib_if_octets64">
Type "if_octets"
Table true
Instance "IF-MIB::ifName"
Values "IF-MIB::ifHCInOctets" "IF-MIB::ifHCOutOctets"
</Data>
<Data "ifmib_if_ucastpkts64">
Type "if_packets"
Table true
Instance "IF-MIB::ifName"
Values "IF-MIB::ifHCInUcastPkts" "IF-MIB::ifHCOutUcastPkts"
</Data>

<Host "c1812j">
Address "192.168.88.101"
Version 2
Community "public"
Collect "ifmib_if_octets64" "ifmib_if_ucastpkts64"
Interval 30
</Host>
</Plugin>

<Plugin write_graphite>
<Carbon>
Host "localhost"
Port "2003"
Prefix "collectd."
Postfix ""
StoreRates true
AlwaysAppendDS true
EscapeCharacter "_"
</Carbon>
</Plugin>
EOF

設定変更をcollectdデーモンに反映させるため、デーモンを再起動します。

# collectdデーモンの再起動

$ sudo systemctl restart collectd.service

# collectdデーモンの起動ログ確認
$ sudo systemctl status collectd.service

再起動後、下記の通りエラーがなければ問題ありません。

kooshin@xenial2:~$ sudo systemctl status --no-pager collectd.service

● collectd.service - Statistics collection and monitoring daemon
Loaded: loaded (/lib/systemd/system/collectd.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2016-07-09 09:25:34 JST; 9s ago
Docs: man:collectd(1)
man:collectd.conf(5)
https://collectd.org
Process: 15569 ExecStartPre=/usr/sbin/collectd -t (code=exited, status=0/SUCCESS)
Main PID: 15572 (collectd)
Tasks: 11
Memory: 1.5M
CPU: 81ms
CGroup: /system.slice/collectd.service
└─15572 /usr/sbin/collectd

Jul 09 09:25:34 xenial2 systemd[1]: Stopping Statistics collection and monitoring daemon...
Jul 09 09:25:34 xenial2 systemd[1]: Stopped Statistics collection and monitoring daemon.
Jul 09 09:25:34 xenial2 systemd[1]: Starting Statistics collection and monitoring daemon...
Jul 09 09:25:34 xenial2 collectd[15572]: supervised by systemd, will signal readyness
Jul 09 09:25:34 xenial2 systemd[1]: Started Statistics collection and monitoring daemon.
Jul 09 09:25:34 xenial2 collectd[15572]: Initialization complete, entering read-loop.

設定ファイルが間違っている場合、下記の通りエラーメッセージが表示されます。

Jul 09 09:28:52 xenial2 collectd[16205]: snmp plugin: DataSet `if_octet' not defined.


collectdの動作確認

collectdでメトリクスが収集され、Graphiteに蓄積されているか、動作確認をします。Graphiteで下記の項目と表示されていればOKです。ルータのホスト名にif_octetsとif_packetsが定義され、グラフが描かれていればcollectdが正しく動作しているか確認できます。

Tree > Metrics > collectd > c1812j > snmp > if_octets-[インタフェース名]

Tree > Metrics > collectd > c1812j > snmp > if_packets-[インタフェース名]

Graphite+collectd.png

図. c1812jルータのトラフィックをGraphiteで表示した画面


Grafanaのインストール

GrafanaのInstalling on Debian / Ubuntuの手順通りにインストールします。今回はUbuntuの標準パッケージではなく、debファイルを直接ダウンロードし、インストールします。

$ wget https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.4-1464167696_amd64.deb

$ sudo dpkg -i grafana_3.0.4-1464167696_amd64.deb
$ sudo systemctl daemon-reload
$ sudo systemctl enable grafana-server.service

Grafanaは設定変更をしなくても使用できます。今回は設定変更せず、利用します。自動起動するよう設定し、デーモンを開始します。

# デーモンの起動

$ sudo systemctl start grafana-server.service
# 状態表示
$ sudo systemctl status grafana-server.service

systemctl statusコマンドの実行結果で、下記の通りエラーがなければOKです。

kooshin@xenial2:/etc/grafana$ sudo systemctl status --no-pager grafana-server.service 

● grafana-server.service - Starts and stops a single grafana instance on this system
Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2016-07-07 22:46:45 JST; 1 day 10h ago
Docs: http://docs.grafana.org
Main PID: 22426 (grafana-server)
Tasks: 7
Memory: 10.6M
CPU: 11.373s
CGroup: /system.slice/grafana-server.service
└─22426 /usr/sbin/grafana-server --config=/etc/grafana/grafana.ini --pidfile= cfg:default.paths.logs=/var/log/grafana cfg:defau...

Jul 07 22:46:45 xenial2 grafana-server[22426]: 2016/07/07 22:46:45 [I] Migrator: exec migration id: create playlist item table v2
Jul 07 22:46:45 xenial2 grafana-server[22426]: 2016/07/07 22:46:45 [I] Migrator: exec migration id: drop preferences table v2
Jul 07 22:46:45 xenial2 grafana-server[22426]: 2016/07/07 22:46:45 [I] Migrator: exec migration id: drop preferences table v3
Jul 07 22:46:45 xenial2 grafana-server[22426]: 2016/07/07 22:46:45 [I] Migrator: exec migration id: create preferences table v3
Jul 07 22:46:46 xenial2 grafana-server[22426]: 2016/07/07 22:46:46 [I] Created default admin user: admin
Jul 07 22:46:46 xenial2 grafana-server[22426]: 2016/07/07 22:46:46 [I] Plugins: Scan starting
Jul 07 22:46:46 xenial2 grafana-server[22426]: 2016/07/07 22:46:46 [W] Plugins: Plugin dir /var/lib/grafana/plugins does not exist
Jul 07 22:46:46 xenial2 grafana-server[22426]: 2016/07/07 22:46:46 [I] Plugins: Plugin dir /var/lib/grafana/plugins created
Jul 07 22:46:46 xenial2 grafana-server[22426]: 2016/07/07 22:46:46 [I] Listen: http://0.0.0.0:3000
Jul 07 22:47:17 xenial2 grafana-server[22426]: 2016/07/07 22:47:17 [I] Completed 192.168.88.40 - "GET / HTTP/1.1" 302 Found 29 bytes in 627us
Hint: Some lines were ellipsized, use -l to show in full.


Grafanaの動作確認

WebブラウザからGrafanaのトップ画面が表示できればOKです。標準ではTCPの3000ポートで待ち受けしています。

http://インストール先ホストのIPアドレス:3000/

同じマシンで実行している場合のURL
http://localhost:3000/
別のマシン192.168.88.18で実行している場合のURL
http://192.168.88.18:3000/

Grafanaのトップ画面.png

図. Grafanaのトップ画面(ログイン画面)


Grafanaの設定

ルータのトラフィックのグラフを作成します。collectdで収集したc1812jルータのトラフィックをGraphiteから読み出して、トラフィックのグラフを作成します。詳細は下記のGrafanaのドキュメントを参照してください。


ログイン

トップ画面(ログイン画面)で、下記のユーザ名とパスワードでログインします。


  • User: admin

  • Password: admin


データソースの設定

Graphiteに保存したデータを使うよう、データソースを設定します。

ログイン後、左上部のGrafanaアイコンからメニューから、データソース設定画面を表示します。

範囲を選択_056.png

図. Grafanaアイコン

Grafanaアイコン > Data Sources

「+Add data source」ボタン

データソースを下記のとおり設定します。Graphiteはプロキシでローカルホストに接続します。

Config

Name:Graphite
Default:チェック
Type:Graphite

Http settings
Url:http://localhost
Access:Proxy

Addボタン

データソースが正しく動作しているか、Save&Testボタンで確認します。テスト接続後、Data source is workingと表示されればOKです。

Save&Testボタン

Success
Data source is working


グラフの作成

Grafanaアイコン => Dashboards => +New

左の緑のアイコン => Add Panel => Graph

グラフは下記のとおり設定しています。General、Metrics、Axes、Legend、Displayタブで設定します。

Generalタブで、グラフの名前やサイズを指定します。

Grafana - c1812j - Google Chrome_047.png

図. Graph - Generalタブ

Metricsタブで、グラフで描画するデータを設定します。今回はインタフェースFa0, Fa1, Fa2のトラフィックを描画します。Graphiteのメトリクスは次のとおりです

collectd.c1812j.snmp.if_octets-Fa0.*

collectd.c1812j.snmp.if_octets-Fa1.*
collectd.c1812j.snmp.if_octets-Fa2.*

末尾で*を指定することで、rxとtx両方が表示対象になります。また、Graphiteに保存されたデータはバイト数(オクテット数)のため、ビットに変換するため、scale関数で8倍します。

Grafana - c1812j - Google Chrome_046.png

図. Graph - Metricsタブ

Axesタブで、X軸とY軸を設定します。Left YのUnit(単位)をbits/secを選択し、Right Yは不要のため、showのチェックを外します。

Grafana - c1812j - Google Chrome_049.png

図. Graph - Axesタブ

Legendタブで、グラフの凡例を設定します。テーブル形式でメトリクスを表示し、最小値(Min)、最大値(Max)、平均値(Avg)、現在値(Current)を表示します。

Grafana - c1812j - Google Chrome_050.png

図. Graph - Legendタブ

Displayタブで、描画する線の太さなどを設定します。積み重ねて表示する場合は、Stackをチェックします。

Grafana - c1812j - Google Chrome_051.png

図. Graph - Displayタブ


ダッシュボードの定義

グラフの作成が完了したあとは、上部の右に「Back to dashboard」でダッシュボード画面に戻ります。ここで、ダッシュボードの定義をします。

ダッシュボードは下記の設定アイコンからできます。

範囲を選択_057.png

設定アイコン > Settings

Details
Title: c1812j
Editable: チェック

Grafana - c1812j - Google Chrome_058.png

図. ダッシュボードの設定


設定の保存

グラフとダッシュボードの設定が完了したあとに、保存します。保存は、下記の保存アイコンでできます。

範囲を選択_059.png

グラフを変更した場合は、必ず保存してください。保存しない場合は、ブラウザを閉じるとすべての変更内容が失われます。

すべての設定が完了すると、下記のグラフのダッシュボードができます。また、+ADD ROWボタンで、グラフを追加することが可能です。

Grafana - c1812j - Google Chrome_060.png

図. Grafanaのダッシュボード画面


Grafanaダッシュボード

トラフィックとパケット数を追加すると下記のようなダッシュボードができます。

Grafana - c1812j - Google Chrome_061.png

図. Grafanaダッシュボード - c1812jルータ

設定変更することで、積み重ねて表示するスタック表示もできます。アップリンクが複数ある場合、重ねて表示することで総量を把握することができます。

Grafana - c1812j - Google Chrome_062.png

図. Grafanaダッシュボード - c1812jルータ(スタック表示)


おわりに

今回はGraphite+Grafanaを試用するためにcollectdを使ってSNMPでメトリクスを収集しました。今後はSNMP以外で収集したメトリクスをGraphiteに保存して、実環境で使っていきたいと思います。

より活用したい場合は、下記のドキュメントを参照してください。