check_apaches.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #!/usr/bin/python
  2. from monitoringplugin import MonitoringPlugin
  3. import re
  4. import urllib2
  5. plugin = MonitoringPlugin(pluginname='check_apaches', tagforstatusline='APACHE', description='Check Apache workers', version='0.1')
  6. plugin.add_cmdlineoption('-H', '', 'host', 'Hostname/IP to check', default='localhost')
  7. plugin.add_cmdlineoption('-p', '', 'port', 'port to connect', default=None)
  8. plugin.add_cmdlineoption('-P', '', 'proto', 'protocol to use', default='http')
  9. plugin.add_cmdlineoption('-u', '', 'url', 'path to "server-status"', default='/server-status')
  10. plugin.add_cmdlineoption('-a', '', 'httpauth', 'HTTP Username and Password, separated by ":"')
  11. plugin.add_cmdlineoption('-w', '', 'warn', 'warning thresold', default='20')
  12. plugin.add_cmdlineoption('-c', '', 'crit', 'warning thresold', default='50')
  13. plugin.add_cmdlineoption('', '--statistics', 'statistics', 'Output worker statistics', action='store_true')
  14. plugin.parse_cmdlineoptions()
  15. if plugin.options.proto not in ['http', 'https']:
  16. plugin.back2nagios(3, 'Unknown protocol "' + plugin.options.proto + '"')
  17. if not plugin.options.port:
  18. if plugin.options.proto == 'https':
  19. plugin.options.port = '443'
  20. else:
  21. plugin.options.port = '80'
  22. url = plugin.options.proto + '://' + plugin.options.host + ':' + plugin.options.port + '/' + plugin.options.url + '?auto'
  23. plugin.verbose(1, 'Status URL: ' + url)
  24. if plugin.options.httpauth:
  25. httpauth = plugin.options.httpauth.split(':')
  26. if len(httpauth) != 2:
  27. plugin.back2nagios(3, 'Wrong format of authentication data! Need "USERNAME:PASSWORD", got "' + plugin.options.httpauth + '"')
  28. passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
  29. passman.add_password(None, url, httpauth[0], httpauth[1])
  30. authhandler = urllib2.HTTPBasicAuthHandler(passman)
  31. opener = urllib2.build_opener(authhandler)
  32. urllib2.install_opener(opener)
  33. try:
  34. data = urllib2.urlopen(url).read()
  35. except urllib2.HTTPError, e:
  36. plugin.back2nagios(2, 'Could not read data! ' + str(e))
  37. except urllib2.URLError, e:
  38. plugin.back2nagios(2, 'Could not connect to server!')
  39. plugin.verbose(2, 'Got data:\n' + data)
  40. try:
  41. idle = int(re.search('Idle(?:Workers|Servers): (\d+)\n', data).group(1))
  42. busy = int(re.search('Busy(?:Workers|Servers): (\d+)\n', data).group(1))
  43. except:
  44. plugin.back2nagios(2, 'Could not analyze data!')
  45. states = None
  46. if plugin.options.statistics:
  47. scoreboard = re.search('Scoreboard: (.*)\n', data)
  48. if scoreboard:
  49. states = {'_':0, 'S':0, 'R':0, 'W':0, 'K':0, 'D':0, 'C':0, 'L':0, 'G':0, 'I':0, '.':0,}
  50. for worker in scoreboard.group(1):
  51. states[worker] += 1
  52. plugin.add_multilineoutput(str(states['_']) + ' waiting for connection')
  53. plugin.add_multilineoutput(str(states['S']) + ' starting up')
  54. plugin.add_multilineoutput(str(states['R']) + ' reading request')
  55. plugin.add_multilineoutput(str(states['W']) + ' writing/sending reply')
  56. plugin.add_multilineoutput(str(states['K']) + ' keepalive')
  57. plugin.add_multilineoutput(str(states['D']) + ' looking up in DNS')
  58. plugin.add_multilineoutput(str(states['C']) + ' closing connection')
  59. plugin.add_multilineoutput(str(states['L']) + ' logging')
  60. plugin.add_multilineoutput(str(states['G']) + ' gracefully finishing')
  61. plugin.add_multilineoutput(str(states['I']) + ' idle cleanup of worker')
  62. plugin.add_multilineoutput(str(states['.']) + ' open slots(up to ServerLimit)')
  63. returncode = plugin.value_wc_to_returncode(busy, plugin.options.warn, plugin.options.crit)
  64. plugin.add_output(str(busy) + ' busy workers, ' + str(idle) + ' idle')
  65. plugin.add_returncode(returncode)
  66. plugin.format_add_performancedata('busy', busy, '', warn=plugin.options.warn, crit=plugin.options.crit, min=0.0)
  67. plugin.format_add_performancedata('idle', idle, '')
  68. plugin.exit()