1212import os
1313import logging
1414
15- logging .basicConfig (filename = '/var/log/zabbix/rabbitmq_zabbix.log' , level = logging .INFO , format = '%(asctime)s %(levelname)s: %(message)s' )
1615
1716class 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 ,
0 commit comments