CentOSでfluentdとzabbixを使い始めたメモ

このエントリを読んでから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の設定を変えないとダメなようです。
zabbix php error
仕方が無いので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 installation success

さて設定は完了したものの、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”にして無くて少しハマりました。
create item on zabbix

後はせっせとアイテムを追加して、まとめてグラフにしたらこんなグラフになりました。嬉しいです。

fluentは凄く良くて、もっと早く導入すれば良かったと思いました。個人的にはfluentでログを一回吸うプロセスがが良いです。

/var/log以下とかドラクエでいうとネクロゴンドの洞窟みたいな感じじゃないですか。できれば行きたくないし早く立ち去りたい。でもfluentでuwsgi.logだけ吸うと、凄い気が楽です。ログと向き合おうって気になります。ちょっとずつfluentでカバー出来るログを増やして行きたいです。

あとfluentって別にいわゆるログに縛られない雰囲気なんですよね。plaggerがホスト跨いで使えるようになった感じです。まだプラグインとか触ってないんですが、もっと色々応用出来る気がします。

Leave a Reply

Your email address will not be published. Required fields are marked *