-
Notifications
You must be signed in to change notification settings - Fork 1
/
rabbitmq-queue.py
142 lines (109 loc) · 4.27 KB
/
rabbitmq-queue.py
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
135
136
137
138
139
140
141
142
#!/usr/bin/env /usr/bin/python
from optparse import OptionParser
import urllib2
import json
from pprint import pprint
from pynagios import Plugin, make_option
import time
import datetime
class RabbitQueueCheck(Plugin):
"""
performs a nagios compliant check on a single queue and
attempts to catch all errors. expected usage is with a critical threshold of 0
"""
username = make_option("--username", dest="username", help="RabbitMQ API username", type="string", default="guest")
password = make_option("--password", dest="password", help="RabbitMQ API password", type="string", default="guest")
port = make_option("--port", dest="port", help="RabbitMQ API port", type="string", default="15672")
vhost = make_option("--vhost", dest="vhost", help="RabbitMQ vhost", type="string", default='%2F')
queue = make_option("--queue", dest="queue", help="Name of the queue in inspect", type="string", default="queue")
def doApiGet(self):
"""
performs and returns content from an api get
"""
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, self.url, self.options.username, self.options.password)
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(handler)
response = None
try:
request = opener.open(self.url)
response = request.read()
request.close()
except Exception, e:
response = False
self.rabbit_error = 2
self.rabbit_note = "problem with api get:" + str(e)
return response
def makeQueueUrl(self):
"""
forms self.url, a correct url to polling a rabbit queue
"""
try:
self.url = "http://%s:%s/api/queues/%s/%s" % (self.options.hostname,
self.options.port, self.options.vhost, self.options.queue)
return True
except Exception, e:
self.rabbit_error = 3
self.rabbit_note = "problem forming api url:", e
return False
def testOptions(self):
"""
returns false if necessary options aren't present
"""
if not self.options.hostname or not self.options.port \
or not self.options.vhost or not self.options.queue:
return False
return True
def quickExit(self, v):
"""
zero out the perf data and return
"""
result = self.response_for_value(self.rabbit_error)
if not self.options.queue:
queue = 'queue'
else:
queue = self.options.queue
result.set_perf_data(queue + "_messages", 0)
result.set_perf_data(queue + "_rate", 0)
result.set_perf_data(queue + "_consumers", 0)
result.set_perf_data("rabbit_error", self.rabbit_error)
result.message = self.rabbit_note
return result
def parseJson(self, response):
"""
parse test and return api json
"""
try:
data = json.loads(response)
except Exception, e:
data = None
self.rabbit_error = 4
self.rabbit_note = "problem with json parse:", e
return data
def check(self):
"""
returns a response and perf data for this check
"""
self.rabbit_error = 0
self.rabbit_note = "action performed successfully"
if not self.testOptions():
return self.quickExit(255)
if not self.makeQueueUrl():
return self.quickExit(255)
response = self.doApiGet()
if self.rabbit_error > 0:
return self.quickExit(255)
data = self.parseJson(response)
if self.rabbit_error > 0:
return self.quickExit(255)
queue = self.options.queue
result = self.response_for_value(self.rabbit_error)
result.set_perf_data(queue + "_messages", data['messages'])
result.set_perf_data(queue + "_rate", data['messages_details']['rate'])
result.set_perf_data(queue + "_consumers", data['consumers'])
result.set_perf_data("rabbit_error", self.rabbit_error)
result.message = self.rabbit_note
return result
if __name__ == "__main__":
obj = RabbitQueueCheck()
obj.check().exit()