このエントリを読んでからfluentdを導入したいと思ってたのですが、手元に頑張って監視するに値するサーバが無くてほったらかしてました。最近Bargain Netが監視しても良いかな位になったのでfluentdを導入してみました。先ほどのリンク中のスライドでzabbixにグラフを書かせてたので、真似してzabbixもついでに導入しています。
まずfluentdをインストールします。td-agentという名前でRPMパッケージが提供されていますので、そちらを利用します。
$ vi /etc/yum.repos.d/td.repo --- [treasuredata] name=TreasureData baseurl=http://packages.treasure-data.com/redhat/$basearch gpgcheck=0 $ sudo yum install td-agent $ sudo chkconfig td-agent on $ sudo service td-agent start
次に動作確認します。/usr/lib64/fluent/ruby/bin/に色々とコマンドがインストールされているので、一度眺めておくと良いかもしれません。以下ではその中のfluent-catを使ってログを書いてみます。すると/var/log/td-agentの下にtest***というファイルが出来ていたら成功です。中を確認するとfluent-catで書いた内容が出力されています。
$ sudo vim /etc/td-agent/td-agent.conf # 下記を追加 --- <match test> type file path /var/log/fluent/test </match> $ sudo service td-agent restart $ echo '{"msg":"Hello Fluent World!"}' | /usr/lib64/fluent/ruby/bin/fluent-cat test $ cat /var/log/td-agent/test.20130126.b4d41f241cb8da90a 2013-01-26T01:08:41+09:00 test {"msg":"Hello Fluent World!"}
次にzabbixをインストールします。監視サーバにzabbix-serverを、監視対象ホストにはzabbix-agentをそれぞれインストールします。またzabbix-serverにはバックエンドにmysqlを使う場合、postgresqlを使う場合でパッケージが別に用意されています。ここではmysqlを使用しています。まず監視サーバにzabbixをインストールします。監視サーバ自体も監視対象なのでserverとagentの両方を
インストールしています。
$ sudo yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent $ mysql -uroot -p mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix_pass'; mysql> flush privileges; mysql> exit $ cd /usr/share/doc/zabbix-server-mysql-1.8.15 $ mysql -uroot -p zabbix < /usr/share/doc/zabbix-server-mysql-1.8.15/create/schema/mysql.sql $ mysql -uroot -p zabbix < /usr/share/doc/zabbix-server-mysql-1.8.15/create/data/data.sql $ mysql -uroot -p zabbix < /usr/share/doc/zabbix-server-mysql-1.8.15/create/data/images_mysql.sql $ sudo vim /etc/zabbix/zabbix_server.conf # DBPasswordを設定 $ sudo vim /etc/zabbix/zabbix_agentd.conf # Hostnameを指定 $ sudo chkconfig zabbix-server on $ sudo chkconfig zabbix-agent on $ sudo service zabbix-server start $ sudo service zabbix-agent start $ sudo service httpd restart
インストール出来たら、http://hostname/zabbixにブラウザでアクセスします。初期設定用のウィザードが表示されるので、次へを押して行くと、エラーが出ました。PHPの設定を変えないとダメなようです。
仕方が無いのでphp.iniを編集します。recommendedの値にしました。
$ sudo vim /etc/php.ini # エラーに従って下記内容に編集 # memory_limit = 256M # post_max_size = 32M # upload_max_filesize = 16M # max_execution_time = 600 # max_input_time = 600 $ sudo service httpd restart
無事設定できました。あと監視対象ホストにもzabbix-agentを入れておきます。
さて設定は完了したものの、zabbixにホストを追加すると幾つかエラーが出ていました。テンプレートとホストのミスマッチが原因なので、このエントリ等を参考に修正します。
以上でfluentもzabbixもインストール出来たので、早速ログを元にステータスコードとレスポンスタイムをグラフにします。まずはプラグインをインストールします。
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-datacounter $ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-zabbix
次にfluentの設定をして行きます。僕はnginxではなくてuwsgiのログを元にグラフを書きたいので、以下のような設定にしました。
# uwsgiのログを吸い上げる <source> type tail format /^\[(?<meta>[^\]]*)\] (?<host>[^ ]*) \(\) {[^}]*} \[(?<time>[^\]]*)\] (?<method>\S+) (?<path>[^ ]+) => generated (?<bytes>[^ ]*) bytes in (?<response_time>[^ ]*) msecs \(HTTP\/1.1 (?<code>[^ ]*)\) .*$/ time_format %a %b %d %H:%M:%S %Y path /path/to/uwsgi.log tag bargainnet.uwsgi </source> # uwsgiのログをカウンターに食わせる <match bargainnet.uwsgi> type copy # ステータスコード <store> type datacounter count_key code aggregate all tag stats.datacount.bargainnet.uwsgi.status pattern1 2xx 2\d\d pattern2 3xx 3\d\d pattern3 4xx 4\d\d pattern4 5xx 5\d\d </store> # レスポンスタイム <store> type datacounter count_key response_time tag stats.datascount.bargainnet.uwsgi.response_time aggregate all pattern1 0-100msec ^\d{1,2}$ pattern2 100-200msec ^1\d{2}$ pattern3 200-500msec ^[2-4]\d{2}$ pattern4 500msec-1sec ^[5-9]\d{2}$ pattern5 1sec_over ^\d{4,}$ </store> </match> # ステータスコードをzabbixサーバに送る <match stats.datacount.bargainnet.uwsgi.status> type zabbix zabbix_server hostname.of.zabbix host bargain-net.info name_key_pattern [2345]xx_rate add_key_prefix uwsgi </match> # レスポンスタイムをzabbixサーバに送る <match stats.datascount.bargainnet.uwsgi.response_time> type zabbix zabbix_server hostname.of.zabbix host bargain-net.info name_key_pattern \w+_percentage add_key_prefix uwsgi </match>
次にzabbix側でfluentから送られてくるデータを受け取るアイテムを追加します。内容はこんな感じです。僕はTypeを”Zabbix trapper”にして無くて少しハマりました。
後はせっせとアイテムを追加して、まとめてグラフにしたらこんなグラフになりました。嬉しいです。
fluentは凄く良くて、もっと早く導入すれば良かったと思いました。個人的にはfluentでログを一回吸うプロセスがが良いです。
/var/log以下とかドラクエでいうとネクロゴンドの洞窟みたいな感じじゃないですか。できれば行きたくないし早く立ち去りたい。でもfluentでuwsgi.logだけ吸うと、凄い気が楽です。ログと向き合おうって気になります。ちょっとずつfluentでカバー出来るログを増やして行きたいです。
あとfluentって別にいわゆるログに縛られない雰囲気なんですよね。plaggerがホスト跨いで使えるようになった感じです。まだプラグインとか触ってないんですが、もっと色々応用出来る気がします。