ESzabbix.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #!/usr/bin/env python
  2. # Created by Aaron Mildenstein on 19 SEP 2012
  3. # Switchted from pyes to Elasticsearch for better Health Monitoring by Marcel Alburg on 17 JUN 2014
  4. from elasticsearch import Elasticsearch
  5. import sys
  6. import json
  7. # Define the fail message
  8. def zbx_fail():
  9. print "ZBX_NOTSUPPORTED"
  10. sys.exit(2)
  11. searchkeys = ['query_total', 'fetch_time_in_millis', 'fetch_total', 'fetch_time', 'query_current', 'fetch_current', 'query_time_in_millis']
  12. getkeys = ['missing_total', 'exists_total', 'current', 'time_in_millis', 'missing_time_in_millis', 'exists_time_in_millis', 'total']
  13. docskeys = ['count', 'deleted']
  14. indexingkeys = ['delete_time_in_millis', 'index_total', 'index_current', 'delete_total', 'index_time_in_millis', 'delete_current']
  15. storekeys = ['size_in_bytes', 'throttle_time_in_millis']
  16. cachekeys = ['filter_size_in_bytes', 'field_size_in_bytes', 'field_evictions']
  17. clusterkeys = searchkeys + getkeys + docskeys + indexingkeys + storekeys
  18. returnval = None
  19. # __main__
  20. # We need to have two command-line args:
  21. # sys.argv[1]: The node name or "cluster"
  22. # sys.argv[2]: The "key" (status, filter_size_in_bytes, etc)
  23. if len(sys.argv) < 3:
  24. zbx_fail()
  25. # Try to establish a connection to elasticsearch
  26. try:
  27. conn = Elasticsearch('localhost:9200', sniff_on_start=False)
  28. except Exception, e:
  29. zbx_fail()
  30. if sys.argv[1] == 'cluster':
  31. if sys.argv[2] in clusterkeys:
  32. nodestats = conn.cluster.stats()
  33. subtotal = 0
  34. for nodename in nodestats['nodes']:
  35. try:
  36. if sys.argv[2] in indexingkeys:
  37. indexstats = nodestats['nodes'][nodename]['indices']['indexing']
  38. elif sys.argv[2] in storekeys:
  39. indexstats = nodestats['nodes'][nodename]['indices']['store']
  40. elif sys.argv[2] in getkeys:
  41. indexstats = nodestats['nodes'][nodename]['indices']['get']
  42. elif sys.argv[2] in docskeys:
  43. indexstats = nodestats['nodes'][nodename]['indices']['docs']
  44. elif sys.argv[2] in searchkeys:
  45. indexstats = nodestats['nodes'][nodename]['indices']['search']
  46. except Exception, e:
  47. pass
  48. try:
  49. if sys.argv[2] in indexstats:
  50. subtotal += indexstats[sys.argv[2]]
  51. except Exception, e:
  52. pass
  53. returnval = subtotal
  54. else:
  55. # Try to pull the managers object data
  56. try:
  57. escluster = conn.cluster
  58. except Exception, e:
  59. if sys.argv[2] == 'status':
  60. returnval = "red"
  61. else:
  62. zbx_fail()
  63. # Try to get a value to match the key provided
  64. try:
  65. returnval = escluster.health()[sys.argv[2]]
  66. except Exception, e:
  67. if sys.argv[2] == 'status':
  68. returnval = "red"
  69. else:
  70. zbx_fail()
  71. # If the key is "status" then we need to map that to an integer
  72. if sys.argv[2] == 'status':
  73. if returnval == 'green':
  74. returnval = 0
  75. elif returnval == 'yellow':
  76. returnval = 1
  77. elif returnval == 'red':
  78. returnval = 2
  79. else:
  80. zbx_fail()
  81. # Mod to check if ES service is up
  82. elif sys.argv[1] == 'service':
  83. if sys.argv[2] == 'status':
  84. try:
  85. conn.cluster.stats()
  86. returnval = 1
  87. except Exception, e:
  88. returnval = 0
  89. else: # Not clusterwide, check the next arg
  90. nodestats = conn.nodes.stats()
  91. for nodename in nodestats['nodes']:
  92. if sys.argv[1] in nodestats['nodes'][nodename]['name']:
  93. if sys.argv[2] in indexingkeys:
  94. stats = nodestats['nodes'][nodename]['indices']['indexing']
  95. elif sys.argv[2] in storekeys:
  96. stats = nodestats['nodes'][nodename]['indices']['store']
  97. elif sys.argv[2] in getkeys:
  98. stats = nodestats['nodes'][nodename]['indices']['get']
  99. elif sys.argv[2] in docskeys:
  100. stats = nodestats['nodes'][nodename]['indices']['docs']
  101. elif sys.argv[2] in searchkeys:
  102. stats = nodestats['nodes'][nodename]['indices']['search']
  103. try:
  104. returnval = stats[sys.argv[2]]
  105. except Exception, e:
  106. pass
  107. # If we somehow did not get a value here, that's a problem. Send back the standard
  108. # ZBX_NOTSUPPORTED
  109. if returnval is None:
  110. zbx_fail()
  111. else:
  112. print returnval
  113. # End