From 4a18b06213a2116aac364f8afd89930d6b67a1b1 Mon Sep 17 00:00:00 2001 From: Mehdi Abaakouk Date: Thu, 3 May 2012 15:27:00 +0200 Subject: [PATCH] New plugins to graph some metrics of openstack glance --- plugins/glance/glance_size_ | 109 +++++++++++++++++++++++++++++++++++ plugins/glance/glance_status | 103 +++++++++++++++++++++++++++++++++ 2 files changed, 212 insertions(+) create mode 100755 plugins/glance/glance_size_ create mode 100755 plugins/glance/glance_status diff --git a/plugins/glance/glance_size_ b/plugins/glance/glance_size_ new file mode 100755 index 00000000..b2dce0b6 --- /dev/null +++ b/plugins/glance/glance_size_ @@ -0,0 +1,109 @@ +#!/usr/bin/env python +# +# Plugin to monitor used size of a tenant in glance +# +# To monitor the used size of a tenant in glance do: +# E.g. +# ln -s /usr/share/munin/plugins/glance_size_ /etc/munin/plugins/glance_size_ +# +# Needs following minimal configuration in plugin-conf.d/glance: +# [glance_*] +# user glance +# +# Magic markers +#%# capabilities=autoconf suggest +#%# family=auto + + +import sys +import os + +try: + from sqlalchemy.orm import exc, joinedload + + from glance.common.cfg import CommonConfigOpts + from glance.registry.db import models + from glance.registry.db.api import get_session, configure_db +except ImportError: + succesful_import = False +else: + succesful_import = True + + +def load_conf(): + CONF = CommonConfigOpts(project="glance", prog="glance-registry") + CONF() + + # Hide missing logger warning message + sys.stderr = open(os.devnull, 'w') + configure_db(CONF) + sys.stderr = sys.__stderr__ + + +def print_config(tenant): + print 'graph_title Glance used size for tenant %s' % tenant + print 'graph_vlabel Bytes' + print 'graph_args --base 1024 --lower-limit 0' + print 'graph_category glance' + print 'graph_info This graph shows the used size in glance for tenant %s' % tenant + print '%s.label %s' % (tenant, tenant) + print '%s.draw LINE2' % tenant + print '%s.info %s MBytes' % (tenant, tenant) + +def request(**kwargs): + + session = get_session() + try: + query = session.query(models.Image).\ + options(joinedload(models.Image.properties)).\ + options(joinedload(models.Image.members)) + if kwargs: + query = query.filter_by(**kwargs) + + images = query.all() + + except exc.NoResultFound: + return [] + return images + +def print_suggest(): + print "Global" + print "\n".join(set( image["owner"] for image in request(deleted=False) )) + +def print_values(tenant): + + if tenant != "Global" : + images = request(deleted=False, owner=tenant) + else: + images = request(deleted=False) + + total_size = sum([ image["size"] for image in images ]) + print '%s.value %s' % (tenant, total_size) + + +if __name__ == '__main__': + argv = sys.argv[:] + tenant = argv[0].split('glance_size_').pop() or 'Global' + + if len(argv) > 1: + if argv[1] == 'config': + print_config(tenant) + elif argv[1] == 'suggest' and succesful_import: + load_conf() + print_suggest() + elif argv[1] == 'autoconf': + if not succesful_import: + print 'no (failed import glance and/or sqlachemy module)' + sys.exit(0) + try: + load_conf() + get_session() + except: + print 'no (failed to connect glance backend, check user)' + sys.exit(0) + print 'yes' + + elif succesful_import: + load_conf() + print_values(tenant) + diff --git a/plugins/glance/glance_status b/plugins/glance/glance_status new file mode 100755 index 00000000..e94a8d2e --- /dev/null +++ b/plugins/glance/glance_status @@ -0,0 +1,103 @@ +#!/usr/bin/env python +# +# Plugin to monitor used size of a tenant in glance +# +# To monitor the used size of a tenant in glance do: +# E.g. +# ln -s /usr/share/munin/plugins/glance_size_ /etc/munin/plugins/glance_size_ +# +# Needs following minimal configuration in plugin-conf.d/glance: +# [glance_*] +# user glance +# +# Magic markers +#%# capabilities=autoconf +#%# family=auto + + +import sys +import os + +try: + from sqlalchemy.orm import exc, joinedload + + from glance.common.cfg import CommonConfigOpts + from glance.registry.db import models + from glance.registry.db.api import get_session, configure_db +except ImportError: + succesful_import = False +else: + succesful_import = True + +def load_conf(): + CONF = CommonConfigOpts(project="glance", prog="glance-registry") + CONF() + + # Hide missing logger warning message + sys.stderr = open(os.devnull, 'w') + configure_db(CONF) + sys.stderr = sys.__stderr__ + +possible_status = [ 'queued', 'saving', 'active', 'killed', 'deleted', 'pending_delete' ] + +def print_config(): + print 'graph_title Glance images status' + print 'graph_vlabel images' + print 'graph_args --lower-limit 0' + print 'graph_category glance' + print 'graph_scale no' + print 'graph_info This graph show number of images by status' + + for status in possible_status: + print '%s.label %s' % (status, status) + print '%s.draw LINE2' % status + print '%s.info %s image(s)' % (status, status) + +def request(**kwargs): + + session = get_session() + try: + query = session.query(models.Image).\ + options(joinedload(models.Image.properties)).\ + options(joinedload(models.Image.members)) + if kwargs: + query = query.filter_by(**kwargs) + + images = query.all() + + except exc.NoResultFound: + return [] + return images + +def print_values(): + images = request() + + n_image_by_status = {} + for image in images: + n_image_by_status[image["status"]] = n_image_by_status.get(image["status"], 0) + 1 + + for status in possible_status: + print '%s.value %s' % (status, n_image_by_status.get(status, 0)) + +if __name__ == '__main__': + argv = sys.argv[:] + + if len(argv) > 1: + if argv[1] == 'config': + print_config() + elif argv[1] == 'autoconf': + if not succesful_import: + print 'no (failed import glance and/or sqlachemy module)' + sys.exit(0) + try: + load_conf() + get_session() + except: + print 'no (failed to connect glance backend, check user)' + sys.exit(0) + print 'yes' + + elif succesful_import: + load_conf() + print_values() +