[SP-pm] rodar coisas periodicas em perl

Tiago Peczenyj tiago.peczenyj at gmail.com
Mon Aug 26 04:42:17 PDT 2013


eu estou enviando dados para o Zabbix. geral reclamou que estou enviando
muita seguido (pois eu coleto dados a cada segundo) entao estou acumulando
para enviar a cada minuto.

a ideia de limpar a meia noite eh para ter uma ideia diaria. eu queria soh
enviar um dado e eles q somassem mas...



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


-- 
Tiago B. Peczenyj
Linux User #405772

http://about.me/peczenyj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130826/4cc10204/attachment.html>


More information about the SaoPaulo-pm mailing list