My blog

Add intelligent tagline here

[pandorafms][postgresql]fluentdとfluent-plugin-pghstoreとpandorafmsでログ収集、可視化、監視を行う

前回の記事 で報告したように、fluent-plugin-pghstoreでログをPostgreSQLに貯めることができました。

次は可視化と監視を行います。ここで、最近使ってみている Pandora FMS を使います。

pluginを準備

まずは以下のスクリプトを保存し、pandora/etc/pandora/plugins以下に置きます。DBやTABLEは適宜書き換えてください。また、hostnameやportも適宜変更でお願いします。

上の方にあるSQLは過去5分間のcodeが2XXや3XXなどの割合を出してくれます。その後、PandraFMSでのplugin形式のXMLにするように整形します。

ちなみに、一つのSQLで複数を同時にcount()する方法については 複数同時にcount() をどうぞ。

#!/usr/bin/env sh

DB=logdb
TABLE=apache_log

SQL=`cat <<EOT
SELECT \
        ROUND(100 * (s.C_2XX::numeric / s.all::numeric), 1) AS C_2, \
        ROUND(100 * (s.C_3XX::numeric / s.all::numeric), 1) AS C_3, \
        ROUND(100 * (s.C_4XX::numeric / s.all::numeric), 1) AS C_4, \
        ROUND(100 * (s.C_5XX::numeric / s.all::numeric), 1) AS C_5, \
        s.all AS count \
FROM( \
        SELECT  \
              count(*) AS all, \
              count(CASE WHEN record->'code' LIKE '2__' THEN 1 END) AS C_2XX, \
              count(CASE WHEN record->'code' LIKE '3__' THEN 1 END) AS C_3XX, \
              count(CASE WHEN record->'code' LIKE '4__' THEN 1 END) AS C_4XX, \
              count(CASE WHEN record->'code' LIKE '5__' THEN 1 END) AS C_5XX \
        FROM $TABLE WHERE time > (CURRENT_TIMESTAMP - interval '5 min') \
)s
EOT`

RESULT=`psql -At -F " " $DB -c "$SQL"`

count=0
for p in $RESULT
do
  case $count in
     0)
       name="http_status_2XX"
       desc="HTTP Status Code percentage"
     ;;
     1)
       name="http_status_3XX"
       desc="HTTP Status Code percentage"
     ;;
     2)
       name="http_status_4XX"
       desc="HTTP Status Code percentage"
     ;;
     3)
       name="http_status_5XX"
       desc="HTTP Status Code percentage"
     ;;
     4)
       name="http_access_count"
       desc="access count"
     ;;
  esac
  echo "<module>"
  echo "  <name><![CDATA[${name}]]></name>"
  echo "  <type><![CDATA[generic_data]]></type>"
  echo "  <data><![CDATA[${p}]]></data>"
  echo "  <description><![CDATA[$desc]]></description>"
  echo "</module>"
  count=`expr $count + 1`
done

あとは、pandora_agent.conf に以下の一行を足してください。

module_plugin http_access_status.sh

はい、終わりです。module作成は簡単ですね。

グラフ化

ここまで出来ればあとはPandoraFMS側でできます。

レポート管理 -> グラフビルダー で各ステータスコードの塗り潰しの積み上げグラフを作成します。

そうすると、こんな感じのグラフがリアルタイムで出てきます。

http://f.hatena.ne.jp/images/fotolife/r/rudi/20120410/20120410220903.jpg

途中紫色が増えているのはアラートのテストを兼ねて試しに入れてみたものです。

監視

PandoraFMSは監視システムです。ですので、 4XXや5XXが25%を越えたら通知を出す、なんてことも簡単に出来ます。

ここでは詳しく述べませんので、 http://www.openideas.info/wiki/index.php?title=Pandora_3.0:Documentation_ja:Alerts こちらをご覧ください。

まとめ

fluentd + fluent-plugin-pghstore + PostgreSQL + Pandora FMSで

  • ログ収集
  • 可視化
  • 監視 + アラート

が一気通貫で行えるようになりました。

今回試したものは、fluent-plugin-datacounter + out_growthforecast + growthforecast + nagiosで可能です。しかし、fluent-plugin-pghstoreを使った場合、SQLでいろいろな処理ができますので、アイデア次第で今回のStatus Code以外にも使えると思います。