summaryrefslogtreecommitdiffstats
path: root/check_load
blob: a41447860d726e694deffd8d0e0e30817138088c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/perl -T

use strict;
use warnings;

use VServer;
use Nagios::Plugin;

our $VERSION = '1.1';

sub init_nagios_plugin() {
    my $plugin = Nagios::Plugin->new(
        usage => "Usage: %s [-h|--help] [-w|--warnings=...] " .
                 "[-c|--critical=...] vserver-name",
        version => $VERSION,
        blurb => "This plugin could monitor the load of single vserver guests."
    );

    $plugin->add_arg(
        spec => 'w|warning=s',
        help => "Warning thresholds for the different load types.",
        label => "INTEGER[,INTEGER[,INTEGER]]",
    );

    $plugin->add_arg(
        spec => 'c|critical=s',
        help => "Critical thresholds for the different load types.",
        label => "INTEGER[,INTEGER[,INTEGER]]",
    );

    return $plugin;
}

sub parse_thresholds($) {
    my $arg = shift;

    if ($arg) {
        if ($arg =~ m/([0-9]+),([0-9]+),([0-9]+)/) {
            return ($1, $2, $3);
        }

        if ($arg =~ m/([0-9]+),([0-9]+)/) {
            return ($1, $2, $2);
        }

        if ($arg =~ m/([0-9]+)/) {
            return ($1, $1, $1);
        }
    }

    return (0, 0, 0);
}

sub get_load($$) {
    my $n = shift;
    my $context = shift;

    my $proc = VServer::get_proc_dir($context);
    unless ($proc) {
        $n->nagios_exit(UNKNOWN, "vserver not running");
    }

    open(my $cvirt, "<", "$proc/cvirt") ||
        $n->nagios_exit(UNKNOWN, "could not open '$proc/cvirt'");

    my @load = undef;
    while (<$cvirt>) {
        if ($_ =~ m/^loadavg:\s*([0-9.]+)\s*([0-9.]+)\s*([0-9.]+)$/) {
            @load = ($1, $2, $3);
            last;
        }
    }

    close($cvirt);

    return @load;
}


my $n = init_nagios_plugin();
$n->getopts();
alarm $n->opts->timeout;

my (%warn, %crit);
($warn{'load1'}, $warn{'load5'}, $warn{'load15'}) = parse_thresholds($n->opts->w);
($crit{'load1'}, $crit{'load5'}, $crit{'load15'}) = parse_thresholds($n->opts->c);

for my $load (qw( load1 load5 load15 )) {
    if ($crit{$load} < $warn{$load}) {
        $n->nagios_exit(UNKNOWN, "Parameter inconsistency: warning load" .
                        "is greater than critical load for '$load'");
    }
}

my $vserver = shift;
unless ($vserver) {
    $n->nagios_exit(UNKNOWN, "vserver name required");
}

my $context = VServer::get_context_id($vserver);
unless ($context) {
    $n->nagios_exit(UNKNOWN, "vserver '$vserver' not found");
}

my @load = get_load($n, $context);
if (@load) {
    my %values;
    ($values{'load1'}, $values{'load5'}, $values{'load15'}) = @load;

    my @status = [ UNKNOWN ];
    my $output = "";

    for my $load (qw( load1 load5 load15 )) {
        $n->add_perfdata(label => $load,
                         value => $values{$load},
                         warning => $warn{$load},
                         critical => $crit{$load},
                         min => 0,
        );

        push(@status,
             $n->check_threshold(check => $values{$load},
                                 warning => $warn{$load},
                                 critical => $crit{$load}
             )
        );

        $output .= " $values{$load}";
    }

    $n->nagios_exit($n->max_state(@status), "load average:$output");
}

$n->nagios_exit(UNKNOWN, 'unable to parse loadavg');