[SP-pm] rodar coisas periodicas em perl

Daniel de Oliveira Mantovani daniel.oliveira.mantovani at gmail.com
Mon Aug 26 07:21:56 PDT 2013


Tiago, "Easy things should be easy, and hard things should be
possible" - Larry Wall

2013/8/26 Tiago Peczenyj <tiago.peczenyj at gmail.com>:
> Depois vcs me pagam uma cerveja e fica tudo sussa.
>
>
> 2013/8/26 Lindolfo Lorn Rodrigues <lorn at lornlab.org>
>>
>> Antes que eu me esqueça: desculpe-me se insultei.
>>
>>
>> 2013/8/26 Lindolfo Lorn Rodrigues <lorn at lornlab.org>
>>>
>>> Não quis insultar, apenas dar outra visão para o problema :)
>>>
>>>
>>>
>>> 2013/8/26 Tiago Peczenyj <tiago.peczenyj at gmail.com>
>>>>
>>>> foi mal, agora eu tenho algo como
>>>>
>>>> while(1){
>>>>    # calcula
>>>>    # if passou um minuto envia pro zabbix
>>>>    # if passou um dia reinicia o contador
>>>>    sleep(1);
>>>> }
>>>>
>>>> qualquer sugestão é bem vinda. de repente o zabbix pode continuar com a
>>>> monitoria e posso usar o StatsD para essas coisas novas, ainda mais se for
>>>> menos burocratico.
>>>>
>>>>
>>>> 2013/8/26 Stanislaw Pusep <creaktive at gmail.com>
>>>>>
>>>>> Seja qual for o seu objetivo, o código que você postou já está feito e
>>>>> funcionando bem, aparenemente.
>>>>> "Eu mudaria boa parte do que você fez" e "Eu usaria o Statsd para
>>>>> acumular o valor e exportaria via graphite", seguido de "Eu não entendi bem
>>>>> o motivo de ficar rodando a cada segundo então vou chutar" é um insulto a
>>>>> sua inteligência, IMHO
>>>>>
>>>>>
>>>>> 2013/8/26 Tiago Peczenyj <tiago.peczenyj at gmail.com>
>>>>>>
>>>>>> Explain creaktive
>>>>>>
>>>>>>
>>>>>> 2013/8/26 Stanislaw Pusep <creaktive at gmail.com>
>>>>>>>
>>>>>>> Overengineering detected!
>>>>>>>
>>>>>>>
>>>>>>> 2013/8/26 Lindolfo Lorn Rodrigues <lorn at lornlab.org>
>>>>>>>>
>>>>>>>> Eu mudaria boa parte do que você fez.
>>>>>>>>
>>>>>>>> Não sei qual problema que você está tentando resolver com isso, por
>>>>>>>> isso tudo
>>>>>>>> isso aqui será uma mega hipotese, se puder dizer qual o problema
>>>>>>>> está tentando
>>>>>>>> resolver, seria legal :)
>>>>>>>>
>>>>>>>> Eu usaria o Statsd para acumular o valor e exportaria via graphite.
>>>>>>>>
>>>>>>>> Eu não entendi bem o motivo de ficar rodando a cada segundo então
>>>>>>>> vou chutar:
>>>>>>>>
>>>>>>>> Você que capturar ações de usuário/sistema em algum lugar?
>>>>>>>>
>>>>>>>> Caso sim, você poderia colocar esse codigo logo depois a ação do
>>>>>>>> usuário/sistema:
>>>>>>>>
>>>>>>>> my $statsd = Etsy::StatsD->new
>>>>>>>> my $bucket = "pacman.hit_number"
>>>>>>>> $statsd->increment($bucket);
>>>>>>>>
>>>>>>>> O stasd usa UDP, não vai alterar em nada perceptivo na perfomance,
>>>>>>>> do seu sistema.
>>>>>>>>
>>>>>>>> Mandando o contador acima para o statsd ele irá acumular e mandar
>>>>>>>> para o graphite,
>>>>>>>> no graphite com o dado cru você pode criar várias operações de
>>>>>>>> estatistica
>>>>>>>> ( mediana, media, percentile..etc ) e gerar graficos.
>>>>>>>>
>>>>>>>>
>>>>>>>> http://graphite.readthedocs.org/en/0.9.10/functions.html#module-graphite.render.functions
>>>>>>>>
>>>>>>>> O Statsd suporta vários backend o mais conhecido/usado deles é o
>>>>>>>> Graphite:
>>>>>>>> http://graphite.wikidot.com/screen-shots
>>>>>>>>
>>>>>>>> A Etsy tem um post explicando melhor a "metodologia" deles de medir
>>>>>>>> tudo:
>>>>>>>>
>>>>>>>>
>>>>>>>> http://codeascraft.com/2011/02/15/measure-anything-measure-everything/
>>>>>>>> https://github.com/etsy/statsd
>>>>>>>>
>>>>>>>> PS: O Statsd teve origem no Flickr, e a primeira versão era em Perl
>>>>>>>> recentemente eles
>>>>>>>> liberaram o código fonte:
>>>>>>>>
>>>>>>>> https://github.com/iamcal/Flickr-StatsD
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> 2013/8/26 Stanislaw Pusep <creaktive at gmail.com>
>>>>>>>>>
>>>>>>>>> Use AE::time() no lugar do localtime
>>>>>>>>>
>>>>>>>>> понедельник, 26 августа 2013 г. пользователь Tiago Peczenyj писал:
>>>>>>>>>
>>>>>>>>>> Ola
>>>>>>>>>>
>>>>>>>>>> Eu tenho o seguinte caso
>>>>>>>>>>
>>>>>>>>>> preciso rodar um certo método a cada segundo, que por sua vez
>>>>>>>>>> acumula um valor em algum atributo interno do objeto ( total += por exemplo
>>>>>>>>>> ).
>>>>>>>>>>
>>>>>>>>>> a cada minuto quero enviar o valor de total para algum lugar (ex
>>>>>>>>>> Zabbix).
>>>>>>>>>>
>>>>>>>>>> a meia noite eu quero limpar o total para 0.
>>>>>>>>>>
>>>>>>>>>> Eu cheguei a algo assim:
>>>>>>>>>> use AnyEvent;
>>>>>>>>>>
>>>>>>>>>> sub loop {
>>>>>>>>>> my $obj   = Foo->new;
>>>>>>>>>> my $cv    = AE::cv;
>>>>>>>>>>
>>>>>>>>>> my $seconds_in_a_day = 60 * 60 * 24;
>>>>>>>>>> my $seconds_to_midnight =  $seconds_in_a_day -
>>>>>>>>>> seconds_from_midnight();
>>>>>>>>>>
>>>>>>>>>> my $loop = AE::timer  0, 1,  sub { $obj->run   };
>>>>>>>>>>
>>>>>>>>>> my $send = AE::timer  60, 60,  sub { $obj->send  };
>>>>>>>>>>
>>>>>>>>>> my $clear= AE::timer  $seconds_to_midnight, $seconds_in_a_day,
>>>>>>>>>> sub { $obj->clear };
>>>>>>>>>> $cv->recv;
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> a sub seconds_from_midnight usa localtime pra fazer uma conta
>>>>>>>>>> marota.
>>>>>>>>>>
>>>>>>>>>> A assinatura do AE::timer eh
>>>>>>>>>>
>>>>>>>>>> AE::timer $delay, $interval, $callback;
>>>>>>>>>>
>>>>>>>>>> No primeiro timer eu tenho o meu main loop, chamando o metodo run.
>>>>>>>>>> No segundo eu tenho o metodo que envia os dados a cada 60 segundos
>>>>>>>>>> No terceiro eu calculo quantos segundos faltam para a meia noite e
>>>>>>>>>> mando repetir a cada 24 horas.
>>>>>>>>>>
>>>>>>>>>> hoje eu tenho um loop com um sleep 1 e varios ifs. quero que fique
>>>>>>>>>> mais legivel e nao utilizo anyEvent em nenhum outro lugar. Nao precisa ser
>>>>>>>>>> EXATO, portanto um atraso de alguns segundos pode acontecer.
>>>>>>>>>>
>>>>>>>>>> Parece bom, mas eu tenho algumas duvidas.
>>>>>>>>>>
>>>>>>>>>> 1) esta claro o suficiente?
>>>>>>>>>> 2) o overhead do AnyEvent parece ser o mesmo do sleep (1) durante
>>>>>>>>>> o runtime (ignorando quanto tempo demora pra iniciar ou não), certo?
>>>>>>>>>> 3) para rodar algo "a meia noite" me parece um tanto confuso
>>>>>>>>>> ainda. não encontrei nenhum helper q me ajude (o AnyEvent::Cron da pau pra
>>>>>>>>>> mim). sera q nao eh melhor "re-setar" o time watcher para a proxima meia
>>>>>>>>>> noite?
>>>>>>>>>> 4) alias tem algo melhor do que ficar brincando com localtime()
>>>>>>>>>> pra pegar quantos segundos faltam pra proxima meia noite? algo usando
>>>>>>>>>> DateTime
>>>>>>>>>>
>>>>>>>>>> por fim
>>>>>>>>>>
>>>>>>>>>> 5) tem algum problema ao usar AE::timer q eu não esteja vendo?
>>>>>>>>>> Fora os problemas interentes como se eu usar IO Bloqueante eu não vou ter os
>>>>>>>>>> timers "exatos".
>>>>>>>>>>
>>>>>>>>>> Obrigado
>>>>>>>>>>
>>>>>>>>>> Tiago
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Tiago B. Peczenyj
>>>>>>>>>> Linux User #405772
>>>>>>>>>>
>>>>>>>>>> http://about.me/peczenyj
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> =begin disclaimer
>>>>>>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>>>>>>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>>>>>> =end disclaimer
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> =begin disclaimer
>>>>>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>>>>>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>>>>> =end disclaimer
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> =begin disclaimer
>>>>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>>>>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>>>> =end disclaimer
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Tiago B. Peczenyj
>>>>>> Linux User #405772
>>>>>>
>>>>>> http://about.me/peczenyj
>>>>>>
>>>>>> =begin disclaimer
>>>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>>>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>>> =end disclaimer
>>>>>>
>>>>>
>>>>>
>>>>> =begin disclaimer
>>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>>> =end disclaimer
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Tiago B. Peczenyj
>>>> Linux User #405772
>>>>
>>>> http://about.me/peczenyj
>>>>
>>>> =begin disclaimer
>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>> =end disclaimer
>>>>
>>>
>>
>>
>> =begin disclaimer
>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>
>
>
> --
> Tiago B. Peczenyj
> Linux User #405772
>
> http://about.me/peczenyj
>
> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>



-- 

-dom

--

Daniel de Oliveira Mantovani
Business Analytic Specialist
Perl Evangelist /Astrophysics hobbyist.
+55 11 9 8538-9897
XOXO


More information about the SaoPaulo-pm mailing list