[SP-pm] rodar coisas periodicas em perl

Lindolfo Lorn Rodrigues lorn at lornlab.org
Mon Aug 26 05:06:31 PDT 2013


O que o statsd faz por default é exatamente acumular o "bucket" por 1
minuto, enviar para o graphite, e limpar o acumulador.


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
>
>
-------------- Pr�xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130826/8ee7a857/attachment.html>


More information about the SaoPaulo-pm mailing list