Sunteți pe pagina 1din 6

REDES | Cucumber-Nagios

Monitoramento orientado por comportamento

REDES

A soluo dos seus pepinos


O desenvolvimento gil de aplicativos comum, mas os administradores de sistemas muitas vezes no tm opes comparveis. Um plugin para o Nagios baseado em Ruby chamado Cucumber-Nagios pode mudar isso. por Mike Adolphs

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

Como muitos outros aplicativos escritos em Ruby, o Cucumber-

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-

Listagem 1: Novos recursos do Integrated Generator


01 02 03 04 cucumbernagiosgen feature www.xing.com startpage Generating with feature generator: [ADDED] features/www.xing.com/startpage.feature.feature [ADDED] features/www.xing.com/steps/startpage.feature_steps.rb

Linux Magazine #79 | Junho de 2011

61

REDES | Cucumber-Nagios

Listagem 2: Disponibilidade de www.xing.com


01 02 03 04 05 06 Feature: www.xing.com It should be reachable Scenario: Visiting the website When I go to http://www.xing.com/ Then the request should succeed

A palavra-chave But muito semelhante a And, contudo define critrios de excluso:


But I should not see "Join XING for free"

Listagem 3: Vericao de login


01 ./features/www.xing.com/login.feature 02 Feature: www.xing.com 03 I should be able to login on http://www.xing.com/ 04 05 Scenario: Logging in 06 Given I am on http://www.xing.com/ 07 When I fill in "usernamefield" with "username" 08 And I fill in "passwordfield" with "password" 09 And I press "loginbutton" 10 Then I should see "Whats new in your network" 11 But I should not see "Join XING for free"

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

os resultados. Neste caso, estou interessado em saber se o login funciona ou no:


Then I should see "Whats new in your network"

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

x-lo executar um ping no endereo www.xing.com via ICMP ficaria assim:


Feature: www.xing.com It should respond Scenario: Ping test When I ping www.xing.com Then it should respond

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$ }

Listagem 4: features/steps/ ping_steps.rb


01 When /^I ping (.*)$/ do |host| 02 @result = system("ping c1 #{host} > /dev/null 2>&1") 03 end 04 05 Then /^it should respond$/ do 06 @result.should be_true 07 end 08 09 Then /^it should not respond$/ do 10 @result.should be_false 11 end

Listagem 5: Arquivo services.cfg


01 define service{ 02 uselocalservice 03 host_namelocalhost 04 service_descriptionCN www.xing.com startpage 05 check_commandcheck_cn!$USER2$/ checks/features/www.xing.com/ startpage.feature 06 }

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

Integrao com o Nagios


A integrao com o seu prprio sistema de controle facilmente realizada. Como exemplo, vamos usar o

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

Linux Magazine #79 | Junho de 2011

63

REDES | Cucumber-Nagios

Figura 1: Depois de escrever todos os seus testes no Cucumber, os resultados do monitoramento sero exibidos no Nagios.

Listagem 6: Solucionar problemas com o registro de chamadas


01 ~ $ [sudo] su nagios c "/usr/lib/nagios/plugins/cucumbernagios/ checks/bin/cucumbernagios /usr/lib/nagios/plugins/cucumbernagios/ checks/features/www.xing.com/startpage.feature pretty"; 02 Feature: www.xing.com 03 It should be up 04 05 Scenario: Visiting home page # /usr/lib/nagios/plugins/ cucumbernagios/checks/features/www.xing.com/startpage.feature:4 06 When I go to http://www.xing.com/# steps/webrat_steps.rb:1 07 Permission denied webrat.log (Errno::EACCES) 08 /usr/lib64/ruby/1.8/logger.rb:518:in 'initialize' 09 /usr/lib64/ruby/1.8/logger.rb:518:in 'open' 10 /usr/lib64/ruby/1.8/logger.rb:518:in 'open_logfile' 11 /usr/lib64/ruby/1.8/logger.rb:487:in 'initialize' 12 /usr/lib64/ruby/1.8/logger.rb:263:in 'new' 13 /usr/lib64/ruby/1.8/logger.rb:263:in 'initialize' 14 /usr/lib/nagios/plugins/cucumbernagios/checks/features/ steps/webrat_steps.rb:2:in '/^I go to (.*)$/' 15 /usr/lib/nagios/plugins/cucumbernagios/checks/ features/www.xing.com/startpage.feature:5:in 'When I go to http://www.xing.com/' 16 Then the request should succeed# steps/result_steps.rb:13 17 And I should see "Join XING for free"# steps/result_steps.rb:1 18 And I should not see "Welcome to Facebook"# steps/ result_steps.rb:5 19 20 Failing Scenarios: 21 cucumber /usr/lib/nagios/plugins/cucumbernagios/checks/features/ www.xing.com/startpage.feature:4# Scenario: Visiting home page 22 23 1 scenario (1 failed) 24 4 steps (1 failed, 3 skipped) 25 0m0.008s

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

Linux Magazine #79 | Junho de 2011

65

S-ar putea să vă placă și