Skip to content

Commit 03a25b9

Browse files
committed
added cpu-overload.pl
1 parent 0f50dfb commit 03a25b9

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

cpu-overload.pl

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#!/usr/bin/env perl
2+
3+
use strict;
4+
use warnings;
5+
use v5.10;
6+
use Storable qw/store retrieve/;
7+
8+
my $limit = 0.75;
9+
my $statefile = '/tmp/icinga-cpu-overload.state';
10+
11+
my %data_diff;
12+
my $data_old;
13+
my $data_new = parse_data();
14+
15+
eval { $data_old = retrieve( $statefile ); };
16+
# on first run there won't be a state file
17+
if ( $@ ) {
18+
store $data_new, $statefile or die "Can't store %data_new to $statefile!\n";
19+
exit 1;
20+
}
21+
store $data_new, $statefile or die "Can't store %data_new to $statefile!\n";
22+
23+
my $alert;
24+
for my $cpu ( sort keys %{ $data_new } ) {
25+
for my $key ( keys %{ $data_new->{ $cpu } } ) {
26+
$data_diff{ $cpu }{ $key } = $data_new->{ $cpu }->{ $key } - $data_old->{ $cpu }->{ $key };
27+
}
28+
29+
my $user = $data_new->{ $cpu }->{user};
30+
my $irq = $data_new->{ $cpu }->{irq};
31+
my $softirq = $data_new->{ $cpu }->{softirq};
32+
my $system = $data_new->{ $cpu }->{system};
33+
my $nice = $data_new->{ $cpu }->{nice};
34+
my $iowait = $data_new->{ $cpu }->{iowait};
35+
my $idle = $data_new->{ $cpu }->{idle};
36+
37+
if ( (($system + $irq + $softirq) / ($user + $nice + $iowait + $idle)) > $limit ) {
38+
$alert .= " $cpu";
39+
}
40+
}
41+
42+
if ( $alert ) { say "CRITICAL - following cpus are overloaded $alert"; exit 2; }
43+
else { say 'OK - all CPUs seem to be fine.'; }
44+
45+
################################################################################
46+
sub parse_data {
47+
################################################################################
48+
my $stat_ref = read_file( '/proc/stat' );
49+
my @raw_data = grep( /^cpu\d+/, @{ $stat_ref });
50+
my %data_tmp;
51+
52+
for my $line ( @raw_data ) {
53+
chomp $line;
54+
my ( $cpu, $user, $nice, $system, $idle, $iowait, $irq, $softirq, $steal ) = split( /\s+/, $line );
55+
$data_tmp{$cpu} = {
56+
user => $user,
57+
nice => $nice,
58+
system => $system,
59+
idle => $idle,
60+
iowait => $iowait,
61+
irq => $irq,
62+
softirq => $softirq
63+
};
64+
}
65+
66+
return \%data_tmp;
67+
}
68+
69+
################################################################################
70+
sub read_file {
71+
################################################################################
72+
my $filename = shift;
73+
open(my $fh, '<:encoding(UTF-8)', $filename)
74+
or die "Could not open file '$filename' $!";
75+
my @content = <$fh>;
76+
return \@content;
77+
}

0 commit comments

Comments
 (0)