Help us understand the problem. What is going on with this article?

ネットワークメトリクスを視覚化してみた(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に保存して、実環境で使っていきたいと思います。

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

kooshin
ネットワークのエンジニアです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした