quarta-feira, 25 de novembro de 2009

Instalando MRTG no CentOS 5.3

Introdução:
Este material foi preparado para as minhas aulas de gerência de redes, mas resolvi compartilhar, pois pode ser útil para alguém.
Basicamente peguei vários tutoriais da internet (ver referências) e adaptei para minhas necessidades, realidade da distribuição escolhida.

Sobre o MRTG:
O Multi Router Traffic Grapher (MRTG) é uma ferramenta de monitoração que gera páginas HTML com gráficos de dados coletados a partir de SNMP ou scripts externos. É conhecido principalmente pelo seu uso na monitoração de tráfego de rede, mas pode monitorar qualquer coisa desde que o host forneça os dados via SNMP ou script.

Foi desenvolvido por Tobias Oetiker e Dave Rand. Foi escrito em Perl mas utiliza um módulo em C para gerar os gráficos.

Características:
  • Mede sempre 2 valores, no caso de tráfego, pode ser Entrada e Saída.
  • Faz as leituras via SNMP ou através de script que retorne um formato padrão.
  • Coleta dados a cada 5 minutos por padrão, mas este tempo pode ser aumentado.
  • Cria uma página HTML com 4 gráficos (diário, semanal, mensal e anual). Se algum deles não for necessário pode ser suprimido.
  • O MRTG pode avisar caso o valor do gráfico atinja um valor pré-estabelecido. Por exemplo: se determinado servidor atinge 95% do espaço do disco, o MRTG pode mandar um e-mail para o administrador informando o ocorrido.
  • Possui uma ferramenta para gerar os arquivos de configuração: o CFGMAKER.
  • Possui uma ferramenta para gerar um página de índice para os casos em que muitos ítens são monitorados: o INDEXMAKER.
  • O MRTG é software livre distribuído nos termos da GNU General Public License.
Instalação:
# yum install mrtg perl-IO-Socket-INET6 perl-Socket6

Criando o primeiro gráfico:
Primeiramente vamos criar um shell script para obter dois valores de uma determinada interface de rede plugada ao seu computador, entrada e saída de dados. Vou usar como exemplo eth0, pois é a minha interface de rede com acesso a internet, porém você poderá usar qualquer outra interface na qual queira gerar os gráficos.
Com base em outros scripts encontrados na internet, criei o meu e estarei explicando como funciona.

Vamos analisar:
# cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 1109 17 0 0 0 0 0 0 1109 17 0 0 0 0 0 0
eth0: 6686671 9549 405223 0 0 405223 0 0 532591 5906 4 0 0 0 0 0

Bom, no nosso exemplo é preciso obter os valores que estão nas posições 1 e 9 após o eth0, pois eles representam a quantidade de bytes recebidos e enviados respectivamente. Então vamos automatizar esta tarefa da seguinte forma:

Crie um arquivo chamado "eth0.sh" no diretório /etc/mrtg, lugar onde ficam por padrão as configurações, irei explicar mais a frente. Dentro do arquivo eth0.sh adicione as seguintes linha:
#!/bin/bash
cat /proc/net/dev | grep eth0 | cut -d : -f 2 | awk '{ print $1; print $9 }'
Salve o arquivo

Entendendo o script:
cat /proc/net/dev | grep eth0
Exibe apenas as informações da interface eth0

cat /proc/net/dev | grep eth0 | cut -d : -f 2
cut comando para cortar as informações usando como separador (delimitador "-d") o :, e exibindo apenas o campo 2, ou seja, o : é o separador, o que está antes dele é o campo1 (eth0), o que está depois dele é o campo 2 (Informações da interface), o resultado será:
6686671 9549 405223 0 0 405223 0 0 532591 5906 4 0 0 0 0 0

cat /proc/net/dev | grep eth0 | cut -d : -f 2 | awk '{ print $1; print $9 }'
Através do comando (linguagem de programação) awk, será exibido apenas os campos 1 e 9, que correspondem a quantidade de bytes recebidos e enviados respectivamente. O resultado será:
6686671
532591

Dê permissão de execução da seguinte forma:
# chmod +x eth0.sh

Para testar se ocorreu tudo de forma correta, vamos testar o script:
# ./eth0
6887836
591145
Tudo ocorreu como o esperado, caso você tenha algum problema, revise o script e faça as alterações necessárias.

Configurando e rodando:
Esta é a parte mais importante do processo, o arquivo de configuração. Edite o arquivo "mrtg.cfg" na pasta /etc/mrtg, dentro do mesmo adicione as linhas:

# Estas duas linhas indicam onde a página com os gráficos e as imagens serão salvas,
# eu coloquei como destino a pasta padrão do meu Apache, mas você tem
# total liberdade de escolha, pois o resultado é gravado em linguagem
# HTML, não necessitando diretamente do Apache.
HtmlDir: /var/www/html/monitoramento/
ImageDir: /var/www/html/monitoramento/

# Diretório onde o MRTG armazena as imagens default que ele usa para montar as
# páginas dos gráficos e tambem os logs
LogDir: /var/lib/mrtg
# Diretório onde o MRTG faz o controle de alertas, você pode realizar configurações para
# ser alertado caso um disco atinja determinado tamanho/porcentagem, se o processador
# atingir um determinado valor de processamento, etc; Este controle é escrito neste diretório
ThreshDir: /var/lib/mrtg
# Nesta linha é definido em qual idioma será gerado o resultado
Language: brazilian

# Define qual o intervalo de tempo entre cada atualização, o valor é dado em
# minutos, sendo o valor mínimo 5 minutos
Interval: 5

# Esta linha se encarregará que a atualização seja automática e o
# processo irá rodar como um daemon qualquer, sendo possível
# iniciá-lo junto com o sistema
RunAsDaemon: Yes

# Esta linha é onde ficará o script que criamos, pois sempre que for chamado
# ele atualizará os valores de dados recebidos e enviados de forma automática,
# onde a palavra "trafego" é o nome da seção. Procure manter o mesmo nome para
# todos os comandos, evitando problemas mais a frente, a página gerada terá o mesmo nome da seção.
Target[trafego]: `/etc/mrtg/eth0.sh`

# Aqui é informado o título da página, usei simplesmente "Tráfego da rede", que
# já resume muito bem minha intenção
Title[trafego]: Trafego da rede

# As duas próximas linhas representam no gráfico, o máximo suportado pelo seu link
# para um resultado mais preciso, os valores são dados em bytes.
MaxBytes[trafego]: 32000
AbsMax[trafego]: 32000

# Esta linha força o gráfico a mostrar no valor máximo o valor setado em
# MaxBytes seguido pelas iniciais de quais quadros este parâmetro vai ser
# aplicado, onde d = diário, w = semanal, m = mensal e y = anual.
Unscaled[trafego]: dwmy

A configuração está pronta para por em funcionamento, basta dar o comando:
# mrtg /etc/mrtg/mrtg.cfg

O programa alerta que se a variável de ambiente estiver setada em UTF-8 ele provavelmente não irá funcionar adequadamente e manda rodar da seguinte maneira:
# env LANG=C /usr/bin/mrtg /etc/mrtg/mrtg.cfg
Daemonizing MRTG ...

Está tudo pronto e funcionando, com esta configuração a cada 5 minutos o gráfico será atualizado de forma automática, bastando abrir o local onde está o documento, que no mrtg é "trafego.html".

Se precisar parar o serviço utilize o comando:
# killall mrtg

Acessando as páginas:
Como eu coloquei para o resultado ser gerado no diretório do Apache, visualizo no meu navegador com o endereço:
http://localhost/monitoramento/trafego.html

Scripts adicionais:
uptime.pl
#!/usr/bin/perl
$uptime = `uptime`;
$uptime =~ /up (.*?) day/;
$up = int($1);
print "$up\n";
print "$up\n";

dsk-snmp.sh
#!/bin/bash
snmpget -v 1 -c public localhost dskTotal.1 | cut -f4 -d:
snmpget -v 1 -c public localhost dskUsed.1 | cut -f4 -d:

Entradas no /etc/mrtg.cfg:

# Uptime.pl
Target[uptime]:`/etc/mrtg/uptime.pl`
Title[uptime]: Dias com o servidor no ar (Uptime)
PageTop[uptime]: <h1>Dias com o servidor no ar (Uptime)</h1>
Options[uptime]: growright,gauge
MaxBytes[uptime]: 365
Legend1[uptime]: Dias com o servidor no ar (Uptime)
Legend2[uptime]: Dias com o servidor no ar (Uptime)
LegendI[uptime]: Dias com o servidor no ar (Uptime)
LegendO[uptime]: Dias com o servidor no ar (Uptime)

# Dsk-snmp.sh
Target[disco]: `/etc/mrtg/dsk-snmp.sh`
Title[disco]: Uso do Disco
PageTop[disco]: <h2>Utilização do disco</h2>
Options[disco]: gauge, growright, transparent, nopercent
MaxBytes[disco]: 7010530
kMG[disco]: G,G
ShortLegend[disco]: B
LegendI[disco]: Tamanho do Disco
LegendO[disco]: Utilizacao do Disco

Utilizando SNMP no MRTG:
Nos sentimos tentados a realizar scripts como o dsk-snmp.sh, e realmente eles funcionam, porém não estamos utilizando MRTG com SNMP, estamos utilizando MRTG com um script em Shell que faz uso de comandos SNMP. Para utilizarmos MRTG com SNMP devemos colocar os OIDs diretamente no campo Target. Como no Exemplo abaixo:

# Disco 2
Target[disco2]: .1.3.6.1.4.1.2021.9.1.6.1&.1.3.6.1.4.1.2021.9.1.8.1:public@localhost
Title[disco2]: Uso do Disco
PageTop[disco2]: <h2>Utilização do disco</h2>
Options[disco2]: gauge, growright, transparent, nopercent
MaxBytes[disco2]: 7010530
kMG[disco2]: G,G
ShortLegend[disco2]: B
LegendI[disco2]: Tamanho do Disco
LegendO[disco2]: Utilizacao do Disco

Como vocês podem perceber as entradas das seções "disco" e "disco2" são idênticas, a diferença está apenas no campo "Target", mas como cheguei nestes OIDs? Bom se você pretende usar MRTG com SNMP, você precisa conhecer SNMP, mas de qualquer forma vou dar algumas instruções básicas.
# snmptranslate -On -IR dskTotal.1
.1.3.6.1.4.1.2021.9.1.6.1
# snmptranslate -On -IR dskUsed.1
.1.3.6.1.4.1.2021.9.1.8.1

Os comandos acima transformam a informação que eu quero ler (dskTotal.1 e dskUsed.1) em OID numérica, de posse destes OIDs eu configurei as informações do Target.

A sintaxe é a seguinte:
Target[Nome da Seção]: OID da primeira informação que eu quero ler&OID da segunda informação que eu quero ler:nome da comunidade@IP do host que eu quero ler as informações

Outro exemplo, agora de uma máquina Windows:
Target[DSK_C]: ((((4096 * .1.3.6.1.2.1.25.2.3.1.5.2&.1.3.6.1.2.1.25.2.3.1.6.2:public@10.72.220.2)/1024)/1024)/1024)
MaxBytes[DSK_C]: 48074785792
Options[DSK_C]: growright, gauge, nopercent
YLegend[DSK_C]: Utilizacao do Disco
kMG[DSK_C]: G,G
ShortLegend[DSK_C]: B
Legend1[DSK_C]: C Drive total
Legend2[DSK_C]: D Drive % Used
LegendI[DSK_C]: C Drive total
LegendO[DSK_C]: C Drive used
Title[DSK_C]: Utilizacao do Disco
PageTop[DSK_C]: <h1>Utilização do disco</h1>

Este exemplo é interessante, você deve estar se perguntando porque multiplicar por 4096 e depois dividir por 1024 três vezes? A resposta é simples, vamos analisar o que aconteceu, primeiramente vamos ler as informações da máquina windows através do comando snmpwalk:
# snmpwalk -c community-name -v1 IP

Olhando as informações cuidadosamente, você encontrará este resultado:
HOST-RESOURCES-MIB::hrStorageDescr.6 = STRING: G:\ Label:Local Disk Serial Number e8eed18c
HOST-RESOURCES-MIB::hrStorageAllocationUnits.6 = INTEGER: 4096 Bytes
HOST-RESOURCES-MIB::hrStorageSize.6 = INTEGER: 7861801

HOST-RESOURCES-MIB::hrStorageUsed.6 = INTEGER: 871398

Então a string #6 do hrStorage é o drive G no Windows.
A capacidade total do disco é 7861801 * 4096 = 32201936896 bytes = 29.99 GB (Windows usa GB para informações de capacidade)
E o espaço usado é 871398 * 4096 = 3569246208 bytes = 3.32 GB (3569246208/1024 = 3485592; 3485592/1024 = 3403,8984375 ; 3403,8984375/1024 = 3,32411956787109375)

Entendeu? Não? Vamos lá:
O SNMP nos informou que ele está armazenando as informações em Unidades de Alocação de 4096 bytes e que o tamanho total do disco é de 7861801 UNIDADES, Ah bom... Agora entendi!!! ;-)

Mas porque 4096 bytes??? De onde ele tirou este valor??? Você nunca deve ter reparado, mas ao formatar um disco no Windows ele te mostra essa informação:


Referências
As informações de "Criando o primeiro gráfico:" até "Acessando as páginas:", foram criadas com base no artigo "Gerando gráficos para interfaces de rede com MRTG" de Joaquin Joao Juze, utilizei a referência mudando algumas informações para que ficassem mais didáticas para o uso em sala de aula, também acrescentei detalhes do CentOS, todos os direitos reservados ao autor original do artigo (http://www.vivaolinux.com.br/artigo/Gerando-graficos-para-interfaces-de-rede-com-MRTG).
http://pt.wikipedia.org/wiki/Multi_Router_Traffic_Grapher
http://jehiah.cz/download/mrtg-uptime.pl.txt
As informações do exemplo de MRTG com SNMP para ler as informações de uma máquina Windows foram encontradas no Blog de Anthony Fajri:
http://fajri.freebsd.or.id/index.php/2007/01/30/check-the-disk-space-using-snmp/

Referências Adicionais:
Instalação passo-a-passo do MRTG em Ambiente Windows:
http://www.netmon.org/dummies.htm
Documentação Oficial:
http://oss.oetiker.ch/mrtg/doc/mrtg.en.html
Tutorial NET-SNMP com MRTG:
http://net-snmp.sourceforge.net/tutorial/tutorial-5/mrtg/index.html
Exemplo de leitura de informações do Windows usando SNMP e Scripts Windows Power Shell:
http://snmpboy.msft.net/
Exemplo de Scripts em Perl e C:
http://pointless.nl/~peter/code/mrtg/

6 comentários:

Unknown disse...

André bom dia! Gostaria de parabenizá-lo pelo blog, e dizer que está sendo muito útil para mim, pois recentemente me formei em Redes e consegui uma vaga de administrador de redes em uma empresa, coma missão de implantar política de segurança, IPS, monitoramento de redes, e como nunca tive muita experiência com Linux, estou pesquisando as possibilidades de implantar uma sala de monitoramento com vários dashboards em tempo real. Para isso, não dá muito pra correr do Linux, pelo contrávio, vi através do seu blog que existem várias soluções que possam me atender com sucesso. Para tal você recomenda qual? Um abraço, e estou acompanhando suas postagens!

André Déo disse...

Olá André...

Meu xará.... Cara primeiro parabéns....

Legal a vaga que você conseguiu, vai ralar bastante, mas vai aprender muito com certeza...

Eu te recomendo o Zabbix, com toda a certeza!!!

Abraços,
Déo

gus disse...

Cara, parabéns! Vc salvou meu couro!
Tenho uma duvida. No grafico diário é possivel exibir as unidades em Mbytes x hora?

COmo mudo estas unidades?

André Déo disse...

Gustavo como disse esse material é só uma noção, eu não uso o MRTG em produção, uso ZABBIX, esse detalhe que você perguntou eu não sei se é possível.

Abraços

Unknown disse...

André, parabéns pela contribuição. Olha só, estou tendo dificuldades no meu centos 6.4. Instalei tudo direitinho, mas não aparecem as barras no gráfico, será que fiz algo errado?

André Déo disse...

Éder,

Com certeza, revise tudo direitinho...

Eu uso esse tutorial em aulas e não tem erro.

Abraços,