Beekeeper

 view release on metacpan or  search on metacpan

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

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

                    my $src = $stats->{$class}->{$metric};
                    my $dest = $cons->{$class}->{$metric} ||= [];

                    $dest->[TOTAL] += $src->[AVERAGE];
                    $dest->[COUNT]++;

                    $dest->[MAXIMUM] = 0 unless defined $dest->[MAXIMUM];
                    if ($src->[MAXIMUM] > $dest->[MAXIMUM]) {
                        $dest->[MAXIMUM] = $src->[MAXIMUM];
                    }
                }
            }
        }

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

                my $dest = $cons->{$class}->{$metric};

                my ($total, $count) = splice(@$dest, TOTAL, COUNT);

                $dest->[MAXIMUM] = sprintf("%.2f", $dest->[MAXIMUM]);
                $dest->[AVERAGE] = sprintf("%.2f", $total / $count);
            }
        }

        $cons->{global}->{load}->[MAXIMUM] = 0;
        $cons->{global}->{load}->[AVERAGE] = 0;

        foreach my $class (keys %$cons) {

            next if ($class eq '_global');

            if ($cons->{global}->{load}->[MAXIMUM] < $cons->{$class}->{load}->[MAXIMUM]) {
                $cons->{global}->{load}->[MAXIMUM] = $cons->{$class}->{load}->[MAXIMUM];
            }
            if ($cons->{global}->{load}->[AVERAGE] < $cons->{$class}->{load}->[AVERAGE]) {
                $cons->{global}->{load}->[AVERAGE] = $cons->{$class}->{load}->[AVERAGE];
            }
        }

        push @$stats_dest, [ $start, $cons ];
    }

    if (@$stats_dest > $keep) {
        # Discard old data
        shift @$stats_dest;
    }
}

sub _save_state {
    my ($self) = @_;

    my $pool_id = $self->{_WORKER}->{pool_id};
    ($pool_id) = ($pool_id =~ m/^([\w-]+)$/); # untaint
    my $tmp_file = "/tmp/beekeeper-dashboard-$pool_id-stats.dump";

    # Avoid stampede when several workers are exiting simultaneously
    return if (-e $tmp_file && (stat($tmp_file))[9] == time());

    # Lock file because several workers may try to write simultaneously to it
    sysopen(my $fh, $tmp_file, O_RDWR|O_CREAT) or return;
    flock($fh, LOCK_EX | LOCK_NB) or return;
    truncate($fh, 0) or return;

    print $fh encode_json([
        $self->{services_1s},
        $self->{services_5s},
        $self->{services_2m},
        $self->{services_15m},
        $self->{services_1h},
    ]);

    close($fh);
}

sub _load_state {
    my ($self) = @_;

    my $pool_id = $self->{_WORKER}->{pool_id};
    ($pool_id) = ($pool_id =~ m/^([\w-]+)$/); # untaint
    my $tmp_file = "/tmp/beekeeper-dashboard-$pool_id-stats.dump";

    return unless (-e $tmp_file);

    local($/);
    open(my $fh, '<', $tmp_file) or die "Couldn't read $tmp_file: $!";
    my $data = <$fh>;
    close($fh);

    local $@;
    my $dump = eval { decode_json($data) };
    return if $@;

    $self->{services_1s}  = $dump->[0];
    $self->{services_5s}  = $dump->[1];
    $self->{services_2m}  = $dump->[2];
    $self->{services_15m} = $dump->[3];
    $self->{services_1h}  = $dump->[4];
}

1;

__END__

=pod

=encoding utf8

=head1 NAME

Beekeeper::Service::Dashboard::Worker - Dashboard backend service

=head1 VERSION

Version 0.09

=head1 SYNOPSIS



( run in 2.801 seconds using v1.01-cache-2.11-cpan-d8267643d1d )