[SP-pm] rodar coisas periodicas em perl

Lindolfo Lorn Rodrigues lorn at lornlab.org
Mon Aug 26 05:22:18 PDT 2013


Antes que eu me esqueça: desculpe-me se insultei.


2013/8/26 Lindolfo Lorn Rodrigues <lorn em lornlab.org>

> Não quis insultar, apenas dar outra visão para o problema :)
>
>
>
> 2013/8/26 Tiago Peczenyj <tiago.peczenyj em 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 em 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 em gmail.com>
>>>
>>>> Explain creaktive
>>>>
>>>>
>>>> 2013/8/26 Stanislaw Pusep <creaktive em gmail.com>
>>>>
>>>>> Overengineering detected!
>>>>>
>>>>>
>>>>> 2013/8/26 Lindolfo Lorn Rodrigues <lorn em 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 em 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 em 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 em 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 em 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 em 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 em 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 em pm.org
>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>>
>
-------------- Pr�xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130826/e26bb40b/attachment-0001.html>


More information about the SaoPaulo-pm mailing list