Beekeeper

 view release on metacpan or  search on metacpan

examples/dashboard/lib/Beekeeper/Service/Dashboard/Worker.pm  view on Meta::CPAN

    unless ($class) {
        return [ @$stats[$idx..(@$stats - 1)] ];
    }

    my @svc_stats;

    foreach my $st (@$stats[$idx..(@$stats - 1)]) {
        next unless exists $st->[STATS]->{$class};
        push @svc_stats, [ $st->[TSTAMP], $st->[STATS]->{$class} ];
    }

    return \@svc_stats;
}

sub log_tail {
    my ($self, $params, $req) = @_;

    my %filters;

    foreach my $filter (qw'service count level after host pool message') {
        next unless $params->{$filter};
        $filters{$filter} = $params->{$filter};
    }

    $req->async_response;
    $req->deflate_response;

    Beekeeper::Service::LogTail->tail_async(
        %filters,
        on_success => sub {
            my ($resp) = @_;
            $req->send_response( $resp->result );
        },
        on_error => sub {
            my ($resp) = @_;
            $req->send_response( $resp );
        },
    );
}


sub _init_collector {
    my ($self) = @_;
    weaken($self);

    $self->_load_state;

    $self->{services_1s}  ||= [];
    $self->{services_5s}  ||= [];
    $self->{services_2m}  ||= [];
    $self->{services_15m} ||= [];
    $self->{services_1h}  ||= [];

    my $now  = Time::HiRes::time;
    my $msec = $now - int($now);

    my $offs_1s  = $msec;
    my $offs_5s  = $now % 5  + $msec;
    my $offs_1m  = $now % 60 + $msec;

    $self->{collect_tmr} = AnyEvent->timer( 
        after    => 1 - $offs_1s,
        interval => 1,
        cb => sub {
            Beekeeper::Service::Supervisor->get_services_status_async(
                on_success => sub {
                    my ($resp) = @_;
                    $self->_collect_stats( $resp->result );
                },
                on_error => sub {
                    my ($error) = @_;
                    log_warn $error->message;
                },
            );
        },
    );

    $self->{consolidate_5s_tmr} = AnyEvent->timer( 
        after    => 5 - $offs_5s,
        interval => 5,
        cb => sub {

            # 1 hour in 5 sec resolution
            $self->_consolidate(
                from   => $self->{services_1s},
                into   => $self->{services_5s},
                period => 5,
                keep   => 60 * 60/5, # 720
            );
        },
    );

    $self->{consolidate_1m_tmr} = AnyEvent->timer( 
        after    => 60 - $offs_1m,
        interval => 60,
        cb => sub {

            # 1 day in 2 min resolution
            $self->_consolidate(
                from   => $self->{services_5s},
                into   => $self->{services_2m},
                period => 2 * 60,
                keep   => 24 * 60/2, # 720
            );

            # 1 week in 15 min resolution
            $self->_consolidate(
                from   => $self->{services_2m},
                into   => $self->{services_15m},
                period => 15 * 60,
                keep   => 7 * 24 * 60/15, # 672
            );

            # 1 month in 1 hour resolution 
            $self->_consolidate(
                from   => $self->{services_15m},
                into   => $self->{services_1h},
                period => 60 * 60,
                keep   => 31 * 24, # 744
            );
        },
    );
}

sub _collect_stats {
    my ($self, $stats) = @_;

    my $now = int( time );
    my $global = { load => 0 };

    foreach my $class (keys %$stats) {
        foreach my $metric (keys %{$stats->{$class}}) {

            my $val = $stats->{$class}->{$metric};

            $stats->{$class}->{$metric} = [ $val, $val ];

            if ($metric eq 'load') {
                # Global load is the load of the most stressed service
                next unless $global->{load} < $val;
                $global->{load} = $val;
            }
            else {
                $global->{$metric} += $val;
            }
        }
    }

    foreach my $metric (keys %$global) {
        my $val = sprintf("%.2f", $global->{$metric});
        $global->{$metric} = [ $val, $val ];
    }



( run in 1.318 second using v1.01-cache-2.11-cpan-39bf76dae61 )