MuninデータのダッシュボードとしてGraphite+Grafanaを利用してみた

いつもお世話になっているMuninなのですが、任意のグラフを選んで並べて比較してといった使い方が簡単にできたらいいなと思っていました。

色々な実装方法があると思いますが、ここではMuninの基板であるRRDToolのような時系列データベースである Graphite と、ダッシュボードである Grafana を使ってフロントエンドとして利用することで、Muninのダッシュボードを作ってみようと思います。

Graphiteインストール

まずはこちらページでGraphiteとは何ぞやというのを勉強させてもらいます。

Mackerelを支える時系列データベース技術 - ゆううきブログ

そして、こちらの手順を参考にさせていただきインストールします。

Graphite Setup for CentOS · GitHub

Grafanaインストール

yumでインストールできます。前提パッケージと共にインストールします。

sudo yum install initscripts fontconfig
sudo yum install https://grafanarel.s3.amazonaws.com/builds/grafana-3.1.1-1470047149.x86_64.rpm

起動します。

/etc/init.d/grafana-server start
chkconfig grafana-server on

これで Grafana にアクセスできるようになっているはずです。

http://servername:3000/

Grafanaの使い方はこちらのサイトなどを参考にさせてもらいます。このサイトではデータソースとしてAWS CloudWatchをGrafanaに表示しています。今回はデータソースがMuninに蓄積されたデータになります。

Grafanaでかっけぇダッシュボード作るよ!(構築・設定編) | サーバーワークス エンジニアブログ

Muninのデータ確認

Muninのデータは rrd という拡張子のファイルに格納されいます。

yumパッケージで入れたMuninなら以下のフォルダを確認するとrrdファイルが存在しているはずです。

/var/lib/munin/<group名>/

RRDファイル->WSPファイル変換

Muninの.rrd ファイルをwhisper形式の .wsp ファイルに変換することで、GraphiteにMuninのデータを食わせることができます。

変換には rrd2whisper というツールを利用します。Graphiteインストールしていれば入っているはずです。 このツールを使うために以下のパッケージを入れておきます。

yum install rrdtool-python

使い方はこんな感じです。これで .wsp ファイルが出力されます。

rrd2whisper --xFilesFactor=0.0 --aggregationMethod=average ./rrdfile/loadbalancer01-load-load-g.rrd

出力された .wspwhisper フォルダ配下に配置します。ここでは munin フォルダを掘って、そこに .wsp ファイルを置いていくことにします。

mkdir /var/lib/carbon/whisper/munin
chown -R carbon:carbon /var/lib/carbon/whisper/munin

先ほどの rrd2whisper コマンドで出力された .wsp ファイルを以下のように配置します。

/var/lib/carbon/whisper/munin/lb/loadbalancer01-apache_accesses-accesses80-d_42.wsp

Graphiteで確認してみると、データが読み込めていることがわかります。

Grafanaでもデータソース種別としてGraphiteを指定することで、ダッシュボードに表示できます。

スクリプト

最後にMuninサーバの.rrdファイルを取得して、.wsp 形式に変換し、carbonフォルダ配下に配置する処理を自動化します。

# muninのGroup一覧からgroup.listを作成
group_list_file=/var/lib/carbon/tools/group.list
data_dir=/var/lib/carbon/whisper/munin
while read grp
do 
  test -d $data_dir/$grp || mkdir $data_dir/$grp
  test -d $data_dir/$grp/rrd || mkdir $data_dir/$grp/rrd
  rm -f $data_dir/$grp/*.wsp
  rsync -ar --include '*.rrd' --exclude '*' remote_user@munin_server:/var/lib/munin/$grp/ $data_dir/$grp/rrd/
  cd $data_dir/$grp
  for rrdfile in $(ls -1 $data_dir/$grp/rrd);do rrd2whisper --xFilesFactor=0.0 --aggregationMethod=average $data_dir/$grp/rrd/$rrdfile;done >/dev/null
  mv $data_dir/$grp/{rrd/*.wsp,}
done  < $group_list_file

ここから rrd2whisper の最新版を落としてくると、destinationPath オプションが使えるようになり、wspファイルの出力先を指定できるようになります。

NFSと組み合わせると上記のrsyncを使うものよりもシンプルに実装できます。

whisper/rrd2whisper.py at master · graphite-project/whisper · GitHub

$ ./rrd2whisper.py -h
Usage: rrd2whisper.py rrd_path

Options:
  -h, --help            show this help message and exit
  --xFilesFactor=XFILESFACTOR
                        The xFilesFactor to use in the output file. Defaults
                        to the input RRD's xFilesFactor
  --aggregationMethod=AGGREGATIONMETHOD
                        The consolidation function to fetch from on input and
                        aggregationMethod to set on output. One of: average,
                        last, max, min
  --destinationPath=DESTINATIONPATH
                        Path to place created whisper file. Defaults to the
                        RRD file's source path.