#!/usr/bin/env python3 # pylint: disable=invalid-name # pylint: enable=invalid-name """Munin plugin to monitor MongoDB status. =head1 NAME mongodb_multi - monitor MongoDB connections, documents, memory and operations =head1 APPLICABLE SYSTEMS Systems with MongoDB installed. Tested up to MongoDB version 4.4. =head1 CONFIGURATION Defaults to mongodb://localhost, but can be configured: [mongodb_multi] env.uri mongodb://user:password@host:port/dbname?parameters =head1 AUTHOR Kim B. Heino This is based heavily on non-multigraph MongoDB plugins. =head1 LICENSE GPLv2 =cut """ import os import sys import pymongo URI = os.environ.get('uri', 'mongodb://localhost') def server_status(): """Get Mongo status.""" conn = pymongo.MongoClient(URI) return conn.admin.command('serverStatus', workingSet=True) def print_data(status): """Plugin values.""" # conn print('multigraph mongo_conn') print('connections.value {}'.format(status['connections']['current'])) # docs print('multigraph mongo_docs') for key, value in status['metrics']['document'].items(): print('{}.value {}'.format(key, value)) # mem print('multigraph mongo_mem') for key, value in status['mem'].items(): if key in ('resident', 'virtual', 'mapped'): print('{}.value {}'.format(key, value * 1024 * 1024)) # ops print('multigraph mongo_ops') for key, value in status['opcounters'].items(): print('{}.value {}'.format(key, value)) def print_config(status): """Plugin config.""" # conn print('multigraph mongo_conn') print('graph_title MongoDB connections') print('graph_args --base 1000 -l 0') print('graph_vlabel Connections') print('graph_category db') print('connections.label connections') # docs print('multigraph mongo_docs') print('graph_title MongoDB documents') print('graph_args --base 1000 -l 0') print('graph_vlabel Documents / ${graph_period}') print('graph_category db') for key in status['metrics']['document']: print('{0}.label {0}'.format(key)) print('{}.type DERIVE'.format(key)) print('{}.min 0'.format(key)) # mem print('multigraph mongo_mem') print('graph_title MongoDB memory usage') print('graph_args --base 1024 -l 0') print('graph_vlabel Bytes') print('graph_category db') for key in status['mem']: if key in ('resident', 'virtual', 'mapped'): print('{0}.label {0}'.format(key)) # ops print('multigraph mongo_ops') print('graph_title MongoDB operations') print('graph_args --base 1000 -l 0') print('graph_vlabel ops / ${graph_period}') print('graph_category db') print('graph_total total') for key in status['opcounters']: print('{0}.label {0}'.format(key)) print('{}.type DERIVE'.format(key)) print('{}.min 0'.format(key)) if os.environ.get('MUNIN_CAP_DIRTYCONFIG') == '1': print_data(status) if __name__ == '__main__': if len(sys.argv) > 1 and sys.argv[1] == 'config': print_config(server_status()) else: print_data(server_status())