boinc/rboinc/monitoring/monitoring_errors.pl

95 lines
1.9 KiB
Perl

#!/usr/bin/perl
# $Id$
# Script to generate the per-error per-user pivot report
use strict;
use warnings;
use Text::Table;
use DBI;
use monitoring_errors_table;
my $dbuser="DB_USER";
my $dbpass="DB_PASSWORD";
# List of errors to monitor
my @tomon=(-198,-197,-233,-186,-226,-185,-177,-187,1,2,3);
## End user-serviceable parts
our %error_table;
my $dbh = DBI->connect('DBI:mysql:DB_NAME', $dbuser, $dbpass
) || die "Could not connect to database: $DBI::errstr";
# Generate a table of errors in the last 24 h
# in principle, the time intervals could be selected as
# SELECT distinct monitor_time t FROM monitoring m order by t desc limit 1,1
# i.e. the second-to-last monitoring time
$dbh->do('set @ut=unix_timestamp();') ||
die "Query error: $DBI::errstr";
$dbh->do('set @uf=@ut-3600*24;') ||
die "Query error: $DBI::errstr";
my $sql = <<'EOF';
SELECT mon_submitterof(name) sci, exit_status
FROM result
WHERE outcome=3
AND received_time BETWEEN @uf and @ut;
EOF
# $sql='select @uf,@ut';
my $st=$dbh->prepare($sql);
$st->execute();
# Initialize the table of descriptions of "interesting" errors
my $colsr={other=>"(Any other exit code)"};
foreach my $e (@tomon) {
my $t=$error_table{$e} || "(Exit code by app)";
$t=~s/^ERR_//;
$colsr->{$e}=$t;
}
# Pivot table
my $data={};
while(my @res=$st->fetchrow_array()) {
my ($sci,$err)=@res;
if($colsr->{$err}) { # interesting?
$data->{$sci}->{$err}++;
} else { # otherwise
$data->{$sci}->{other}++;
}
}
# List of scientists: sort keys %$data
# List of errors: sort keys %$colsr
# Print table header 1
my @header=("Code","Error",sort keys %$data);
my $table = Text::Table->new( @header );
# Table contents
foreach my $col (sort keys %$colsr ) {
my @body=($col,$colsr->{$col});
foreach my $sci (sort keys %$data) {
my $n=$data->{$sci}->{$col} || 0;
push @body,$n;
}
$table->add(@body);
}
print $table;