私はlighttpdのhttp-statuscodesを数えるためにmunin-pluginを書きました。スクリプト:
#!/bin/bash
######################################
# Munin-Script: Lighttpd-Statuscodes #
######################################
##Config
# path to lighttpd access.log
LIGHTTPD_ACCESS_LOG_PATH="/var/log/lighttpd/access.log"
# rows to parse in logfile (higher value incrase time to run plugin. if value to low you may get bad counting)
LOG_ROWS="200000"
#
#munin
case $1 in
autoconf) # check config
AVAILABLE=`ls $LIGHTTPD_ACCESS_LOG_PATH`
if [ "$AVAILABLE" = "$LIGHTTPD_ACCESS_LOG_PATH" ]; then
echo "yes"
else
echo "No: "$AVAILABLE
echo "Please check your config!"
fi
exit 0;;
config) # graph config
cat <<'EOM'
graph_title Lighhtpd Statuscodes
graph_vlabel http-statuscodes / min
graph_category lighttpd
1xx.label 1xx
2xx.label 2xx
3xx.label 3xx
4xx.label 4xx
5xx.label 5xx
EOM
exit 0;;
esac
## calculate
AVAILABLE=`ls $LIGHTTPD_ACCESS_LOG_PATH`
if [ "$AVAILABLE" = "$LIGHTTPD_ACCESS_LOG_PATH" ]; then
TIME_NOW=`date`
CODE_1xx="0"
CODE_2xx="0"
CODE_3xx="0"
CODE_4xx="0"
CODE_5xx="0"
for i in 1 2 3 4 5; do
TIME5=`date +%d/%b/%Y:%k:%M --date "$TIME_NOW -"$i"min"`
CODE_1xx=$(( $CODE_1xx + `tail -n $LOG_ROWS $LIGHTTPD_ACCESS_LOG_PATH | grep "$TIME5" | grep 'HTTP/1.1" 1' | grep -c " "` ))
CODE_2xx=$(( $CODE_2xx + `tail -n $LOG_ROWS $LIGHTTPD_ACCESS_LOG_PATH | grep "$TIME5" | grep 'HTTP/1.1" 2' | grep -c " "` ))
CODE_3xx=$(( $CODE_3xx + `tail -n $LOG_ROWS $LIGHTTPD_ACCESS_LOG_PATH | grep "$TIME5" | grep 'HTTP/1.1" 3' | grep -c " "` ))
CODE_4xx=$(( $CODE_4xx + `tail -n $LOG_ROWS $LIGHTTPD_ACCESS_LOG_PATH | grep "$TIME5" | grep 'HTTP/1.1" 4' | grep -c " "` ))
CODE_5xx=$(( $CODE_5xx + `tail -n $LOG_ROWS $LIGHTTPD_ACCESS_LOG_PATH | grep "$TIME5" | grep 'HTTP/1.1" 5' | grep -c " "` ))
done
CODE_1xx=$(( $CODE_1xx / 5 ))
CODE_2xx=$(( $CODE_2xx / 5 ))
CODE_3xx=$(( $CODE_3xx / 5 ))
CODE_4xx=$(( $CODE_4xx / 5 ))
CODE_5xx=$(( $CODE_5xx / 5 ))
echo "1xx.value "$CODE_1xx
echo "2xx.value "$CODE_2xx
echo "3xx.value "$CODE_3xx
echo "4xx.value "$CODE_4xx
echo "5xx.value "$CODE_5xx
else
echo "1xx.value U"
echo "2xx.value U"
echo "3xx.value U"
echo "4xx.value U"
echo "5xx.value U"
fi
ローカルマシンでスクリプトを実行すると、完全に実行されます。
root@server1 /etc/munin/plugins # ll
lrwxrwxrwx 1 root root 45 2011-12-19 15:23 lighttpd_statuscodes -> /usr/share/munin/plugins/lighttpd_statuscodes*
root@server1 /etc/munin/plugins # ./lighttpd_statuscodes autoconf
yes
root@server1 /etc/munin/plugins # ./lighttpd_statuscodes config
graph_title Lighhtpd Statuscodes
graph_vlabel http-statuscodes / min
graph_category lighttpd
1xx.label 1xx
2xx.label 2xx
3xx.label 3xx
4xx.label 4xx
5xx.label 5xx
root@server1 /etc/munin/plugins #./lighttpd_statuscodes
1xx.value 0
2xx.value 5834
3xx.value 1892
4xx.value 0
5xx.value 0
しかし、Muninはグラフを表示しません: http://s1.directupload.net/images/111219/3psgq3vb.jpg
Munin-serverからtelnet経由でプラグインをテストしました。
root@munin-server /etc/munin/plugins/ # telnet 123.123.123.123 4949
Trying 123.123.123.123...
Connected to 123.123.123.123.
Escape character is '^]'.
# munin node at server1.cluster1
fetch lighttpd_statuscodes
1xx.value U
2xx.value U
3xx.value U
4xx.value U
5xx.value U
.
Connection closed by foreign Host.
スクリプトでlighttpdのaccess.logをチェックできない場合、value = Uのみが出力されることがわかります。しかし、muninを介して実行している場合、およびローカルマシンで実行している場合、スクリプトで実行できないのはなぜですか?
Bashスクリプトにバグはありますか?何も思いつきません。助けてくれてありがとう!
直接スクリプトを実行しているだけでmuninスクリプトをチェックしないでください。それは間違った方法です。 muninの更新時に実行するのとまったく同じ方法でスクリプトを実行する特別なPerlスクリプトmunin-run
があり、すべてのエラーを見つけることができます。スクリプト用に特別な設定を定義する必要があるかもしれません。次の方法で/etc/munin/plugin-conf.d/munin-node
ファイルでそれを行うことができます:
[script_file_mask_*]
user USER_FOR_YOR_SCRIPT
env.VARIABLE some_variable
あなたの場合、スクリプトはログファイルを読み取るためにtighrを持っていないようです。だから追加
[lighttpd_*]
user root
/etc/munin/plugin-conf.d/munin-node
で、munin-nodeを再起動します。それは役立つはずです。
自分でこれを修正できたかどうかはわかりませんが、修正したので、解決策を共有したいと思いました。
ラッシュはそれをrootとして実行することを提案したのは正しかったが、本当のエラーはフィールドの名前(1xx、2xx、3xx、...)の選択にあるようだ。 このwikiページ :
プラグインの各データソースは、フィールド名で識別する必要があります。次に、フィールドの名前について説明します。
*文字は[a-zA-Z0-9 _]、である必要があり、最初の文字は[a-zA-Z _]。
これが、グラフに5xxしか表示されず、結果が表示されない理由です。 rddファイルの作成中に、muninは数字をアンダースコア(_xxなど)に置き換えました。これは、5つのフィールドのそれぞれについてデータが上書きされたことを意味します。簡単な修正は、次のようにフィールド名に文字を追加することです。
graph_category lighttpd
T1xx.label 1xx
T2xx.label 2xx
T3xx.label 3xx
T4xx.label 4xx
T5xx.label 5xx
EOM
echo "T1xx.value "$CODE_1xx
echo "T2xx.value "$CODE_2xx
echo "T3xx.value "$CODE_3xx
echo "T4xx.value "$CODE_4xx
echo "T5xx.value "$CODE_5xx
else
echo "T1xx.value U"
echo "T2xx.value U"
echo "T3xx.value U"
echo "T4xx.value U"
echo "T5xx.value U"
fi
このように、私はあなたのスクリプトを完全に機能させました。
チェックイン/ etc/munin/munin-node.conf muninの下で実行されているユーザー名、およびそのユーザーがlighttpdログファイルを読み取れるかどうか。