aboutsummaryrefslogtreecommitdiff
path: root/modules/private/monitoring/plugins/check_eriomem
blob: 880b88a0bd85fcbcfa131bc502559c7fd1f63701 (plain) (blame)
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
#!/usr/bin/env python
import os
import sys
import getopt
import signal
from subprocess import Popen, PIPE

STATE_OK = 0
STATE_WARNING = 1
STATE_CRITICAL = 2
STATE_UNKNOWN = 3

keys = sys.argv[1].split(",")

def to_args(k):
    access, secret = k.split(":", 1)
    return [
            "s3cmd",
            '-c=/dev/null',
            '--no-check-certificate',
            '--access_key={}'.format(access),
            '--secret_key={}'.format(secret),
            '--host=e.eriomem.net',
            '--host-bucket=%(bucket)s.e.eriomem.net',
            'du'
            ]

max_size = 1024*1024*1024*1024
warning_percent = 99.75
critical_percent = 99.95

def output(code, msg):
    print(msg)
    sys.exit(code)

def main():
    def handler(signum, frame):
        raise IOError
    signal.signal(signal.SIGALRM, handler)
    signal.alarm(60)

    try:
        ps = [Popen(to_args(a), stdout=PIPE, stderr=PIPE) for a in keys]
        outs = [p.communicate() for p in ps]
        rets = [p.wait() for p in ps]
    except IOError:
        for p in ps:
            os.kill(p.pid, signal.SIGTERM)
        output(STATE_UNKNOWN,
                "Eriomem UNKNOWN - Command timeout after 60 seconds!")

    signal.alarm(0)

    if sum(rets) == 0:
        usages = [int(out[0].decode().split("\n")[-2].split()[0]) for out in outs]
        usage = sum(usages)
        use_percent = 100 * usage / max_size
        if use_percent > critical_percent:
            output(STATE_CRITICAL,
                    "Eriomem CRITICAL - bucket usage: %s (%s%%);| size=%s;;;;" %
                    (sizeof_fmt(usage), use_percent, sizeof_fmt(usage)))
        elif use_percent > warning_percent:
            output(STATE_WARNING,
                    "Eriomem WARNING - bucket usage: %s (%s%%);| size=%s;;;;" %
                    (sizeof_fmt(usage), use_percent, sizeof_fmt(usage)))
        else:
            output(STATE_OK,
                    "Eriomem OK - bucket usage: %s (%d%%);| size=%s;;;;" %
                    (sizeof_fmt(usage), use_percent, sizeof_fmt(usage)))
    else:
        messages = "\n".join([out[0].decode() + out[1].decode() for out in outs])
        output(STATE_UNKNOWN,
                "Eriomem UNKNOWN - Error in command")

def sizeof_fmt(num):
    for unit in ['','ko','Mo','Go','To','Po','Eo','Zo']:
        if abs(num) < 1024.0:
            return "%3.1f%s" % (num, unit)
        num /= 1024.0
    return "%.1f%s%s" % (num, 'Yo')

if __name__ == '__main__':
    main()