うちの会社ではzabbixを使ってサーバの監視をしていますが、リソースの使用率のグラフ化やアラートの設定条件など、おおむねその機能に満足しています。しかし唯一不満な部分があります。それは、ログ監視。
たとえばTomcatのCatalina.logを監視していて、OutOfMemoryが出力されたらアラートを上げるように設定すると、出力行数だけ障害メールが飛んできて、さらにすぐさまリカバリーが来るという、なんともいただけない仕様なのです。
ひどいときは、それで200通以上のメールが携帯に届くこともあります。
最近fluentdを導入したこともあり、ログの集計結果を監視に利用できないかと考えたら、意外とすんなりできたのでご紹介します。
【監視対象サーバに必要なもの】
fluentd
fluent-plugin-zabbix
fluent-plugin-datacounter
fluent-plugin-forest
(1)監視対象サーバに必要なものをインストール
(2)fluentd.confに以下の設定をする。
以下の設定では、/opt/tomcat7/logs/catalina.out にOutofMemoryErrorが出ていないか監視します。
これにより毎分、OutOfMemoryErrorが難行出力されているかカウントし、結果をzabbixサーバに送るようになります。
【fluentd.conf】
<source>
type tail
path /opt/tomcat7/logs/catalina.out
tag java.tomcat.hoge
format /^(?<message>.*)$/
rotate_wait 60
pos_file /var/lib/fluentd/catalina.out.pos
</source>
<match java.tomcat.**>
type forest
subtype datacounter
remove_prefix java.tomcat
<template>
count_key message
outcast_unmatched true
aggregate all
tag javalog.__TAG__
pattern1 oom ^.*OutOfMemoryError.*$
</template>
</match>
<match javalog.**>
type forest
subtype zabbix
remove_prefix javalog
<template>
zabbix_server zabbix01.fuga.com
host __TAG__
name_key_pattern .*_count
</template>
</match>
(3)zabbixサーバにホスト、キー、トリガーを追加
ホスト名 hoge
キー oom_count
トリガー {Template:oom_count.count(300,0,"gt")}>0
以上でほかの監視と同じように、ログ監視にいろいろなトリガー条件を使うことができるようになります。
また、ほかの文字列を監視したい場合は、pattern1 oom ^.*OutOfMemoryError.*$ の下に、同じようにpattern2を書いてあげて、zabbixサーバにキー、トリガーを追加すればOK。
ログ形式をパースしていないので、どんなログにも使えます。
また、上の設定ではfluent-plugin-forestを使ってますが、中継fluentdサーバを使わないのであればいりません。
中継サーバがある場合は、fluent-plugin-forestを使ったほうが断然設定が短くなります。
上の設定だと、<source>で定義しているタグ中にホスト名を入れているので、ほかのサーバで同じことをしたい場合に中継サーバの設定をいじらなくて済みます。
fluentdはまだ使い始めたばかりですが、今後もちょっと便利な使い方を見つけたら、書いていきます。
たとえばTomcatのCatalina.logを監視していて、OutOfMemoryが出力されたらアラートを上げるように設定すると、出力行数だけ障害メールが飛んできて、さらにすぐさまリカバリーが来るという、なんともいただけない仕様なのです。
ひどいときは、それで200通以上のメールが携帯に届くこともあります。
最近fluentdを導入したこともあり、ログの集計結果を監視に利用できないかと考えたら、意外とすんなりできたのでご紹介します。
【監視対象サーバに必要なもの】
fluentd
fluent-plugin-zabbix
fluent-plugin-datacounter
fluent-plugin-forest
(1)監視対象サーバに必要なものをインストール
(2)fluentd.confに以下の設定をする。
以下の設定では、/opt/tomcat7/logs/catalina.out にOutofMemoryErrorが出ていないか監視します。
これにより毎分、OutOfMemoryErrorが難行出力されているかカウントし、結果をzabbixサーバに送るようになります。
【fluentd.conf】
<source>
type tail
path /opt/tomcat7/logs/catalina.out
tag java.tomcat.hoge
format /^(?<message>.*)$/
rotate_wait 60
pos_file /var/lib/fluentd/catalina.out.pos
</source>
<match java.tomcat.**>
type forest
subtype datacounter
remove_prefix java.tomcat
<template>
count_key message
outcast_unmatched true
aggregate all
tag javalog.__TAG__
pattern1 oom ^.*OutOfMemoryError.*$
</template>
</match>
<match javalog.**>
type forest
subtype zabbix
remove_prefix javalog
<template>
zabbix_server zabbix01.fuga.com
host __TAG__
name_key_pattern .*_count
</template>
</match>
(3)zabbixサーバにホスト、キー、トリガーを追加
ホスト名 hoge
キー oom_count
トリガー {Template:oom_count.count(300,0,"gt")}>0
以上でほかの監視と同じように、ログ監視にいろいろなトリガー条件を使うことができるようになります。
また、ほかの文字列を監視したい場合は、pattern1 oom ^.*OutOfMemoryError.*$ の下に、同じようにpattern2を書いてあげて、zabbixサーバにキー、トリガーを追加すればOK。
ログ形式をパースしていないので、どんなログにも使えます。
また、上の設定ではfluent-plugin-forestを使ってますが、中継fluentdサーバを使わないのであればいりません。
中継サーバがある場合は、fluent-plugin-forestを使ったほうが断然設定が短くなります。
上の設定だと、<source>で定義しているタグ中にホスト名を入れているので、ほかのサーバで同じことをしたい場合に中継サーバの設定をいじらなくて済みます。
fluentdはまだ使い始めたばかりですが、今後もちょっと便利な使い方を見つけたら、書いていきます。
PR
巷で話題のfluentを、導入してみることにした。
だが、gem install fluent ってやるのはいかがなものか。
rubyのバージョンもあるが、いろいろなパッケージが勝手に入って、精神衛生上よろしくない。
fedoraをつかってるので、できればRPMにしたい。
でもSPECファイル書くの面倒くさいなぁと思っていたら、意外にも簡単にできました。
ざっくり流れを書くと
(1)td-agentのSRPMをもってくる。
(2)fluentの最新ソースをダウンロード
(3)td-agentパッケージを解凍して、SPECファイルを編集
(4)td-agentにはいっているautogen.sh、Makefile.amをfluentdのディレクトリにコピーし、編集
(5)fluentdをtarでアーカイブ
(6)ビルドに必要なライブラリ(libyaml-devel)をインストール
(7)rpmbuildでパッケージ化
ってなもんです。
他人のふんどしで相撲を取ってるようなもんですけど、以下に詳細な手順を記します。
【パッケージ作成手順】
(1)td-agentのSRPMSをもってくる。
ここ からパッケージをもってくる。(今回は、td-agent-1.1.3.1 を使いました。)
ちなみに、rpmパッケージは以下のコマンドで解凍できます。
# rpm2cpio td-agent-1.1.3.1-0.src.rpm | cpio -id
(2)fluentの最新ソースをダウンロード
ここから最新のfluentのソースをもってきます。
開発が活発なので、ひと月もたつとすっかり古くなります。
(3)td-agentパッケージを解凍して、SPECファイルなどを編集
SRPMを解凍して中身を修正します。
1 SPECファイルの編集
文字列"td-agent"を"fluentd"に置換します。
# sed -i s/td-agent/fluentd/g td-agent.spec
また、Version:を今回入れるfluentdのバージョンにします。
2 ファイル名変更
td-agent.init → fluentd.init
td-agent.spec → fluentd.spec
(4)td-agent-xx.xx.xx.tar.gzにはいっている以下のファイルをfluentdのディレクトリにコピーし、編集
・autogen.sh
一緒にコンパイルするruby、その他モジュールのバージョンを変更します。
せっかくなので、新しいバージョンでパッケージ。
download "http://ftp.ruby-lang.org/pub/ruby/1.9" "ruby-1.9.3-p125.tar.bz2"
download "http://rubygems.org/downloads" "json-1.6.6.gem"
download "http://rubygems.org/downloads" "msgpack-0.4.6.gem"
download "http://rubygems.org/downloads" "iobuffer-0.1.3.gem"
download "http://rubygems.org/downloads" "cool.io-1.1.0.gem"
download "http://rubygems.org/downloads" "http_parser.rb-0.5.3.gem"
download "http://rubygems.org/downloads" "yajl-ruby-1.1.0.gem"
download "http://rubygems.org/downloads" "jeweler-1.8.3.gem"
download "http://rubygems.org/downloads" "psych-1.3.2.gem"
・Makefile.am
一緒にパッケージ化したいプラグインを追加します。
PLUGINS = \
fluent-plugin-td-0.10.6.gem \
fluent-plugin-hoop-0.1.2.gem \
fluent-plugin-zabbix-0.0.1.gem \
fluent-plugin-scribe-0.10.7.gem \
fluent-plugin-hipchat-0.1.0.gem \
fluent-plugin-forest-0.1.0.gem \
fluent-plugin-cassandra-0.0.2.gem \
fluent-plugin-mongo-0.6.7.gem
また、td-agentという文字列をfluentdに一括置換します。
# sed -i -e s/td-agent/fluentd/g Makefile.am
・td-agent.prelink.conf
ファイル名を、fluentd.prelink.confに変更します。
・configure.in
そのままコピーします。
・td-agent.conf
fluentd.confとしてコピーします。
(5)fluentdをtarでアーカイブ
ディレクトリ名をfluentd-0.10.18 のような名前にして、fluentd-0.10.18.tar.gzのように
アーカイブします。
これを、td-agent-xx.xx.xx.tar.gzと入れ替えます。
(5)ビルドに必要なライブラリ(libyaml-devel)をインストール
fedoraだと、標準のリポジトリにあるので、yum install libyaml-devel すればよいです。
CentOSだと用意されていないので、EPELから持ってきてください。
→td-agent-1.1.4では、BuildRequiresにlibyaml-develが追加されたようで、ないと先に進めません。
1.1.3ではエラーは出るがとりあえずコンパイルが走った。
(6)rpmbuildでパッケージ化
あとは、各ファイルを所定の位置に配置して、コマンドを実行です。
# rpmbuild -ba fluentd.spec (ポチっとな)
これで完了。
やっぱり SRPMがあると、パッケージ化が楽ですね。
だが、gem install fluent ってやるのはいかがなものか。
rubyのバージョンもあるが、いろいろなパッケージが勝手に入って、精神衛生上よろしくない。
fedoraをつかってるので、できればRPMにしたい。
でもSPECファイル書くの面倒くさいなぁと思っていたら、意外にも簡単にできました。
ざっくり流れを書くと
(1)td-agentのSRPMをもってくる。
(2)fluentの最新ソースをダウンロード
(3)td-agentパッケージを解凍して、SPECファイルを編集
(4)td-agentにはいっているautogen.sh、Makefile.amをfluentdのディレクトリにコピーし、編集
(5)fluentdをtarでアーカイブ
(6)ビルドに必要なライブラリ(libyaml-devel)をインストール
(7)rpmbuildでパッケージ化
ってなもんです。
他人のふんどしで相撲を取ってるようなもんですけど、以下に詳細な手順を記します。
【パッケージ作成手順】
(1)td-agentのSRPMSをもってくる。
ここ からパッケージをもってくる。(今回は、td-agent-1.1.3.1 を使いました。)
ちなみに、rpmパッケージは以下のコマンドで解凍できます。
# rpm2cpio td-agent-1.1.3.1-0.src.rpm | cpio -id
(2)fluentの最新ソースをダウンロード
ここから最新のfluentのソースをもってきます。
開発が活発なので、ひと月もたつとすっかり古くなります。
(3)td-agentパッケージを解凍して、SPECファイルなどを編集
SRPMを解凍して中身を修正します。
1 SPECファイルの編集
文字列"td-agent"を"fluentd"に置換します。
# sed -i s/td-agent/fluentd/g td-agent.spec
また、Version:を今回入れるfluentdのバージョンにします。
2 ファイル名変更
td-agent.init → fluentd.init
td-agent.spec → fluentd.spec
(4)td-agent-xx.xx.xx.tar.gzにはいっている以下のファイルをfluentdのディレクトリにコピーし、編集
・autogen.sh
一緒にコンパイルするruby、その他モジュールのバージョンを変更します。
せっかくなので、新しいバージョンでパッケージ。
download "http://ftp.ruby-lang.org/pub/ruby/1.9" "ruby-1.9.3-p125.tar.bz2"
download "http://rubygems.org/downloads" "json-1.6.6.gem"
download "http://rubygems.org/downloads" "msgpack-0.4.6.gem"
download "http://rubygems.org/downloads" "iobuffer-0.1.3.gem"
download "http://rubygems.org/downloads" "cool.io-1.1.0.gem"
download "http://rubygems.org/downloads" "http_parser.rb-0.5.3.gem"
download "http://rubygems.org/downloads" "yajl-ruby-1.1.0.gem"
download "http://rubygems.org/downloads" "jeweler-1.8.3.gem"
download "http://rubygems.org/downloads" "psych-1.3.2.gem"
・Makefile.am
一緒にパッケージ化したいプラグインを追加します。
PLUGINS = \
fluent-plugin-td-0.10.6.gem \
fluent-plugin-hoop-0.1.2.gem \
fluent-plugin-zabbix-0.0.1.gem \
fluent-plugin-scribe-0.10.7.gem \
fluent-plugin-hipchat-0.1.0.gem \
fluent-plugin-forest-0.1.0.gem \
fluent-plugin-cassandra-0.0.2.gem \
fluent-plugin-mongo-0.6.7.gem
また、td-agentという文字列をfluentdに一括置換します。
# sed -i -e s/td-agent/fluentd/g Makefile.am
・td-agent.prelink.conf
ファイル名を、fluentd.prelink.confに変更します。
・configure.in
そのままコピーします。
・td-agent.conf
fluentd.confとしてコピーします。
(5)fluentdをtarでアーカイブ
ディレクトリ名をfluentd-0.10.18 のような名前にして、fluentd-0.10.18.tar.gzのように
アーカイブします。
これを、td-agent-xx.xx.xx.tar.gzと入れ替えます。
(5)ビルドに必要なライブラリ(libyaml-devel)をインストール
fedoraだと、標準のリポジトリにあるので、yum install libyaml-devel すればよいです。
CentOSだと用意されていないので、EPELから持ってきてください。
→td-agent-1.1.4では、BuildRequiresにlibyaml-develが追加されたようで、ないと先に進めません。
1.1.3ではエラーは出るがとりあえずコンパイルが走った。
(6)rpmbuildでパッケージ化
あとは、各ファイルを所定の位置に配置して、コマンドを実行です。
# rpmbuild -ba fluentd.spec (ポチっとな)
これで完了。
やっぱり SRPMがあると、パッケージ化が楽ですね。
ブログ内検索
カテゴリー
最新記事
(11/08)
(11/07)
(12/27)
(12/07)
(09/28)
最新トラックバック
プロフィール
HN:
アフロ
性別:
非公開
リコメンド