Repository
Munin (contrib)
Last change
2020-11-26
Graph Categories
Family
auto
Capabilities
Keywords
Language
Python (3.x)
Authors

keystone_stats

Name

keystone_stats - monitor status of Keystone

Configuration

Needs following minimal configuration in plugin-conf.d/keystone:

[keystone_*]
user keystone

Authors

Copyright 2012 - Mehdi Abaakouk sileht@sileht.net

Magic Markers

#%# capabilities=autoconf
#%# family=auto
#!/usr/bin/env python3

"""
=head1 NAME


keystone_stats - monitor status of Keystone

=head1 CONFIGURATION


Needs following minimal configuration in plugin-conf.d/keystone:

  [keystone_*]
  user keystone

=head1 AUTHORS

Copyright 2012 - Mehdi Abaakouk <sileht@sileht.net>


=head1 MAGIC MARKERS

 #%# capabilities=autoconf
 #%# family=auto

=cut
"""

import sys
import traceback

try:
    from keystone.common import utils
    from keystone import config
    from keystone import exception
    from keystone import identity
except ImportError:
    successful_import = False
else:
    successful_import = True


stats = ['users', 'tenants']


def print_config():
    print('graph_title Keystone Stats')
    print('graph_vlabel count')
    print('graph_args --base 1000 --lower-limit 0')
    print('graph_category auth')
    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].items():
            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 successful_import:
                print('no (failed import keystone module)')
                sys.exit(0)
            try:
                load_conf()
                identity.Manager()
            except Exception:
                print('no (failed to connect keystone backend: %s' % traceback.format_exc())
                sys.exit(0)
            print('yes')
    elif successful_import:
        load_conf()
        print_values()