Documente Academic
Documente Profesional
Documente Cultură
REDES
ualquer administrador de sistemas est familiarizado com a seguinte situao: voc monitora seu sistema de forma abrangente, todos os servios parecem funcionar e ainda assim, voc v algumas anomalias no grfico que monitora operaes de pagamento. O tempo de acesso para os sistemas de pagamento aumentaram dez vezes. Os testes manuais dos componentes no mostram quaisquer problemas e as mtricas de teste da interface do pagamento ao prestador de servio externo no relata os erros tambm. Depois de alguma pesquisa intensiva, voc finalmente encontra o malfeitor: um bug no intermediador, que foi atualizado ontem noite, est impedindo o cumprimento sem problemas de pagamentos. Voc reverte a verso e os problemas que afetam os pagamentos so uma coisa do passado.
Mtodos geis
Para evitar que incidentes como este se tornem regra, os desenvolvedores de software muitas vezes trabalham com mtodos geis que tm um efeito considervel sobre o processo de desenvolvimento. Com essa abordagem, o foco do desenvolvimento no est mais exclusivamente nas atividades de programao, mas em testes exaustivos do aplicativo, bem como em uma estreita cooperao com todas as partes interessadas do projeto. Esses princpios formam a base de trabalho do Desenvolvimento Orientado por Testes e do Desenvolvimento Orientado por Comportamento. A principal ideia por trs do desenvolvimento orientado por testes assegurar que o aplicativo no s funcione, mas tambm se comporte exatamente como o usurio espera que ele funcione. Para isso, sistemas de testes automatizados, como o
Jenkins [1] (ex-Hudson) ou o CruiseControl [2] so implantados para testar com regularidade caractersticas especficas de um aplicativo. O desenvolvimento orientado por comportamento estende os princpios do desenvolvimento orientado por testes, permitindo que profissionais que no sejam programadores participem no processo de desenvolvimento de aplicativos. O foco est sobre o envolvimento de todos os interessados no projeto. Para dar a estes envolvidos a melhor visibilidade possvel de como o aplicativo funciona, os interessados tambm devem ser capazes de contribuir com os seus prprios cenrios para testes automatizados. Esta abordagem orientada para o comportamento permite a utilizao de uma linguagem especfica de domnio (DSL) que orientada por uma linguagem natural e no deve ser vista como uma linguagem de programao.
60
www.linuxmagazine.com.br
Cucumber-Nagios | REDES
O Cucumber-Nagios [3] aplicase a estes princpios e apoia a sua utilizao na infraestrutura do desenvolvimento gil. Isso significa no apenas um acompanhamento do ponto de vista do objeto (o aplicativo executado) mas tambm considera o processo que leva aos resultados desejados (o aplicativo est funcionando como desejado). Ao mesmo tempo, todos os membros da equipe podem contribuir com suas prprias verificaes para a vigilncia do sistema sem o administrador ter de escrever funes especiais. Existe um jargo tecnolgico para isso tambm: Infraestrutura Orientada por Comportamento.
Balano
O Cucumber-Nagios integrado como um plugin para qualquer sistema de monitoramento de cdigo aberto que possa interpretar os valores retornados pelos plugins do Nagios. Esta ferramenta baseada em Cucumber [4] uma parte popular de software para testes automatizados de Ruby, Java, .NET, Flex e aplicativos web e usa o Gherkin DSL [5]. Internamente, voc tambm vai encontrar o Webrat, um simulador de navegador de baixos recursos usado para cenrios de teste envolvendo o protocolo HTTP. Voc tambm vai encontrar a biblioteca Mechanize [6], que contribui para interaes de funes automatizadas em sites. Alm disso, graas a implantao do protocolo cliente SSH2 do Ruby Net::SSH [7], o suporte ao SSH tambm est presente.
DNS em outro projeto separado. No entanto, voc poderia com facilidade manter todos os servios que voc deseja verificar em um nico projeto. Um projeto composto de caractersticas e etapas. As caractersticas constantes nos cenrios de teste so escritas no Gherkin DSL, enquanto as etapas so curtos blocos de cdigo escritos em Ruby. Estes blocos contm a lgica do aplicativo para entrar em uma interface web ou abrir uma conexo com um servidor externo. Para manter as coisas simples, muitas etapas esto integradas no CucumberNagios, o que permite aos administradores focalizar diretamente nos servios que precisam ser monitorarados. Essas etapas preconcebidas incluem uso e verificaes de DNS, HTTP, ICMP e SSH. Etapas para operaes simples de arquivo, execuo de comandos em hosts externos e monitoramento de aplicativos baseados em protocolo AMQP tambm esto includos, por padro. Se necessrio, voc tambm pode definir as etapas personalizadas para qualquer recurso definido, para lidar com a complexidade de seu prprio ambiente.
Nagios inclui seu prprio gerador de cdigos para as funes mais usadas. Para criar o seu prprio projeto inicial, voc pode usar:
cucumber-nagios-gen project checks
Depois, voc pode executar o gem bundle no diretrio do projeto. Isso permite que voc copie a pasta do projeto para qualquer servidor sem a necessidade de instalar o Cucumber-Nagios e suas dependncias localmente.
Denio de recursos
Voc pode usar o prprio gerador do Cucumber-Nagios novamente para criar o framework bsico de quatro novos recursos. Para fazer isso, digite:
cucumber-nagios-gen feature www.xing.com startpage
no diretrio do projeto; esta etapa cria dois novos arquivos (listagem 1). O arquivo features/www.xing.com/ startpage.feature contm o cenrio de teste. Voc pode adicionar seus prprios passos ao arquivo features/
www.xing.com/steps/startpage_steps. rb, caso seja necessrio. O startpage.features um exemplo
Um projeto inicial
Antes de instalar o Cucumber-Nagios, voc precisa do Ruby 1.8.7 e do prprio gerenciador de pacotes do Ruby, o RubyGems(1.3.5 ou mais recente), em ordem. Uma vez que os dois estiverem prontos para a ao, voc pode instalar o Cucumber-Nagios e todas as suas dependncias, tornando-se usurio root e executando o comando:
gem install cucumber-nagios
Terminologia
A terminologia Cucumber-Nagios relativamente simples e consiste de projetos, recursos e etapas. Um projeto contm toda a estrutura necessria para escrever e executar cenrios de teste. Por exemplo, voc pode criar um projeto para realizar testes HTTP para verificar um site e para, sem cargas, fazer verificaes
rudimentar que voc pode modificar conforme precisar. A sintaxe usada semelhante linguagem natural e facilmente dominada sem o conhecimento de uma linguagem de programao. A lgica do programa inicialmente oculta nas etapas. Todos os recursos partilham as trs primeiras linhas. As duas primeiras linhas do o nome do recurso e uma breve descrio intuitiva do estado de espera. A descrio pode ocupar mtliplas linhas. Na listagem 2, o recurso estipula que o endereo www. xing.com deve estar disponvel. A ter-
61
REDES | Cucumber-Nagios
A listagem 3 mostra um recurso para verificar um login em http:// www.xing.com/. Em muitos casos, a preocupao no s se alguma coisa funciona, mas quanto tempo leva para obter-se um resultado uma solicitao. Sites devem fornecer o melhor desempenho possvel. O monitoramento do desempenho com o Cucumber-Nagios possvel com o mtodo predefinido Given I am benchmarking. Aqui est um exemplo:
Scenario: Benchmarking home page Given I am benchmarking When I go to http://www.xing.com/ Then the request should succeed And the elapsed time should be less than 1 seconds
ceira linha utiliza o Scenario: keyword para introduzir o cenrio de teste; todas as outras linhas so instrues para as aes correspondentes, que a verificao do servio deve executar e avaliar. Basicamente, duas aes ocorreram na listagem 2. A linha When I go to http://www.xing.com/ define a ao inicial, e os resultados esperados esto descritos em Then the request should succeed. Essas duas pequenas informaes so tudo o que ele tem para gerar um trabalho e seguir com sucesso para a disponibilidade do endereo http:// www.xing.com. Colocar a palavra-chave And no incio da nova linha permite que voc adicione condies adicionais para um teste bem sucedido. J a palavra-chave But usada se voc deseja definir critrios exclusivos, o que faz sentido se voc precisar verificar o contedo de uma pgina. Assim, no mbito da listagem 2, as duas seguintes condies fariam sentido se voc quiser garantir que de fato est na pgina de boas vindas do Xing: And I should see Join XING for free e But I should not see Welcome to Facebook. As palavras-chave Given, When, Then, And e But completam a lista de instrues suportadas. Note que o Cucum-
ber no faz distino entre as instrues de um ponto de vista tcnico; no entanto, aderir s convenes existentes til. Given usada somente se um status definido assumido, como em:
Given I am on http://www.xing.com/
Em contraste, When em geral descreve uma ao a ser executada, como a interao com um site e a verificao da existncia de um arquivo especfico. A seguinte frase seria concebvel, no contexto do exemplo anterior:
When I fill in username-field" with "username
Neste caso, dois elementos so verificados: se o cdigo de status HTTP positivo e se o pedido de tempo de execuo inferior a um segundo. Se uma dessas condies no for cumprida, o servio classificado como crtico e uma advertncia poder ser publicada dependendo da configurao do sistema de monitoramento.
Passos detalhados
O trabalho duro feito por etapas preconcebidas em segundo plano. Essas etapas so blocos curtos de cdigo Ruby que fornecem recursos para as verificaes. Voc pode usar um grep recursivo no projeto para criar uma viso geral das etapas organizadas pelo mtodo. Essas etapas predefinidas constituem uma base slida sobre a qual voc pode construir a sua prpria:
grep -R '[WT]hen\|Given' features/steps/| awk -F \: '{print $2}'|sort -d
A palavra-chave And uma substituta para as instrues Given, When ou Then apenas para manter o cenrio mais inteligvel. Eu poderia acrescentar as seguintes instrues para o exemplo:
And I fill in "password-field" with "password" And I press "login-button" Then utilizado para monitorar
A etapa features/steps/ping_steps. rb (listagem 4) executa um teste de ping simples. O recurso que iria dei-
62
www.linuxmagazine.com.br
Cucumber-Nagios | REDES
Cada etapa introduzida pelos mtodos Given, When, Then, And ou But, seguidos de uma expresso regular que possibilita a instruo usada pelo recurso. O comando do introduz a lgica, e |host| a varivel que define o recurso para o host testado. importante notar aqui que os mtodos no so parte da expresso regular. Se voc diz When I ping ou define Given I ping como condio varivel, e leva em conta a conveno Given WhenThen presente no Cucumber [8]. A linha 2 da listagem 4, por fim, faz o trabalho. Ela inicia a instncia da varivel @result, que recebe a sada do comando ping. Este ento avaliado nas etapas que comeam pela linha 5. Na base da avaliao, o valor de retorno definido como verdadeiro (host disponvel) ou falso (host inacessvel). Se voc agora estender o exemplo e dar ao autor do cenrio de teste a capacidade de definir o nmero de pings, precisar modificar a expresso regular e adicionar a varivel correspondente, de acordo com o seguinte:
When /^I ping (.*) (.*) times$/ do |host, count|@result = system("ping -c #{count} #{host} > /dev/null 2>&1") end
rei dos sistemas de monitoramento de cdigo aberto: o Nagios. Como j mencionamos, o requisito bsico para a execuo do plugin Cucumber-Nagios uma instalao do Ruby em funcionamento. Se voc testou o Cucumber-Nagios em um servidor diferente do servidor Nagios, voc vai precisar copiar o diretrio do projeto de forma recursiva para o servidor Nagios. O caminho para o diretrio depende da sua distribuio e da forma como voc configurou o Nagios. Debian, Red Hat e SUSE Linux instalam os plugins do Nagios no diretrio /usr/lib/nagios/plugins. No entanto, se voc compilou o Nagios sozinho, o arquivo padro /usr/local/nagios/libexec. Voc provavelmente vai querer criar um subdiretrio cucumber-nagios no diretrio de plugins e copiar o projeto para este subdiretrio. Voc, ento, ir querer modificar as permisses de arquivos e diretrios para que o sistema permita ao usurio Nagios acessar os arquivos. Em muitos casos, o resource.cfg define uma varivel para o diretrio de plugins por exemplo, $USER1$=/ usr/lib/nagios/plugins. Para manter a sobrecarga de configurao to magra quanto possvel e para evitar perder o controle, defina seus prprios caminhos de variveis para o projeto do Cucumber-Nagios por exemplo, $USER2$=/usr/lib/nagios/ plugins/cucumber-nagios. Agora, basta o comando a seguir para verificar o servio no arquivo commands.cfg:
define command{ command_name check_cn command_line $USER2$/checks/bin/ cucumber-nagios $ARG1$ }
em que chamado. A definio de servios em services.cfg define esse argumento (listagem 5). Antes de dizer ao servio do Nagios que recarregue sua configurao, teste as verificaes que voc definiu na linha de comando. Para tal, execute o plugin no contexto do usurio Nagios:
su nagios -c "/usr/lib/nagios/ plugins/cucumber-nagios/checks/ bin/cucumber-nagios/usr/lib/ nagios/plugins/cucumber-nagios/ checks/features/www.xing.com/ startpage.feature" ~ $ echo $?
Agora voc pode definir o nmero de pings para enviar nos recursos correspondentes, como segue:
When I ping www.xing.com 3 times Then it should respond
O command_name livremente selecionvel. Para command_line, tenha em mente que o caminho da varivel deve estar correto e que $ARG1$ est anexado ao prprio comando. Um argumento passado para o Cucumber-Nagios no momento
Se isso falhar com um valor de retorno 2, voc encontrou um bug; no entanto, isso fcil de resolver. A opo --pretty diz ferramenta para liberar o registo de chamadas, o que ir ajud-lo a solucionar o problema (listagem 6). A linha 8 do registro de chamadas na listagem 6 mostra que o problema
63
REDES | Cucumber-Nagios
Figura 1: Depois de escrever todos os seus testes no Cucumber, os resultados do monitoramento sero exibidos no Nagios.
causado por permisses de arquivo: o usurio nagios quer gravar o arquivo webrat.log, mas no tem as permisses necessrias. Uma explicao simples para isso a chamada para o programa. Se voc tivesse chamado su com a opo -l, a varivel de ambiente $HOME teria sido criada para o usurio nagios. No entanto, agora este usurio est tentando escrever no diretrio de trabalho atual do usurio que inseriu o comando su. Esse problema traioeiro se voc executar a verificao do Cucumber-Nagios via SSH, porque, em seguida, o SSH no funcionar como um Shell interativo. Para se livrar do erro, basta fazer uma pequena alterao no cdigo da dependncia do Cucumber-Nagios, o Webrat. Para fazer isso, abra o arquivo
vendor/gems/ruby/1.8/gems/webrat-0.7.0/ lib/webrat/core/logging.rb no diretrio
do projeto e digite o caminho completo para o arquivo de log na linha 18. Dependendo do diretrio home do usurio Nagios, a linha ser algo parecido com:
@logger ||= ::Logger.new( /var/nagios/webrat.log)
64
www.linuxmagazine.com.br
Cucumber-Nagios | REDES
Para finalizar, voc deve testar a chamada para o plugin manualmente. Os resultados sero muito mais satisfatrios:
CUCUMBER OK - Critical: 0, Warning: 0, 4 okay | passed=4; failed=0; nosteps=0; total=4
Agora, nada deve estar no caminho usado pelo Cucumber-Nagios para monitorar as funes. Depois de recarregar o servio, o Nagios ir acompanhar as verificaes definidas. Isso conclui o processo de integrao com o sistema de monitoramento. A gura 1 mostra os resultados em uma interface do Nagios.
Concluso
O Cucumber-Nagios sem dvida uma ferramenta poderosa, mas alguma experincia necessria para atingir resultados rpidos. A integrao com um sistema existente normalmente um processo lento. Os usurios tero de ser in-
troduzidos no idioma Cucumber e Gherkin. E a criao de etapas especficas para a sua prpria plataforma quase impossvel sem o conhecimento de Ruby. Os ambientes nos quais as equipes de desenvolvimento e operao cooperam estreitamente tm uma vantagem clara aqui. Desenvolvedores contribuem com a lgica da aplicao, a equipe de qualidade define cenrios de teste e os administradores focam o lado operacional dos seus sistemas de monitoramento. Alm de pequenos bugs e uma enorme lista de desejos [9] para o Cucumber-Nagios, o projeto tambm pode incluir mais etapas predefinidas. Agora cabe comunidade de cdigo aberto contribuir. Se isso acontecer, o Cucumber-Nagios ter de uma vez por todas potencial para se tornar mais difundido e poder abrir caminho para uma infraestrutura orientada por comportamento.
Mais informaes
[1] Jenkins: http://jenkins-ci.org/ [2] CruiseControl: http://cruisecontrol.sourceforge.net/ [3] Cucumber-Nagios: http://auxesis.github.com/cucumber-nagios/ [4] Cucumber: http://cukes.info/ [5] Gherkin: https://github.com/aslakhellesoy/gherkin [6] Mechanize: http://mechanize.rubyforge. org/mechanize/Mechanize.html [7] Net::SSH: http://net-ssh.rubyforge.org/ [8] GivenWhenThen convenes no Cucumber: https:// github.com/aslakhellesoy/cucumber/wiki/Given-When-Then [9] Questes Cucumber-Nagios: https://github. com/auxesis/cucumber-nagios/issues
Gostou do artigo?
Queremos ouvir sua opinio. Fale conosco em cartas@linuxmagazine.com.br Este artigo no nosso site: http://lnm.com.br/article/5253
65