[Pkg-nagios-changes] [pkg-nagios-plugins-contrib] 14/32: update check_mongodb to 7ef53f0
Jan Wagner
waja at moszumanska.debian.org
Fri Nov 18 17:23:02 UTC 2016
This is an automated email from the git hooks/post-receive script.
waja pushed a commit to branch master
in repository pkg-nagios-plugins-contrib.
commit 18317d0321995024103aa01bb284764ca349593e
Author: Evgeni Golov <evgeni at golov.de>
Date: Sat Sep 24 14:22:49 2016 +0200
update check_mongodb to 7ef53f0
---
check_mongodb/README.md | 4 ++
check_mongodb/check_mongodb.py | 121 ++++++++++++++++++++++++++++-------------
check_mongodb/control | 2 +-
3 files changed, 88 insertions(+), 39 deletions(-)
diff --git a/check_mongodb/README.md b/check_mongodb/README.md
index 5af1e7f..cb81b8d 100644
--- a/check_mongodb/README.md
+++ b/check_mongodb/README.md
@@ -21,6 +21,10 @@ In your Nagios plugins directory run
<pre><code>git clone git://github.com/mzupan/nagios-plugin-mongodb.git</code></pre>
+Then use pip to ensure you have all pre-requisites.
+
+<pre><code>pip install requirements</code></pre>
+
## Usage
### Install in Nagios
diff --git a/check_mongodb/check_mongodb.py b/check_mongodb/check_mongodb.py
index 55615b8..9cfa83f 100644
--- a/check_mongodb/check_mongodb.py
+++ b/check_mongodb/check_mongodb.py
@@ -18,6 +18,7 @@
# - @Andor on github
# - Steven Richards - Captainkrtek on github
# - Max Vernimmen - @mvernimmen-CG / @mvernimmen on github
+# - Kris Childress - @kris at nivenly.com github.com/kris-nova
#
# USAGE
#
@@ -78,7 +79,7 @@ def performance_data(perf_data, params):
def numeric_type(param):
- if ((type(param) == float or type(param) == int or param == None)):
+ if ((type(param) == float or type(param) == int or type(param) == long or param == None)):
return True
return False
@@ -133,7 +134,7 @@ def main(argv):
p.add_option('-A', '--action', action='store', type='choice', dest='action', default='connect', help='The action you want to take',
choices=['connect', 'connections', 'replication_lag', 'replication_lag_percent', 'replset_state', 'memory', 'memory_mapped', 'lock',
'flushing', 'last_flush_time', 'index_miss_ratio', 'databases', 'collections', 'database_size', 'database_indexes', 'collection_indexes', 'collection_size',
- 'collection_storageSize', 'queues', 'oplog', 'journal_commits_in_wl', 'write_data_files', 'journaled', 'opcounters', 'current_lock', 'replica_primary',
+ 'collection_storageSize', 'queues', 'oplog', 'journal_commits_in_wl', 'write_data_files', 'journaled', 'opcounters', 'current_lock', 'replica_primary',
'page_faults', 'asserts', 'queries_per_second', 'page_faults', 'chunks_balance', 'connect_primary', 'collection_state', 'row_count', 'replset_quorum'])
p.add_option('--max-lag', action='store_true', dest='max_lag', default=False, help='Get max replication lag (for replication_lag action only)')
p.add_option('--mapped-memory', action='store_true', dest='mapped_memory', default=False, help='Get mapped memory instead of resident (if resident memory can not be read)')
@@ -147,12 +148,15 @@ def main(argv):
p.add_option('-T', '--time', action='store', type='int', dest='sample_time', default=1, help='Time used to sample number of pages faults')
p.add_option('-M', '--mongoversion', action='store', type='choice', dest='mongo_version', default='2', help='The MongoDB version you are talking with, either 2 or 3',
choices=['2','3'])
+ p.add_option('-a', '--authdb', action='store', type='string', dest='authdb', default='admin', help='The database you want to authenticate against')
options, arguments = p.parse_args()
host = options.host
port = options.port
user = options.user
passwd = options.passwd
+ authdb = options.authdb
+
query_type = options.query_type
collection = options.collection
sample_time = options.sample_time
@@ -180,7 +184,13 @@ def main(argv):
# moving the login up here and passing in the connection
#
start = time.time()
- err, con = mongo_connect(host, port, ssl, user, passwd, replicaset)
+ err, con = mongo_connect(host, port, ssl, user, passwd, replicaset, authdb)
+
+ if err != 0:
+ return err
+
+ # Autodetect mongo-version and force pymongo to let us know if it can connect or not.
+ err, mongo_version = check_version(con)
if err != 0:
return err
@@ -260,25 +270,41 @@ def main(argv):
return check_connect(host, port, warning, critical, perf_data, user, passwd, conn_time)
-def mongo_connect(host=None, port=None, ssl=False, user=None, passwd=None, replica=None):
+def mongo_connect(host=None, port=None, ssl=False, user=None, passwd=None, replica=None, authdb="admin"):
+ from pymongo.errors import ConnectionFailure
+ from pymongo.errors import PyMongoError
+
try:
# ssl connection for pymongo > 2.3
if pymongo.version >= "2.3":
if replica is None:
con = pymongo.MongoClient(host, port)
else:
- con = pymongo.Connection(host, port, read_preference=pymongo.ReadPreference.SECONDARY, ssl=ssl, replicaSet=replica, network_timeout=10)
+ con = pymongo.MongoClient(host, port, read_preference=pymongo.ReadPreference.SECONDARY, ssl=ssl, replicaSet=replica)
else:
if replica is None:
- con = pymongo.Connection(host, port, slave_okay=True, network_timeout=10)
+ con = pymongo.MongoClient(host, port, slave_okay=True)
else:
- con = pymongo.Connection(host, port, slave_okay=True, network_timeout=10)
+ con = pymongo.MongoClient(host, port, slave_okay=True)
#con = pymongo.Connection(host, port, slave_okay=True, replicaSet=replica, network_timeout=10)
+ try:
+ result = con.admin.command("ismaster")
+ except ConnectionFailure:
+ print("CRITICAL - Connection to Mongo server on %s:%s has failed" % (host, port) )
+ sys.exit(2)
+
+ if 'arbiterOnly' in result and result['arbiterOnly'] == True:
+ print "OK - State: 7 (Arbiter on port %s)" % (port)
+ sys.exit(0)
+
if user and passwd:
- db = con["admin"]
- if not db.authenticate(user, passwd):
+ db = con[authdb]
+ try:
+ db.authenticate(user, password=passwd)
+ except PyMongoError:
sys.exit("Username/Password incorrect")
+
except Exception, e:
if isinstance(e, pymongo.errors.AutoReconnect) and str(e).find(" is an arbiter") != -1:
# We got a pymongo AutoReconnect exception that tells us we connected to an Arbiter Server
@@ -306,9 +332,17 @@ def exit_with_general_critical(e):
def set_read_preference(db):
- if pymongo.version >= "2.1":
+ if pymongo.version >= "2.2":
+ pymongo.read_preferences.Secondary
+ else:
db.read_preference = pymongo.ReadPreference.SECONDARY
+def check_version(con):
+ try:
+ server_info = con.server_info()
+ except Exception, e:
+ return exit_with_general_critical(e), None
+ return 0, int(server_info['version'].split('.')[0].strip())
def check_connect(host, port, warning, critical, perf_data, user, passwd, conn_time):
warning = warning or 3
@@ -344,7 +378,7 @@ def check_rep_lag(con, host, port, warning, critical, percent, perf_data, max_la
if "127.0.0.1" == host:
if not "me" in con.admin.command("ismaster","1").keys():
print "OK - This is not replicated MongoDB"
- sys.exit(3)
+ sys.exit(3)
host = con.admin.command("ismaster","1")["me"].split(':')[0]
@@ -357,7 +391,7 @@ def check_rep_lag(con, host, port, warning, critical, percent, perf_data, max_la
rs_status = {}
slaveDelays = {}
try:
- set_read_preference(con.admin)
+ #set_read_preference(con.admin)
# Get replica set status
try:
@@ -518,7 +552,7 @@ def check_memory(con, warning, critical, perf_data, mapped_memory, host):
# memory used by Mongodb is ok or not.
meminfo = open('/proc/meminfo').read()
matched = re.search(r'^MemTotal:\s+(\d+)', meminfo)
- if matched:
+ if matched:
mem_total_kB = int(matched.groups()[0])
if host != "127.0.0.1" and not warning:
@@ -624,7 +658,7 @@ def check_memory_mapped(con, warning, critical, perf_data):
def check_lock(con, warning, critical, perf_data, mongo_version):
warning = warning or 10
critical = critical or 30
- if mongo_version == "2":
+ if mongo_version == 2:
try:
data = get_server_status(con)
lockTime = data['globalLock']['lockTime']
@@ -643,8 +677,8 @@ def check_lock(con, warning, critical, perf_data, mongo_version):
print "Couldn't get globalLock lockTime info from mongo, are you sure you're not using version 3? See the -M option."
return exit_with_general_critical(e)
else:
- print "FAIL - Mongo3 doesn't report on global locks"
- return 1
+ print "OK - MongoDB version 3 doesn't report on global locks"
+ return 0
def check_flushing(con, warning, critical, avg, perf_data):
@@ -656,17 +690,22 @@ def check_flushing(con, warning, critical, avg, perf_data):
critical = critical or 15000
try:
data = get_server_status(con)
- if avg:
- flush_time = float(data['backgroundFlushing']['average_ms'])
- stat_type = "Average"
- else:
- flush_time = float(data['backgroundFlushing']['last_ms'])
- stat_type = "Last"
+ try:
+ data['backgroundFlushing']
+ if avg:
+ flush_time = float(data['backgroundFlushing']['average_ms'])
+ stat_type = "Average"
+ else:
+ flush_time = float(data['backgroundFlushing']['last_ms'])
+ stat_type = "Last"
- message = "%s Flush Time: %.2fms" % (stat_type, flush_time)
- message += performance_data(perf_data, [("%.2fms" % flush_time, "%s_flush_time" % stat_type.lower(), warning, critical)])
+ message = "%s Flush Time: %.2fms" % (stat_type, flush_time)
+ message += performance_data(perf_data, [("%.2fms" % flush_time, "%s_flush_time" % stat_type.lower(), warning, critical)])
- return check_levels(flush_time, warning, critical, message)
+ return check_levels(flush_time, warning, critical, message)
+ except Exception:
+ print "OK - flushing stats not available for this storage engine"
+ return 0
except Exception, e:
return exit_with_general_critical(e)
@@ -679,6 +718,7 @@ def index_miss_ratio(con, warning, critical, perf_data):
data = get_server_status(con)
try:
+ data['indexCounters']
serverVersion = tuple(con.server_info()['version'].split('.'))
if serverVersion >= tuple("2.4.0".split(".")):
miss_ratio = float(data['indexCounters']['missRatio'])
@@ -686,12 +726,17 @@ def index_miss_ratio(con, warning, critical, perf_data):
miss_ratio = float(data['indexCounters']['btree']['missRatio'])
except KeyError:
not_supported_msg = "not supported on this platform"
- if data['indexCounters'].has_key('note'):
+ try:
+ data['indexCounters']
+ if data['indexCounters'].has_key('note'):
+ print "OK - MongoDB says: " + not_supported_msg
+ return 0
+ else:
+ print "WARNING - Can't get counter from MongoDB"
+ return 1
+ except Exception:
print "OK - MongoDB says: " + not_supported_msg
return 0
- else:
- print "WARNING - Can't get counter from MongoDB"
- return 1
message = "Miss Ratio: %.2f" % miss_ratio
message += performance_data(perf_data, [("%.2f" % miss_ratio, "index_miss_ratio", warning, critical)])
@@ -1007,7 +1052,7 @@ def check_queries_per_second(con, query_type, warning, critical, perf_data, mong
query_per_sec = float(diff_query) / float(diff_ts)
# update the count now
- if mongo_version == "2":
+ if mongo_version == 2:
db.nagios_check.update({u'_id': last_count['_id']}, {'$set': {"data.%s" % query_type: {'count': num, 'ts': int(time.time())}}})
else:
db.nagios_check.update_one({u'_id': last_count['_id']}, {'$set': {"data.%s" % query_type: {'count': num, 'ts': int(time.time())}}})
@@ -1019,7 +1064,7 @@ def check_queries_per_second(con, query_type, warning, critical, perf_data, mong
# since it is the first run insert it
query_per_sec = 0
message = "First run of check.. no data"
- if mongo_version == "2":
+ if mongo_version == 2:
db.nagios_check.update({u'_id': last_count['_id']}, {'$set': {"data.%s" % query_type: {'count': num, 'ts': int(time.time())}}})
else:
db.nagios_check.update_one({u'_id': last_count['_id']}, {'$set': {"data.%s" % query_type: {'count': num, 'ts': int(time.time())}}})
@@ -1029,9 +1074,9 @@ def check_queries_per_second(con, query_type, warning, critical, perf_data, mong
# since it is the first run insert it
query_per_sec = 0
message = "First run of check.. no data"
- if mongo_version == "2":
+ if mongo_version == 2:
db.nagios_check.insert({'check': 'query_counts', 'data': {query_type: {'count': num, 'ts': int(time.time())}}})
- else:
+ else:
db.nagios_check.insert_one({'check': 'query_counts', 'data': {query_type: {'count': num, 'ts': int(time.time())}}})
return check_levels(query_per_sec, warning, critical, message)
@@ -1168,7 +1213,7 @@ def check_opcounters(con, host, warning, critical, perf_data):
message = "Test succeeded , old values missing"
message = "Opcounters: total=%d,insert=%d,query=%d,update=%d,delete=%d,getmore=%d,command=%d" % tuple(per_minute_delta)
message += performance_data(perf_data, ([(per_minute_delta[0], "total", warning, critical), (per_minute_delta[1], "insert"),
- (per_minute_delta[2], "query"), (per_minute_delta[3], "update"), (per_minute_delta[5], "delete"),
+ (per_minute_delta[2], "query"), (per_minute_delta[3], "update"), (per_minute_delta[4], "delete"),
(per_minute_delta[5], "getmore"), (per_minute_delta[6], "command")]))
return check_levels(per_minute_delta[0], warning, critical, message)
else:
@@ -1288,10 +1333,10 @@ def check_replica_primary(con, host, warning, critical, perf_data, replicaset, m
saved_primary = "None"
if current_primary != saved_primary:
last_primary_server_record = {"server": current_primary}
- if mongo_version == "2":
- db.last_primary_server.update({"_id": "last_primary"}, {"$set": last_primary_server_record}, upsert=True, safe=True)
- else:
- db.last_primary_server.update_one({"_id": "last_primary"}, {"$set": last_primary_server_record}, upsert=True, safe=True)
+ if mongo_version == 2:
+ db.last_primary_server.update({"_id": "last_primary"}, {"$set": last_primary_server_record}, upsert=True)
+ else:
+ db.last_primary_server.update_one({"_id": "last_primary"}, {"$set": last_primary_server_record}, upsert=True)
message = "Primary server has changed from %s to %s" % (saved_primary, current_primary)
primary_status = 1
return check_levels(primary_status, warning, critical, message)
diff --git a/check_mongodb/control b/check_mongodb/control
index 0eae4b9..d477ae6 100644
--- a/check_mongodb/control
+++ b/check_mongodb/control
@@ -1,6 +1,6 @@
Uploaders: Jan Wagner <waja at cyconet.org>
Recommends: python-pymongo
-Version: abf2daad31
+Version: 7ef53f0
Homepage: https://github.com/mzupan/nagios-plugin-mongodb
Watch: https://github.com/mzupan/nagios-plugin-mongodb <a class="commit-tease-sha"[^>]*>\s+([0-9a-f]+)\s+</a>
Description: Plugin script to monitor your MongoDB server(s)
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-nagios/pkg-nagios-plugins-contrib.git
More information about the Pkg-nagios-changes
mailing list