summaryrefslogtreecommitdiffstats
path: root/check_mem
blob: 725bedfabed6b67fc010e9430bcf2bcc51e50044 (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
#!/usr/bin/perl -T

use strict;
use warnings;

use VServer;
use Nagios::Plugin;

our $VERSION = '1.6';

sub init_nagios_plugin() {
    my $plugin = Nagios::Plugin->new(
        usage => "Usage: %s [-h|--help] [-w|--warnings=...] " .
                 "[-c|--critical=...] [-d|--domain=...] [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 differnet memory types (VM, RSS, ANON, LOCK).",
        label => "RANGE[,RANGE[,RANGE[,RANGE]]]",
    );

    $plugin->add_arg(
        spec => 'c|critical=s',
        help => "Critical thresholds for the differnet memory types (VM, RSS, ANON, LOCK).",
        label => "RANGE[,RANGE[,RANGE[,RANGE]]]",
    );

    $plugin->add_arg(
        spec => 'd|domain=s',
        help => 'Domainname to append in bulk mode or to stip ' .
                'in single host mode.',
        label => "DOMAIN",
    );

    return $plugin;
}

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

    if ($arg) {
        if ($arg =~ m/^([-:@~0-9]*),([-:@~0-9]*),([-:@~0-9]*),([-:@~0-9]*)$/) {
            return ($1, $2, $3, $4);
        }

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

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

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

    return undef;
}


# fix taint mode
if ($0 =~ m/(\w[\w\/]*\w)/) {
    $ENV{'NAGIOS_PLUGIN'} = $1;
}

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

my (%warn, %crit);
($warn{'vm'}, $warn{'rss'}, $warn{'anon'}, $warn{'vml'}) = parse_thresholds($n->opts->w);
($crit{'vm'}, $crit{'rss'}, $crit{'anon'}, $crit{'vml'}) = parse_thresholds($n->opts->c);

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

my $domain = '';
$domain = ('.' . $n->opts->d) if $n->opts->d;
$domain = quotemeta $domain;
$vserver =~ s/$domain$//;

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

my $mem = VServer::get_mem($id);
if ($mem) {
    my %desc;
    %desc = (
        vm => 'virtual memory',
        rss => 'resident set size',
        anon => 'anonymous memory',
        vml => 'locked memory',
    );

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

    for my $key (qw( vm rss anon vml )) {
        $n->add_perfdata(label => $key,
                         value => $mem->{$key},
                         min => 0,
                         warning => $warn{$key},
                         critical => $crit{$key},
        );

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

        $mb = int(($mem->{$key} / 1024) / 1024);
        $output .= " - $desc{$mem}: ${mb}MB";
    }

    $n->nagios_exit($n->max_state(@status), "used memory$output");
}

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