From 1199e0d04b7d9a474ff7c45960bd980ce2f08618 Mon Sep 17 00:00:00 2001 From: Stefan Andersen Date: Tue, 10 Jul 2012 16:49:18 +0200 Subject: [PATCH 1/2] Initial commit of mongo_lag --- plugins/mongodb/mongo_lag | 75 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 plugins/mongodb/mongo_lag diff --git a/plugins/mongodb/mongo_lag b/plugins/mongodb/mongo_lag new file mode 100755 index 00000000..1f883721 --- /dev/null +++ b/plugins/mongodb/mongo_lag @@ -0,0 +1,75 @@ +#!/usr/bin/env python +""" + MongoDB Replication Lag + ~~~~~~~~~~~~~~~~~~~~~~~ + + Connects to a single mongo instance and retrieve + replication lag for all connected members. + + munin-node.conf: + [mongodb_lag] + env.host 127.0.0.1 + env.port 27017 + + :author: Stefan Andersen + :license: The Beer Ware License (Revision 42) + wrote this file. As long + as you retain this notice you can do whatever you want + with this stuff. If we meet some day, and you think + this stuff is worth it, you can buy me a beer in return. +""" +import os +import sys +import pymongo + +def _get_members(): + host = os.environ.get('host', '127.0.0.1') + port = os.environ.get('port', 27017) + conn = pymongo.Connection(host) + repl_status = conn.admin.command("replSetGetStatus") + + members = {} + for member in repl_status['members']: + name = member['name'].split('.')[0] + members[name] = {'state': member['state'], 'optimeDate': member['optimeDate']} + return members + +def run(): + members = _get_members(); + for member in members: + if members[member]['state'] == 1: + primary_optime = members[member]['optimeDate'] + + for member in members: + members[member]['lag'] = (primary_optime - members[member]['optimeDate']).seconds + + print "multigraph mongodb_replication_lag" + for member in members: + print "{}_lag.value {}".format(member, members[member]['lag']) + print + + for member in members: + print "multigraph mongodb_replication_lag.{}".format(member) + print "lag.value {}".format(members[member]['lag']) + print + +def config(): + print """graph_title MongoDB replication lag +graph_args --base 1000 +graph_vlabel Replication lag (seconds) +graph_category MongoDB +""" + + for member in _get_members(): + print "{0}_lag.label {0}".format(member) + print "{}_lag.type GAUGE".format(member) + print "{}_lag.info Replication lag behind master".format(member) + print "{}_lag.min 0".format(member) + print "{}_lag.draw LINE1".format(member) + print + +if __name__ == "__main__": + if len(sys.argv) > 1 and sys.argv[1] == "config": + config() + else: + run() From 6f7f6a096a2f575837c5938faf87b7d75a3c3c35 Mon Sep 17 00:00:00 2001 From: Stefan Andersen Date: Wed, 11 Jul 2012 10:21:33 +0200 Subject: [PATCH 2/2] Simplify graph logic, don't use a multigraph --- plugins/mongodb/mongo_lag | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/plugins/mongodb/mongo_lag b/plugins/mongodb/mongo_lag index 1f883721..534e61d9 100755 --- a/plugins/mongodb/mongo_lag +++ b/plugins/mongodb/mongo_lag @@ -41,17 +41,8 @@ def run(): primary_optime = members[member]['optimeDate'] for member in members: - members[member]['lag'] = (primary_optime - members[member]['optimeDate']).seconds - - print "multigraph mongodb_replication_lag" - for member in members: - print "{}_lag.value {}".format(member, members[member]['lag']) - print - - for member in members: - print "multigraph mongodb_replication_lag.{}".format(member) - print "lag.value {}".format(members[member]['lag']) - print + lag = (primary_optime - members[member]['optimeDate']).seconds + print "{}.value {}".format(member, lag) def config(): print """graph_title MongoDB replication lag @@ -59,14 +50,9 @@ graph_args --base 1000 graph_vlabel Replication lag (seconds) graph_category MongoDB """ - + for member in _get_members(): - print "{0}_lag.label {0}".format(member) - print "{}_lag.type GAUGE".format(member) - print "{}_lag.info Replication lag behind master".format(member) - print "{}_lag.min 0".format(member) - print "{}_lag.draw LINE1".format(member) - print + print "{0}.label {0}".format(member) if __name__ == "__main__": if len(sys.argv) > 1 and sys.argv[1] == "config":