[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側でできます。
レポート管理 -> グラフビルダー で各ステータスコードの塗り潰しの積み上げグラフを作成します。
そうすると、こんな感じのグラフがリアルタイムで出てきます。
途中紫色が増えているのはアラートのテストを兼ねて試しに入れてみたものです。
監視
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以外にも使えると思います。
[postgresql]それPostgreSQLで出来るよ - twitter_fdw
pyfesで「それPostgreSQLでできるよ」ってつぶやいた手前、ちゃんと試さなければなりません。
PostgreSQL 9.1から外部データラッパ(FDW) という規格がサポートされました。 またさらに、このFDWを使ってTwitterのAPIを叩いて結果をテーブルとして出 してくれる twiter_fdw という拡張が 公開 されています。
準備
% sudo apt-get install libcurl4-openssl-dev (libjsonもいるかも)
% curl -O http://api.pgxn.org/dist/twitter_fdw/1.0.0/twitter_fdw-1.0.0.zip
% unzip twitter_fdw
% cd twitter_fdw
% make
% sudo su
# export USE_PGXS=1
# make install
DBの作成して、twitter拡張をDBに入れます。
% createdb twitter
% psql -c "CREATE EXTENSION twitter_fdw" twitter
さて、これで準備は終わりです。
使ってみる
% psql twitter
twitter=# SELECT from_user, created_at, text FROM twitter WHERE q = '#pyfes';
from_user | created_at | text
----------------------------------------------------
tw_ox | 2012-03-19 13:43:58 | RT @zusaar: 【新着イベント】Python Developers Festa (一般枠) #pyfes #pyspa http://t.co/X9SyQ0hg #zusaar #イベント #eventjp
inoshiro | 2012-03-19 10:46:58 | RT @shomah4a: 少ないけど写真上げました https://t.co/aqvDAjrC #pyfes
shomah4a | 2012-03-19 10:32:03 | 少ないけど写真上げました https://t.co/aqvDAjrC #pyfes
tcsh | 2012-03-19 10:14:06 | RT @tk0miya: Sphinx ハンズオンの資料(サンプル)です。 http://t.co/TzokaIJ2 #sphinxjp #pyfes
中身はTwitter APIを叩いているだけなので、残念ながら WHERE from_user =’’ とは書けません。投稿者を探すにはqの中にfrom:をつけます。 詳しくは https://dev.twitter.com/docs/using-search を見てください。
twitter=# SELECT from_user, text FROM twitter WHERE q = 'from:voluntas' limit 5;
from_user | text
-----------------------------------------------
voluntas | @Surgo お、一口書いとくね
voluntas | @turky や一口とか提示しなかったので、再度確認します。イメージは一口 1000 円で問題ないです。
voluntas | @turky ちょw ブログにまとめます。
voluntas | 支援は一人1000円として 15000 円位か。
voluntas | 姉に Twitter Bot の作り方を聞かれている
ちなみにdefaultでは15件までしか出ませんが以下のようにしてあげると100件まで出るようになります。
- appendStringInfo(&buf, "q=%s",
+ appendStringInfo(&buf, "q=%s&rpp=100",
いろいろしてみる
# SELECT to_user, count(to_user) FROM twitter WHERE q =
'from:voluntas' GROUP BY to_user ORDER BY count(to_user) desc limit 10
to_user | count
----------------+-------
tokoroten | 8
Seasons | 7
heavenshell | 6
sawonya | 4
turky | 3
tokibito | 3
yokatsuki | 3
mkouhei | 3
mopemope | 3
Surgo | 2
fdwいいよfdw