Monitorar servidor Apache pelo Zabbix

Estou com este post pronto deste 18/07/2012, porém esqueci de agendar a data da postagem e só agora, revisando meus posts, vi que este ainda não estava ativo. Mas agora ele está aí.

Outro dia estava procurando detalhes de como monitorar o servidor Apache pelo Zabbix e encontrei um texto na Wiki do Zabbix. No tópico da Wiki tem três métodos explicando como fazer o monitoramento do servidor Apache, dois com Python e um em bash script.

Na Wiki tem disponível o código do script e uma template para coletar os itens.

Eu modifiquei o script para tornar a consulta mais rápida usando fgrep e awk ao invés de dar um echo no arquivo temporário e logo em seguida usar grep e awk, como no script disponível na Wiki.



Crie o seguinte script com o nome apache.sh e salve onde achar necessário (eu coloco os meus scripts em /opt/zabbix/externalscripts/):

#!/bin/bash
host="localhost"
resposta=0
tmp="/opt/zabbix/tmp/apache_status"
pega_status=`wget --quiet -O $tmp http://$host/server-status?auto`
case $1 in
   TotalAccesses)
      $pega_status
      fgrep "Total Accesses:" $tmp | awk '{print $3}'
      resposta=$?;;
   TotalKBytes)
      $pega_status
      fgrep "Total kBytes:" $tmp | awk '{print $3}'
      resposta=$?;;
   Uptime)
      $pega_status
      fgrep "Uptime:" $tmp | awk '{print $2}'
      resposta=$?;;
   ReqPerSec)
      $pega_status
      fgrep "ReqPerSec:" $tmp | awk '{print $2}'
      resposta=$?;;
   BytesPerSec)
      $pega_status
      fgrep "BytesPerSec:" $tmp | awk '{print $2}'
      resposta=$?;;
   BytesPerReq)
      $pega_status
      fgrep "BytesPerReq:" $tmp | awk '{print $2}'
      resposta=$?;;
   BusyWorkers)
      $pega_status
      fgrep "BusyWorkers:" $tmp | awk '{print $2}'
      resposta=$?;;
   IdleWorkers)
      $pega_status
      fgrep "IdleWorkers:" $tmp | awk '{print $2}'
      resposta=$?;;
   WaitingForConnection)
      $pega_status
      fgrep "Scoreboard:" $tmp | awk '{print $2}'| awk 'BEGIN { FS = "_" } ; { print NF-1 }'
      resposta=$?;;
   StartingUp)
      $pega_status
      fgrep "Scoreboard:" $tmp | awk '{print $2}'| awk 'BEGIN { FS = "S" } ; { print NF-1 }'
      resposta=$?;;
   ReadingRequest)
      $pega_status
      fgrep "Scoreboard:" $tmp| awk '{print $2}'| awk 'BEGIN { FS = "R" } ; { print NF-1 }'
      resposta=$?;;
   SendingReply)
      $pega_status
      fgrep "Scoreboard:" $tmp | awk '{print $2}'| awk 'BEGIN { FS = "W" } ; { print NF-1 }'
      resposta=$?;;
   KeepAlive)
      $pega_status
      fgrep "Scoreboard:" $tmp | awk '{print $2}'| awk 'BEGIN { FS = "K" } ; { print NF-1 }'
      resposta=$?;;
   DNSLookup)
      $pega_status
      fgrep "Scoreboard:" $tmp | awk '{print $2}'| awk 'BEGIN { FS = "D" } ; { print NF-1 }'
      resposta=$?;;
   ClosingConnection)
      $pega_status
      fgrep "Scoreboard:" $tmp | awk '{print $2}'| awk 'BEGIN { FS = "C" } ; { print NF-1 }'
      resposta=$?;;
   Logging)
      $pega_status
      fgrep "Scoreboard:" $tmp | awk '{print $2}'| awk 'BEGIN { FS = "L" } ; { print NF-1 }'
      resposta=$?;;
   GracefullyFinishing)
      $pega_status
      fgrep "Scoreboard:" $tmp | awk '{print $2}'| awk 'BEGIN { FS = "G" } ; { print NF-1 }'
      resposta=$?;;
  IdleCleanupOfWorker)
      $pega_status
      fgrep "Scoreboard:" $tmp | awk '{print $2}'| awk 'BEGIN { FS = "I" } ; { print NF-1 }'
      resposta=$?;;
  OpenSlotWithNoCurrentProcess)
      $pega_status
      fgrep "Scoreboard:" $tmp | awk '{print $2}'| awk 'BEGIN { FS = "." } ; { print NF-1 }'
      resposta=$?;;
   *)
      echo "ZBX_NOTSUPPORTED"
esac
if [ "$resposta" -ne 0 ]; then
   echo "ZBX_NOTSUPPORTED"
fi
exit $resposta
Após copiar o script para a pasta desejada (eu coloco meus scripts utilizados pelo Zabbix em /opt/zabbix/externalscripts/), precisamos editar o arquivo de configuração zabbix_agentd.conf (no meu caso em /etc/zabbix/zabbix_agentd.conf) e adicionar no final do arquivo:
# Monitoramento Apache
UserParameter=apache[*],/opt/zabbix/externalscripts/apache.sh '$1'
Salve o arquivo e reinicie o servidor do agente do Zabbix.

O que acabamos de fazer foi incluir um monitoramento inexistente no Zabbix. Porém, a flexibilidade oferecida pelo Zabbix nos permite entregar apenas o resultado de um monitoramento, o restante ele faz (coleta, alarmes etc).

Explicando a configuração do UserParameter que acabamos de incluir no arquivo de configuração

O Zabbix irá executar o script apache.sh com o parâmetro que está cadastrado no item.
Por exemplo: Imagine que o item seja 'BytesPerReq'. Assim que o Zabbix for coletar o item, o script será executado com o parâmetro 'BytesPerReq' que executará a consulta na página de status do Apache e retornará apenas o valor do item que desejamos coletar.

Eu modifiquei a template disponível na Wiki do Zabbix, pois ela não tinha gráfico configurado. Para baixá-la, clique aqui.

Após baixar a template, basta exportar o e associar ao host que será monitorado.

Configurar apache para permitir a consulta dos dados

Não basta apenas configurar o Zabbix para que o monitoramento do servidor Apache funcione, é preciso liberarmos no arquivo de configuração (no meu caso /etc/httpd/conf/httpd.conf) do Apache o seguinte parâmetro:
ExtendedStatus On
Procure a string ExtendedStatus no arquivo e verifique se esta opção está comentada. Se sim, apenas descomente. Caso esteja com a opção Off, altere para On.

Em seguida, cole o trecho abaixo no final do mesmo arquivo:
<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Location>
Reinicie o serviço do Apache para que as configurações tenham efeito.

Bem simples de fazer o monitoramento do servidor Apache. Veja abaixo a tela de um gráfico com os itens disponíveis deste monitoramento.


Agora é só você adicionar as triggers de acordo com a sua necessidade e ficar tranquilo.

Até mais.

Share this:

, ,

COMENTÁRIOS

17 comentários:

  1. Amigo boa noite, será que existe uma forma de checar o status do apache utilizando-se o próprio index do site ao invés de fazer desta forma, pois temos diversos servidores na rede, alguns até mesmo de terceiros e gostaria de monitora-los sem ter que entrar em contato com os responsáveis para fazer essa modificação no servidor.

    ResponderExcluir
    Respostas
    1. Infelizmente não tem como, pois é necessário você liberar o acesso pelo servidor que provê o serviço.

      Excluir
  2. Janssen se puder me ajudar, fiz as conf como esta no seu blog, mas no executar o comando a baixo não da resultado correto.

    # zabbix_agentd -t apache[TotalAccesses]
    apache [m|ZBX_NOTSUPPORTED]

    Obrigado

    ResponderExcluir
    Respostas
    1. Mário,

      Execute o script no shell do linux conforme o exemplo:
      sh -x /opt/zabbix/externalscripts/apache.sh TotalAccesses

      Copie o resultado aqui para mim.

      Excluir
    2. sh -x /opt/zabbix/scripts/apache.sh TotalAccesses
      + host=localhost
      + resposta=0
      + tmp=/opt/zabbix/tmp/apache_status
      ++ wget --quiet -O /opt/zabbix/tmp/apache_status 'http://localhost/server-status?auto'
      + pega_status=
      + case $1 in
      + fgrep 'Total Accesses:' /opt/zabbix/tmp/apache_status
      + awk '{print $3}'
      + resposta=0
      + '[' 0 -ne 0 ']'
      + exit 0

      Excluir
    3. Você está monitorando o Apache no mesmo servidor que está o Zabbix?

      Se a resposta for não, você tem que colocar em Allow from no arquivo de configuração do Apache o IP do servidor Zabbix.

      Você também pode testar a abertura da página no navegador -> http://localhost/server-status

      Vê se está retornando os valores no navegador.

      Excluir
  3. Janssen, tudo bom?

    Cara fiz a configuração, conforme informado em seu post, porém quando adiciono o template ao host os item ficam inativos, informando que o Zabbix Agent não suporta.

    Consegue me ajudar ?

    ResponderExcluir
  4. Ola Boa tarde
    Em qual versão do zabbix_server e zabbix_agent foi realizada essa configuração?

    Aqui para mim até aparece o gráfico porem não registra nenhum dado!

    Ps: Seu Livre é muito bom Janssen, Parabéns!

    ResponderExcluir
    Respostas
    1. Alan,

      Funciona nas versões 2.0.x, 2.2.x e 2.4.x.
      O gráfico plota alguma informação? Por que aparecer é relativo, pois pode exibir os gráficos sem informações. Verifique o log do Zabbix para verificarr a presença de algum erro e me reporte para te ajudar.

      Excluir
    2. Comigo os items aparecem com "não suportados". Qual seria o problema?

      Excluir
    3. Aqui a mesma coisa. Os ítens ficam como "não suportado" no zabbix. A coleta ocorre normal, o script funciona mas o zabbix não pega as infos.

      Excluir
    4. Rodrigo,

      Criamos o fórum http://zabbixoverflow.com para concentrarmos diversas dúvidas para resolução de problemas. Teria como você acessar o fórum e postar esse problema por lá? Informe qual a versão do Zabbix e sistema operacional que você está usando. Vou reproduzir esse monitoramento para ver se encontro algo de diferente nas versões atuais do Zabbix, já que você mencionou que o script está funcionando.

      Excluir
  5. Tem que atualizar a versão do agente do zabbix, por isso diz não suportado

    ResponderExcluir
  6. Aqui deu o mesmo erro.

    Alguem tem a solução? nao achei o topico referente a esse assunto no forum

    ResponderExcluir
  7. Atualização do script e também do arquivo da template -> https://github.com/janssenlima/ZabbixOverFlow

    ResponderExcluir
  8. Janssen segui todos os passos acima e não consigo monitorar. Os itens ficam não suportados. Estou no zabbix 3.0.4, você já testou nessa versão? Abraço.

    ResponderExcluir