Skip to content
This repository was archived by the owner on Sep 6, 2023. It is now read-only.

Commit f0c011e

Browse files
author
jasonmcintosh
committed
Added log level support, fixed when no shovel plugin installed and a bug with zabbix_sender return code changes
1 parent ba88438 commit f0c011e

7 files changed

Lines changed: 49 additions & 26 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
*.auth
33
*.gz
44
*~
5-
5+
*.swp
6+
*.log

rabbitmq.template.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1341,7 +1341,7 @@
13411341
<dependencies/>
13421342
</trigger>
13431343
<trigger>
1344-
<expression>{Template App RabbitMQ v3:rabbitmq[queues].last(0)}&lt;&gt;0 or {Template App RabbitMQ v3:rabbitmq[queues].nodata(5m)}=1</expression>
1344+
<expression>{Template App RabbitMQ v3:rabbitmq[queues].last(0)}=1 or {Template App RabbitMQ v3:rabbitmq[queues].nodata(5m)}=1</expression>
13451345
<name>Queue data status issue</name>
13461346
<url/>
13471347
<status>0</status>

scripts/rabbitmq/api.py

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import os
1313
import logging
1414

15-
logging.basicConfig(filename='/var/log/zabbix/rabbitmq_zabbix.log', level=logging.INFO, format='%(asctime)s %(levelname)s: %(message)s')
1615

1716
class RabbitMQAPI(object):
1817
'''Class for RabbitMQ Management API'''
@@ -32,7 +31,7 @@ def call_api(self, path):
3231
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
3332
password_mgr.add_password(None, url, self.user_name, self.password)
3433
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
35-
logging.debug('Issue a rabbit API call to get data on ' + path)
34+
logging.debug('Issue a rabbit API call to get data on ' + path + " against " + self.host_name)
3635
return json.loads(urllib2.build_opener(handler).open(url).read())
3736

3837
def list_queues(self, filters=None):
@@ -64,18 +63,24 @@ def list_shovels(self, filters=None):
6463
shovels = []
6564
if not filters:
6665
filters = [{}]
67-
for shovel in self.call_api('shovels'):
68-
logging.debug("Discovered shovel " + shovel['name'] + ", checking to see if it's filtered...")
69-
for _filter in filters:
70-
check = [(x, y) for x, y in shovel.items() if x in _filter]
71-
shared_items = set(_filter.items()).intersection(check)
72-
if len(shared_items) == len(_filter):
73-
element = {'{#VHOSTNAME}': shovel['vhost'],
74-
'{#SHOVELNAME}': shovel['name']}
75-
shovels.append(element)
76-
logging.debug('Discovered shovel '+shovel['vhost']+'/'+shovel['name'])
77-
break
78-
return shovels
66+
try:
67+
for shovel in self.call_api('shovels'):
68+
logging.debug("Discovered shovel " + shovel['name'] + ", checking to see if it's filtered...")
69+
for _filter in filters:
70+
check = [(x, y) for x, y in shovel.items() if x in _filter]
71+
shared_items = set(_filter.items()).intersection(check)
72+
if len(shared_items) == len(_filter):
73+
element = {'{#VHOSTNAME}': shovel['vhost'],
74+
'{#SHOVELNAME}': shovel['name']}
75+
shovels.append(element)
76+
logging.debug('Discovered shovel '+shovel['vhost']+'/'+shovel['name'])
77+
break
78+
return shovels
79+
except urllib2.HTTPError as err:
80+
if err.code == 404:
81+
return shovels
82+
else:
83+
raise err
7984

8085
def list_nodes(self):
8186
'''Lists all rabbitMQ nodes in the cluster'''
@@ -165,7 +170,7 @@ def _prepare_data(self, queue, tmpfile):
165170

166171
def _send_data(self, tmpfile):
167172
'''Send the queue data to Zabbix.'''
168-
args = 'zabbix_sender -c {0} -i {1}'
173+
args = 'zabbix_sender -vv -c {0} -i {1}'
169174
if self.senderhostname:
170175
args = args + " -s " + self.senderhostname
171176
return_code = 0
@@ -176,9 +181,9 @@ def _send_data(self, tmpfile):
176181
logging.debug("Finished sending data")
177182
return_code = process.wait()
178183
logging.info("Found return code of " + str(return_code))
179-
if return_code != 0:
180-
logging.warning(out)
181-
logging.warning(err)
184+
if return_code == 1:
185+
logging.error(out)
186+
logging.error(err)
182187
else:
183188
logging.debug(err)
184189
logging.debug(out)
@@ -198,8 +203,11 @@ def check_server(self, item, node_name):
198203
return self.call_api('overview').get('rabbitmq_version', 'None')
199204
'''Return the value for a specific item in a node's details.'''
200205
node_name = node_name.split('.')[0]
201-
for nodeData in self.call_api('nodes'):
202-
if node_name in nodeData['name']:
206+
nodeInfo = self.call_api('nodes')
207+
for nodeData in nodeInfo:
208+
logging.debug("Checking to see if node name {0} is in {1} for item {2} found {3} nodes".format(node_name, nodeData['name'], item, len(nodeInfo)))
209+
if node_name in nodeData['name'] or len(nodeInfo) == 1:
210+
logging.debug("Got data from node {0} of {1} ".format(node_name, nodeData.get(item)))
203211
return nodeData.get(item)
204212
return 'Not Found'
205213

@@ -224,9 +232,13 @@ def main():
224232
parser.add_option('--node', help='Which node to check (valid for --check=server)')
225233
parser.add_option('--conf', default='/etc/zabbix/zabbix_agentd.conf')
226234
parser.add_option('--senderhostname', default='', help='Allows including a sender parameter on calls to zabbix_sender')
235+
parser.add_option('--logfile', help='File to log errors (defaults to /var/log/zabbix/rabbitmq_zabbix.log)', default='/var/log/zabbix/rabbitmq_zabbix.log')
236+
parser.add_option('--loglevel', help='Defaults to INFO', default='INFO')
227237
(options, args) = parser.parse_args()
228238
if not options.check:
229239
parser.error('At least one check should be specified')
240+
logging.basicConfig(filename=options.logfile or "/var/log/zabbix/rabbitmq_zabbix.log", level=logging.getLevelName(options.loglevel or "INFO"), format='%(asctime)s %(levelname)s: %(message)s')
241+
230242
logging.debug("Started trying to process data")
231243
api = RabbitMQAPI(user_name=options.username, password=options.password,
232244
host_name=options.hostname, port=options.port,

scripts/rabbitmq/list_rabbit_nodes.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ if [[ -z "$NODE" ]]; then
1212
NODE=`hostname`
1313
fi
1414

15-
./api.py --username=$USERNAME --password=$PASSWORD --check=list_nodes --filter="$FILTER" --conf=$CONF --hostname=$HOSTNAME --node="$NODE"
15+
./api.py --username=$USERNAME --password=$PASSWORD --check=list_nodes --filter="$FILTER" --conf=$CONF --hostname=$HOSTNAME --node="$NODE" --loglevel=${LOGLEVEL} --logfile=${LOGFILE}

scripts/rabbitmq/list_rabbit_queues.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ if [[ -z "$NODE" ]]; then
1212
NODE=`hostname`
1313
fi
1414

15-
./api.py --username=$USERNAME --password=$PASSWORD --check=list_queues --filter="$FILTER" --conf=$CONF --hostname=$HOSTNAME --node="$NODE"
15+
./api.py --username=$USERNAME --password=$PASSWORD --check=list_queues --filter="$FILTER" --conf=$CONF --hostname=$HOSTNAME --node="$NODE" --loglevel=${LOGLEVEL} --logfile=${LOGFILE}

scripts/rabbitmq/list_rabbit_shovels.sh

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,14 @@
44
#
55
cd "$(dirname "$0")"
66
. .rab.auth
7-
./api.py --username=$USERNAME --password=$PASSWORD --check=list_shovels --filter="$FILTER" --conf=$CONF
7+
8+
if [[ -z "$HOSTNAME" ]]; then
9+
HOSTNAME=`hostname`
10+
fi
11+
if [[ -z "$NODE" ]]; then
12+
NODE=`hostname`
13+
fi
14+
15+
16+
17+
./api.py --username=$USERNAME --password=$PASSWORD --check=list_shovels --filter="$FILTER" --hostname=$HOSTNAME --node="$NODE" --conf=$CONF --loglevel=${LOGLEVEL} --logfile=${LOGFILE}

scripts/rabbitmq/rabbitmq-status.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@ fi
2424
# This assumes that the server is going to then use zabbix_sender to feed the data BACK to the server. Right now, I'm doing that
2525
# in the python script
2626

27-
./api.py --hostname=$HOSTNAME --username=$USERNAME --password=$PASSWORD --check=$TYPE_OF_CHECK --metric=$METRIC --node="$NODE" --filters="$FILTER" --conf=$CONF
27+
./api.py --hostname=$HOSTNAME --username=$USERNAME --password=$PASSWORD --check=$TYPE_OF_CHECK --metric=$METRIC --node="$NODE" --filters="$FILTER" --conf=$CONF --loglevel=${LOGLEVEL} --logfile=${LOGFILE}

0 commit comments

Comments
 (0)