#!/usr/bin/env python # # Plugin to monitor status of Keystone # # Needs following minimal configuration in plugin-conf.d/keystone: # [keystone_*] # user keystone # # Magic markers #%# capabilities=autoconf #%# family=auto import sys import traceback try: from keystone.common import utils from keystone import config from keystone import exception from keystone import identity except ImportError: succesful_import = False else: succesful_import = True stats = ['users', 'tenants'] def print_config(): global states print 'graph_title Keystone Stats' print 'graph_vlabel count' print 'graph_args --base 1000 --lower-limit 0' print 'graph_category keystone' print 'graph_scale no' print 'graph_info This graph shows stats about keystone: ' + (', ').join(stats) for field in stats: print '%s_enabled.label enabled %s' % (field, field) print '%s_enabled.draw LINE2' % field print '%s_enabled.info %s enabled' % (field, field) print '%s_total.label total %s' % (field, field) print '%s_total.draw LINE2' % field print '%s_total.info %s total' % (field, field) def get_status(): enabled = {} total = {} for k in stats: enabled[k] = 0 total[k] = 0 identity_api = identity.Manager() for user in identity_api.list_users(None): total['users'] += 1 if user['enabled']: enabled['users'] += 1 # Ldap and pam driver don't support get_all_tenants() # kvs and sql implement get_tenants() instead of get_all_tenants() # Whoo: None of backend implements the correct function tenants = [] for api_func in [ 'get_all_tenants', 'get_tenants']: try: tenants = getattr(identity_api, api_func)(None) except exception.NotImplemented, NotImplementedError: pass for tenant in tenants: total['tenants'] += 1 if tenant['enabled']: enabled['tenants'] += 1 return {'enabled': enabled, 'total': total} def print_values(): stats = get_status() for state in stats.keys(): for (field, value) in stats[state].iteritems(): print "%s_%s.value %s" % (field, state, value) def load_conf(): config.CONF(config_files=[utils.find_config('keystone.conf')]) if __name__ == '__main__': if len(sys.argv) > 1: if sys.argv[1] == "config": print_config() elif sys.argv[1] == "autoconf": if not succesful_import: print 'no (failed import keystone module)' sys.exit(0) try: load_conf() identity.Manager() except: print 'no (failed to connect keystone backend: %s'%traceback.format_exc() sys.exit(0) print 'yes' elif succesful_import: load_conf() print_values()