[CentOS]fluent と GrowthForecast を連携させてグラフを作ってみる #01


fluentとgrowthforecastが流行っていると聞いて試してみました。アクセスログの統計はawstatsなどを使っている方も多いと思いますが、ツールの提供する範囲でしか表やグラフを生成してくれません。しかし、自分が計測したい項目がそこになかった場合は、グラフを作るしかありません。これまでは敷居の高かったグラフ作成を、これら組み合わせで簡単に作ってしまいましょう。RRDtoolなど既存のツールを使って数字をグラフにするよりは、恐らくものすごく簡単だと思います。

fluentって?

メッセージングのコレクションサービス。フレームワークとして抽象化されており、各種プラグインを利用することで、様々なメッセージングを集約、伝搬することが出来る。
また転送時のデータ構造には MessagePack を採用しており、かなりの転送能力を誇る。

from はてな

growthforecastって?

kazeburoさんが作成されたツールで、様々な値をAPI経由でグラフ化することができる。

動作イメージとしては以下の概念図のようになります。
fluent+growthforecast example
今回は例題として、ApacheのアクセスログをfluentがJSON形式に変換し、そのログファイルをgrowthforecastがグラフ化するところまでやってみたいと思います。

あらかじめ手元の作業環境にApacheをインストールするか、他所のサーバからアクセスログ(combined形式)を任意のディレクトリにコピーしておいてください。

■ 環境

[cc lang='text' ]OS CentOS 6.3 x86_64
パッケージ 最小構成でインストール[/cc]

■ 事前準備

あらかじめ以下のパッケージをインストールしておきます。特にことわりのないものは、yumの標準リポジトリからインストールできます。
[cc lang='text' ]pkgconfig make gcc git libedit openssh-clients perl perl-Error perl-Git perl-Module-Pluggable perl-Pod-Escapes perl-Pod-Simple perl-libs perl-version rsync wget libyaml ruby[/cc]
libyamlはepelからインストール。rubyのために必要です。
rubyはこちらの手順でパッケージ化したものを使用します。これは、fluentdが ruby 1.9以上でないと動かないからです。

■ fluentd インストール

rubyのインストールまで終わったら、gemコマンドでfluentdをインストールします。
[cc lang='bash' ][admin@mega21 ~]$ sudo gem install fluentd[/cc]

■ fluentd セットアップ

/opt/fluentd 以下に設定ファイルを置きます。以下コマンド一発でOKです。
[cc lang='bash' ]
[admin@mega21 ~]$ sudo fluentd --setup /opt/fluentd
Installed /opt/fluentd/fluent.conf.[/cc]

■ Apacheのログを受け取るconfigを作成する (まずはデータを拾えることの確認)

[cc lang='bash' ]
[admin@mega21 ~]$ cd /opt/fluentd
[admin@mega21 fluentd]$ sudo vi fluent_apache.conftype tail
path /var/log/httpd/access_log
format apache
tag apache.access


type tcp
host localhost

[/cc]

■ Apacheのログが読めるよう /var/log/httpd ディレクトリのパーミッション変更

※ 自身でバーチャルホストのログを別ディレクトリに作成し、fluentd実行ユーザが読めるのであれば作業不要です
[cc lang='bash' ]
[admin@mega21 fluentd]$ cd /var/log/
[admin@mega21 log]$ sudo chmod 755 httpd
[/cc]

■ tcpでaccess_logを受け取って、fluetndディレクトリに出力するconfigを作成する

[cc lang='bash' ]
[admin@mega21 log]$ cd /opt/fluentd/
[admin@mega21 fluentd]$ sudo vi fluent_aggre.conftype tcp


type file
path /opt/fluentd/log/access_log

[/cc]

■ fluent起動

まだスタートスクリプトを作っていないので、手オペで起動します。
[cc lang='bash' ]
[admin@mega21 ~]$ sudo fluentd -c /opt/fluentd/fluent_apache.conf &
[admin@mega21 ~]$ sudo fluentd -c /opt/fluentd/fluent_aggre.conf &
[/cc]

■ netstat確認

24224番ポートをListenしていることを確認します。
[cc lang='bash' ]
[admin@mega21 ~]$ netstat -lnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:24224 0.0.0.0:* LISTEN
tcp 0 0 :::22 :::* LISTEN
tcp 0 0 ::1:25 :::* LISTEN
[/cc]

■ プロセス確認

[cc lang='bash' ]
[admin@mega21 ~]$ ps -aef | grep [f]luentd
root 1925 1212 0 20:41 pts/1 00:00:00 sudo fluentd -c /opt/fluentd/fluent_apache.conf
root 1926 1925 0 20:41 pts/1 00:00:00 /usr/bin/ruby /usr/bin/fluentd -c /opt/fluentd/fluent_apache.conf
root 1928 1926 0 20:41 pts/1 00:00:00 /usr/bin/ruby /usr/bin/fluentd -c /opt/fluentd/fluent_apache.conf
root 1933 1212 0 20:41 pts/1 00:00:00 sudo fluentd -c /opt/fluentd/fluent_aggre.conf
root 1934 1933 0 20:41 pts/1 00:00:00 /usr/bin/ruby /usr/bin/fluentd -c /opt/fluentd/fluent_aggre.conf
root 1936 1934 0 20:41 pts/1 00:00:00 /usr/bin/ruby /usr/bin/fluentd -c /opt/fluentd/fluent_aggre.conf
[/cc]

この後、Apacheのドキュメントルートに適当なコンテンツを配置して、Apacheを起動し、何度かアクセスしてログに記録します。それでは、fluentdがログを記録しているか見てみましょう。

■ ログ確認

[cc lang='bash' ]
[admin@mega21 ~]$ cd /opt/fluentd/log
[admin@mega21 log]$ ls -la
合計 12
drwxr-xr-x 2 root root 4096 8月 7 20:44 2012 .
drwxr-xr-x 4 root root 4096 8月 7 20:41 2012 ..
-rw-r--r-- 1 root root 244 8月 7 20:44 2012 access_log.20120807.b4c6ab84896ac77f7
[admin@mega21 log]$ cat access_log.20120807.b4c6ab84896ac77f7
2012-08-07T20:44:09+09:00 apache.access {"host":"::1","user":"-","method":"GET","path":"/","code":"200","size":"12","referer":"-","agent":"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2"}
2012-08-07T20:44:46+09:00 apache.access {"host":"192.168.0.135","user":"-","method":"GET","path":"/","code":"200","size":"12","referer":"-","agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.57 Safari/537.1"}
2012-08-07T20:44:46+09:00 apache.access {"host":"192.168.0.135","user":"-","method":"GET","path":"/favicon.ico","code":"404","size":"287","referer":"-","agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.57 Safari/537.1"}
2012-08-07T20:45:17+09:00 apache.access {"host":"192.168.0.135","user":"-","method":"GET","path":"/","code":"304","size":"-","referer":"-","agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.57 Safari/537.1"}
[/cc]

ここまでの手順で、ApacheのログをfluentdがJSON形式で取得することができました。次回は、growthforecastでJSON形式のログをグラフにしてみたいと思います。