Mostrando postagens com marcador monitoramento. Mostrar todas as postagens
Mostrando postagens com marcador monitoramento. Mostrar todas as postagens

domingo, 27 de fevereiro de 2011

Perl - Realizando consultas SNMP com o módulo Net::SNMP

O SNMP é um protocolo bastante utilizado em sistemas voltados para gerência e administração permitindo coletar as mais variadas informações de servidores, equipamentos de telecomunicações ou qualquer outro equipamento que o implemente. De maneira geral quando o equipamento implementa pelo menos duas RFCs já é suficiente para coletarmos a maioria das métricas básicas. São elas a RFC1213 ou MIBII e a RFC2790 ou Host Resources MIB. Estas duas RFCs permitem o monitoramento de informações relativas a rede e aos recursos do equipamento como cpu, memória, disco, entre outras.

Com tantas métricas e possibilidades de monitoramento utilizando este protocolo, algumas vezes me deparo (acredito que não só eu) com solicitações para criações de scripts para coleta de informações. Antes eu simplesmente os criava me utilizando da facilidade de jogar o conteúdo de um comando executado para dentro de uma variável. Isso pode ser feito sem problemas, porém você fica dependente de que aquele aplicativo esteja instalado no sistema. 

Pensando em criar algo utilizando uma forma mais elegante, comecei a tentar utilizar o módulo do Perl chamado de Net::SNMP. Este módulo você também precisa instala-lo, mas eu penso que o resultado final de um script fica bem mais profissional. Pois bem, no link acima você poderá dar uma olhada em suas possibilidades.

Quando eu fiz minhas primeiras tentativas de utilizar este módulo não consegui faze-lo da forma correta e nem entender corretamente seu funcionamento. Após comprar os livros que citei no meu artigo anterior, principalmente o primeiro que já esta comigo a algum tempo, consegui ter um entendimento melhor sobre a linguagem e por fim consegui usa-lo. Vi que esta dificuldade não foi somente comigo, inclusive amigos de trabalho acabaram por optar pela velha e tradicional forma de coletar estas informações, jogar o conteúdo de um comando para dentro de uma variável.

Então vamos por a mão na massa. Vamos começar a criar nosso script em Perl para coletar algumas informações:

use strict;
use Data::Dumper;
use Net::SNMP;

Estas linhas irão compor a parte inicial do seu script. Gosto de usar a primeira (use strict;) pois ela te obriga a ter uma forma de programar mais organizada. A segunda (use Data::Dumper;) permite analisarmos a estrutura de um hash e a terceira é o módulo que iremos utilizar para trabalhar aqui. Caso alguma destes módulos não exista você receberá uma mensagem de erro no momento de executar o script. Agora vamos criar uma lista de OIDs que vamos coletar e criar a sessão para coleta SNMP:

my @oids = qw/1.3.6.1.2.1.1.3.0 1.3.6.1.2.1.1.5.0 1.3.6.1.2.1.1.6.0/;
my ($session, $error) = Net::SNMP->session(
-hostname  => 'localhost',
-port      => '161',
-community => 'public',
);

Neste bloco fizemos o seguinte. Definimos os OIDs que vamos coletar (que são respectivamente sysUpTime, sysName e sysLocation) e definimos de quem iremos coletar. Agora vamos executar nossa leitura nos OIDs que definimos na lista no passo anterior e visualizar os resultados:

my $result = $session->get_request( -varbindlist => \@oids,);
$session->close();
print Dumper \%{$result};

Com estes comandos você deverá ver algo como o seguinte:

$VAR1 = {
          '1.3.6.1.2.1.1.6.0' => 'Qualquer Lugar',
          '1.3.6.1.2.1.1.5.0' => 'andre-sti',
          '1.3.6.1.2.1.1.3.0' => '51 minutes, 30.01'
        };

Com isso podemos ver os resultados que coletamos via SNMP nos OIDs que definimos no primeiro passo. Aquele "print Dumper \%{$result}" mostra este resultado pois quando executamos o "$session->get_request" ele retorna um hash, porém a única informação que temos deste hash é sua referencia que fica guardada dentro da variável $result. Se você executar um print na variável $result verá algo assim:

HASH(0x304a4a4)

Esta é a referencia do hash criado pelo Net::SNMP. Para de fato imprimirmos os resultados em um laço foreach por exemplo, temos que fazer o seguinte:

foreach my $oid (@oids) {
chomp($oid);
print "$result->{$oid}\n";
}

Com isso você imprime o resultado da requisição SNMP criada! Acho que este foi o "pulo do gato" que antes não conseguia entender para poder de fato utilizar todo o potencial deste módulo. Este foi um exemplo simples mas espero que com ele quem teve alguma dificuldade em usa-lo agora consiga dar seus passos para criar seus scripts, coletando as métricas SNMP diretamente, sem o uso de aplicativos do sistema operacional. Neste link você pode acessar o script completo que fizemos aqui!

Espero que estas dicas ajudem a quem precisar começar a utilizar este módulo muito útil que o Perl possui. Como sempre, caso existam dúvidas, sugestões, elogios ou críticas podem escrever ou postar aqui mesmo no blog!

sexta-feira, 19 de setembro de 2008

RRDTool - você sabe trabalhar com ele?

Esta é uma ferramenta que acredito eu ser uma das mais utilizadas em todo o mundo! Vemos sua utilização em muitos aplicativos open-source como Cacti, Munin, Zenoss, Torrus, Smokeping entre muitos outros. Você pode ver uma lista deles aqui! RRDTools foi desenvolvido por Tobias Oetiker.

Basicamente é possível criar uma base de dados onde serão armazenadas informações como temperatura ou os bytes trafegados por uma interface ao longo do tempo. Qualquer coisa que possui um valor numérico você pode guardar aqui. Primeiramente é necessário instalar esta ferramenta, caso ela já não esteja. Atualmente eu tenho servidores baseado em Debian, então minha instalação é feita com a ferramenta aptitude. Consulte a ferramenta de sua distribuição (yast, emerge, rpm) por este pacote!
aptitude install rrdtool
Com este comando será instalado o aplicativo e suas dependencias serão satisfeitas. Depois da instalação você verá que ele possui algumas funções. Aqui iremos falar de algumas somente que são:
  • create: cria uma nova base de dados rrd
  • update: atualiza com novos valores uma base de dados rrd
  • graph: cria um grafico apartir de uma base de dados rrd
  • fetch: possibilita extrair informação de uma base de dados rrd
  • info: mostra informações sobre uma base de dados rrd
Existem outras funções e elas estão descritas (em inglês) neste site. Uma característica muito importante deste tipo de base de dados é que possui um comportamento cíclico, isso faz com que ela mantenha seu tamanho fixo e permite um planejamento de espaço em disco. Claro que com isso se faz necessário a definição de quanto tempo se deseja guardar uma informação, pois quando não existir mais espaço disponível, automaticamente as informações mais antigas serão sobrescritas. Em minha opnião acredito ser uma forma bastante escalonável de se manter dados armazenados por um período.

A forma que você utilizará para "alimentar" esta base de dados de informações (Data Sources) depende do que você possui e da forma que você julgar mais prático. O mais comum creio eu é por consultas SNMP (Simple Network Management Protocol) onde é possível verificar a memória utilizada por um sistema, quantos usuários estão conectados em um sistema operacional, e muitas outras possibilidades. Para isso pode-se usar um Script Shell, Perl, PHP. O fato é você conseguir passar valores para esta ferramenta, a forma você decide! :D

Tudo muito simples e muito bonito, porém as diversas informações que você possui em geral podem representar tipos de dados distintos, como por exemplo, temperatura de uma cpu e os bytes trafegados em uma interface! Isso é muito importante no momento de criar uma base de dados rrd pois definirá o comportamento de como esses dados serão interpretados e consolidados dentro dela. Com isso em mente, temos disponível para trabalhar os seguintes tipos de dados com características específicas:
  • COUNTER - Este tipo espera que o valor sempre aumente, ou seja, a diferença do valor atual e o anterior é maior que zero, e salva a variação deste sobre o tempo.
  • DERIVE - Este é muito similar ao comportamento do COUNTER porém ele permite valores negativos.
  • ABSOLUTE - Este tambem salva a variação de valores porém ele sempre considera que o anterior é zero.
  • GAUGE - Este possui um comportamento diferente e não faz nenhum tipo de matematica com o valor recebido, ele simplesmente insere o valor como ele chega!
  • COMPUTE - Este armazena um valor oriundo de uma fórmula que usa valores de outros dados definidos dentro de um arquivo rrd.
As informações dentro de um arquivo rrd são armazenadas efetivamente em arquivos RRA (Round Robing Archive). São estas estruturas que terão os espaços para armazenar dados. Antes de avançarmos um pouco mais é necessário entender duas definições utilizadas pelo RRDTools que são os PDPs (Primary Data Point) e CDPs (Consolidated Data Point). Quando um novo valor é inserido ele recebe a classificação de PDP, ou seja, enviamos um determinado valor para essa base de dados e se cria um PDP, porém um CDP é composto por um número pré determinado de PDPs. Uma nova informação só é inserida quando se torna um CDP!

Com estas informações que temos até agora podemos entender um pouco sobre essa poderosa ferramenta de armazenamento de dados, porém, existem alguns detalhes importantes que são utilizados antes de inserir definitivamente uma nova informação dentro de um arquivo rrd que são as funções de consolidação, o fator xff, steps e rows:
  • step: aqui é definido quantos PDPs são necessários para formar um CDP.
  • função de consolidação: é uma função aplicada nos valores quando atingir o número necessário de PDPs para criar um CDP. Ela pode ser AVERAGE, MIN, MAX, LAST.
  • fator xff: é a razão entre a quantidade de informação desconhecida (UNKN) e a de conhecida em um determinado intervalo (step), ou seja, quantos PDPs podem ser desconhecidos para formar um CDP.
  • rows: aqui é informado quantos CDPs serão armazenados.
Passando por tudo isso, uma informação consegue ser armazenada em um RRA e posteriormente plotada em um gráfico. Com isto entendido podemos passar dois novos conceitos usados nesta ferramenta que é o step (não é o mesmo que o anterior) e o heart beat. Como explicamos acima, esta é uma base de dados que guarda informação ao longo do tempo e ela recebe informações em intervalos de tempo pré determinados, o mais comum são 300 segundos (5min). Este step é utilizado na hora da criação da base de dados e é definido em segundos. O heart beat é utilizado no momento de se definir um DS (Data Source) e ele representa o tempo máximo que se esperará por um valor antes de inserir um valor desconhecido (UNKN) e geralmente esta configurado para 600 segundos (10min). Abaixo esta um exemplo para criar uma base de dados rrd que irá armazenar valores das variáveis SNMP ifInOctets e ifOutOctets:
rrdtool create interface.rrd \
--step 300 \
DS:in:COUNTER:600:0:U \
DS:out:COUNTER:600:0:U \
RRA:AVERAGE:0.5:12:24 \
RRA:MAX:0.5:12:24
Com este comando estamos dizendo algumas coisas:
  1. Crie (rrdtool create) um arquivo chamado interface.rrd
  2. Receberá informações a cada 300 segundos (--step 300)
  3. Com um Data Source chamado in, de tipo COUNTER, receberá informações com no máximo 600 segundos (se não UNKN), com valor mínimo em 0 e o valor máximo é desconhecido (U). O mesmo ocorrerá com o Data Source chamado out.
  4. Crie um RRA com função de consolidação AVERAGE, com um xff de 0.5%, forme um CDP quando acumular 12 PDPs e armazene 24 vezes.
  5. Crie um RRA com função de consolidação MAX com um xff de 0.5%, forme um CDP quando acumular 12 PDPs e armazene 24 vezes.
Ok!!!! Vamos traduzir um pouco isso ai, criaremos um arquivo com aquele nome, irá receber novos valores a cada 5 minutos e esperará no máximo até 10 minutos. Não recebendo nenhum valor novo irá colocar um valor especial chamado UNKN. Estamos criando dois arquivos RRA com funções de consolidação diferentes. Com o xff configurado para 0.5 e o step em 12, estamos dizendo que até 6 valores (12*0.5) podem conter UNKN. Com estes 12 valores aplicaremos uma função de média (AVERAGE) e armazenarei o resultado e com outra aplicarei a função de máxima (MAX) e também armazenarei o resultado. Os dois armazenarão 24 valores. Fazendo as contas 300*12*24 chegamos ao valor 86400 segundos ou 1 dia. Será necessário um dia completo para encher este arquivo rrd. Se você criar uma base de dados com esta configuração levará uma hora (300*12) para que seja possível ter alguma informação dentro da base de dados e que apareça em um gráfico.

Bom já temos bastante informação sobre as base de dados rrd até agora, porém ainda não vimos como inserir informações nela. É um procedimento bem simples e iremos usar a segunda função que apresentamos acima que é a update. Com esta função iremos inserir novos dados a cada 5 minutos (nossa base de dados espera isso, mas pode ser diferente). O comando para fazer isso é o seguinte:
rrdtool update interface.rrd N:32378634:U
O que isto fará é o seguinte, atualizará o arquivo interface.rrd com um valor conhecido e outro desconhecido (fiz assim só para dar um exemplo) e a hora de atualização será a atual (N). Com isso teremos um novo PDP dentro desta base de dados. Cada RRA irá receber estes valores e acumulará até alcançar o número de steps configurado, aplicando então sua função de consolidação.

Se você quiser criar uma base de dados para armazenar um tempo específico são necessários alguns passos e cálculos. Vamos simular aqui que precisamos de uma base de dados que guarde informação por um ano completo e que antes de criar uma entrada nova (CDP) dentro do nosso RRA serão necessários 4 PDPs (steps) e a coleta será a cada 300 segundos ou 5 minutos. Vamos primeiro descobrir quantos segundos possui um ano:
1 ano -> 365 dias -> 8760 horas -> 525600 segundos
Um ano é isso ai, 525600 segundos, então podemos chegar na seguinte fórmula:
((525600)/(4*300)) = 438
O resultado desta fórmula nos permite criar uma base de dados para nossa necessidade:
rrdtool create interface2.rrd \
--step 300 \
DS:in:COUNTER:600:0:U \
DS:out:COUNTER:600:0:U \
RRA:AVERAGE:0.5:4:438
Este é um assunto bastante comprido e só estamos no começo de sua abordagem porém acredito que o básico e o início teórico são muito importantes para se avançar. Espero estar mostrando mais desta ferramenta pois é muito poderosa e útil para o dia a dia de um administrador de sistemas.

Como sempre, se existir qualquer sugestão, crítica, dúvida ou ainda uma correção, podem entrar em contato comigo!

segunda-feira, 25 de agosto de 2008

Estatísticas de Trafego de rede com Ntop

Esses dias tive a necessidade de saber que tipo de tráfego tinha em minha rede. Não tive a necessidade de bloquear nada, era somente para fins estatísticos e tinha que ser gratuita, já que a empresa que atualmente trabalho não gosta muito de gastar com softwares!

Procurando na Internet me lembrei da ferramenta Ntop que me pareceu ser uma ferramenta bastante completa, simples e consegue gerar estatísticas do tipo de dados (http, https, smtp, pop, e outros se você quiser configurar) que estão trafegando em sua rede.

Aqui eu acabei usando uma configuração de mirroring do switch para capturar tudo que passa no meu servidor proxy/gateway e assim conseguir saber o que o pessoal tem usado por aqui. Esse servidor onde estalei o Ntop é um Ubuntu 8.04 LTS Server Edition e nele já tenho outras ferramentas como Cacti e uma outra para gerar relatórios do tráfego VoIP dos clientes que temos aqui que se chama VQManager.

A instalação foi bastante simples e rápida como seria em qualquer distribuição baseada em Debian:

aptitude install ntop
Após isso é necessário definir pelo menos a senha de administrador para que ele possa ser iniciado:

ntop --set-admin-password=minh@S&nhA
Essa senha restringe o acesso a parte de configuração usando a pagina WEB! Depois de definida a senha de administrador execute o seguinte comando para inicia-lo:

/etc/init.d/ntop start
E ele deverá estar sendo executado na porta 3000 TCP!
Basicamente agora é só usar seu navegador para acessar a ferramenta por HTTP e começar a ver as estatísticas de tráfego de sua rede!