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 )