Bash-Scripting - Munin Plugin não funciona

5

Eu escrevi um plugin munin para contar os códigos http-status do lighttpd. O script:

#!/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

Se eu executar o script na máquina local, ele funcionará perfeitamente:

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 

Mas Munin não mostra nenhum gráfico: link

Eu testei o Plugin do munin-server via 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.

Você pode ver no script que value = U é impresso apenas, quando o script não pode verificar o access.log do lighttpd. Mas por que o script não pode fazê-lo, quando rodando via munin, e quando rodando na máquina local, tudo está ok?

Existe algum bug no meu script? Eu não faço ideia. Obrigado por ajudar!

    
por Arny80Hexa 19.12.2011 / 17:07

3 respostas

3

Não verifique scripts munin com apenas scripts diretos em execução. É errado. Existe um script perl especial munin-run que executa scripts exatamente da mesma forma que é executado durante a atualização do munin e você poderá encontrar todos os erros. Pode ser que você precise definir configurações especiais para seu script. Você pode fazer isso no seguinte arquivo /etc/munin/plugin-conf.d/munin-node :

[script_file_mask_*]
user USER_FOR_YOR_SCRIPT
env.VARIABLE some_variable

No seu caso, parece que o script não se ajustou ao arquivo de log. Então adicione

[lighttpd_*]
user root

em /etc/munin/plugin-conf.d/munin-node e reinicie o nó munin. Deve ajudar.

    
por 19.12.2011 / 19:19
2

Eu não sei se você já conseguiu consertar isso sozinho, mas eu fiz e pensei em compartilhar minha solução.

Rush estava certo em sugerir que ele fosse executado como root, mas o erro real parece estar na sua escolha de nome para seus campos (1xx, 2xx, 3xx, ...). De acordo com esta página da wiki :

Each data source in a plugin must be identified by a field name. The following describes the name of the field:
* The characters must be [a-zA-Z0-9_], while the first character must be [a-zA-Z_].

É por isso que você só viu 5xx no seu gráfico e não obteve resultados. Ao criar os arquivos rdd, munin substituiu os números por um sublinhado (como _xx), o que significava que os dados eram sobrescritos para cada um dos 5 campos. A solução mais fácil é adicionar uma letra aos seus nomes de campo da seguinte forma:

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

Assim eu consegui que seu script funcionasse perfeitamente.

    
por 07.07.2012 / 22:54
0

Verifique em /etc/munin/munin-node.conf qual nome de usuário sob munin é executado e se esse usuário pode ler os arquivos de log lighttpd.

    
por 19.12.2011 / 17:10