quinta-feira, 27 de maio de 2010

Monitorando espaço em disco no Zabbix através do SNMP

Em outro artigo postado anteriormente, tratei acerca do monitoramento de serviços no Zabbix fazendo uso do protocolo SNMP. Continuando a série, vou tratar agora da verificação dos discos (partições) utilizando o mesmo protocolo. 
Vocês podem ser perguntar porque não utilizo o agente para tais tarefas. Afinal, tudo seria mais fácil. Bem, a resposta para a questão é o fato de no passado ter enfrentado problemas de performance em alguns servidores em razão do mal comportamento do agente da ferramenta que consumia muita CPU, em alguns casos, chegando a 100%.
Como a MIB possui todos os dados que necessito para monitorar os servidores, apesar de dar um pouco mais de trabalho, os recursos consumidos pelo agente SNMP em um computador é mínimo e não prejudica sua performance.
Bem, chega de história e vamos ao que interessa. Como fiz no meu outro artigo, Monitorando serviços no Zabbix através do SNMP, criei um shell script que consulta a MIB do sistema operacional, pois o índice da partição pode variar de um computador para outro.
Assim, crie um arquivo no diretório o qual estão armazenado os scripts externos do Zabbix (parâmetro ExternalScripts do arquivo de configuração zabbix_server.conf), no exemplo colocarei discolivre.sh, com o conteúdo abaixo.



#!/bin/bash
# Criado por Rafael Oliveira
# Parametro 1 - Endereco do host
# Parametro 2 - Letra que indica a particao
# Parametro 3 - Sistema operacional
# Inicializa as variaveis
declare TOTAL=0
declare USADO=0
# Comunidade SNMP
COMUNIDADE=monitora
# Obtem o ID do disco na tabela SNMP contida na MIB
if [ "$3" == "linux" ]; then
ID=`/usr/bin/snmpwalk -v 2c -c $COMUNIDADE $1 HOST-RESOURCES-MIB::hrStorageDescr | grep "STRING: $2$" | cut -d : -f 3 | cut -d " " -f 1 | cut -d . -f 2`
else
ID=`/usr/bin/snmpwalk -v 2c -c $COMUNIDADE $1 HOST-RESOURCES-MIB::hrStorageDescr | grep "STRING: $2" | cut -d : -f 3 | cut -d " " -f 1 | cut -d . -f 2`
fi
# Com o ID, realiza a consulta para obter o valor desejado. Primeiro o tamanho, em seguida, o usado.
TOTAL=`/usr/bin/snmpget -v 2c -c $COMUNIDADE $1 HOST-RESOURCES-MIB::hrStorageSize.$ID | cut -d : -f 4 | cut -d " " -f 2`
USADO=`/usr/bin/snmpget -v 2c -c $COMUNIDADE $1 HOST-RESOURCES-MIB::hrStorageUsed.$ID | cut -d : -f 4 | cut -d " " -f 2`
expr $TOTAL - $USADO

Após salvar o arquivo, lembre-se de conceder permissão de execução e alterar o dono para o usuário zabbix.

# chmod a+x discolivre.sh
# chown zabbix.zabbix discolivre.sh

Depois, no template ou host criados no Zabbix, crie um item conforme a imagem abaixo.


Em relação a figura acima, algumas observações precisam ser feitas. 
Na opção Key, os parâmetros do script precisam ser alterados de acordo com o nome da partição e o sistema operacional. Por exemplo, caso deseja-se verificar o volume /home de um servidor com o sistema operacional Linux, ela ficaria da seguinte forma: discolivre.sh[/home linux].
O parâmetro Custom Multiplier pode variar, pois o valor contido na MIB SNMP para o disco não é em bytes e sim em unidades de alocação. Desta forma, antes de defini-lo, é necessário verificar nela o item HOST-RESOURCES-MIB::hrStorageAllocationUnits.[ÍndiceDaPartição]. Este valor é o tamanho do cluster definido na criação do sistema de arquivos.
Depois criar o item para a coleta dos dados, vamos para a criação do trigger. Na criação dele ao inserir a expressão precisamos selecionar o item criado anteriormente com as opções exibidas na tela abaixo.






O valor N da figura acima é 2400000000, ou seja, 2,4 GB. Na criação do item utilizamos a unidade B (bytes). Como 1 GB equivale a 1000000000 (10^9), o valor da expressão precisa ser definido desta forma.
Lembrando que ele pode ser alterado conforme a necessidade da sua empresa. Além disso, lembre-se de definir um nome sugestivo para o trigger como, por exemplo, "Espaço limitado na partição C:". Assim, fica mais fácil identificar o problema quando o mesmo aparecer na Dashboard ou no recebimento de alguma mensagem. 



4 comentários:

  1. Legal. Mas, como fazer para que o resultado seja o percentual de disco livre?

    ResponderExcluir
  2. Olá! Conforme disse no artigo, o valor fornecido pela MIB é o número de clusters. Se deseja obter a porcentagem. Há duas saídas, creio eu. A primeira seria alterar o shell script acima de forma que ele forneça a porcentagem. Você poderia utilizar a expressão X = (100xLIVRE) / TOTAL. Onde X é o valor em porcentagem. Outro detalhe é que o item no Zabbix deve ser alterado retirando a unidade B e o multiplicador.
    A segunda opção, que é mais simples, seria obter os valores do host utilizando o agente do Zabbix que possui funções de obter o valor em porcentagem do espaço em disco.

    ResponderExcluir
  3. Man, eu fiz do mesmo jeito, testo no script e vem o valor ok. Porém no zabbix obtenho este erro:
    Received value [-] is not suitable for value type [Numeric (float)]

    ResponderExcluir
    Respostas
    1. Opa! Desculpe a demora. Aparentemente o Zabbix não está interpretando o valor retornado pelo script como float. O sistema operacional é Windows ou Linux. O tamanho do cluster é 4 KB?

      Excluir