1
0
Fork 0
mirror of https://github.com/munin-monitoring/contrib.git synced 2025-07-22 14:16:00 +00:00

Merge pull request #104 from sileht/master

Update of openstack plugins
This commit is contained in:
Kenyon Ralph 2012-05-03 11:05:46 -07:00
commit b3e31051f5
8 changed files with 356 additions and 56 deletions

109
plugins/glance/glance_size_ Executable file
View file

@ -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_<tenant_uuid>
#
# 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)

103
plugins/glance/glance_status Executable file
View file

@ -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_<tenant_uuid>
#
# 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()

View file

@ -8,14 +8,21 @@
# #
# Magic markers # Magic markers
#%# capabilities=autoconf #%# capabilities=autoconf
#%# family=keystone #%# family=auto
import sys import sys
import traceback
try:
from keystone.common import utils from keystone.common import utils
from keystone import config from keystone import config
from keystone import exception from keystone import exception
from keystone import identity from keystone import identity
except ImportError:
succesful_import = False
else:
succesful_import = True
CONF = config.CONF CONF = config.CONF
@ -78,14 +85,26 @@ def print_values():
for (field, value) in stats[state].iteritems(): for (field, value) in stats[state].iteritems():
print "%s_%s.value %s" % (field, state, value) print "%s_%s.value %s" % (field, state, value)
def load_conf():
CONF(config_files=[utils.find_config('keystone.conf')])
if __name__ == '__main__': if __name__ == '__main__':
if len(sys.argv) > 1: if len(sys.argv) > 1:
if sys.argv[1] == "config": if sys.argv[1] == "config":
print_config() print_config()
elif sys.argv[1] == "autoconf": elif sys.argv[1] == "autoconf":
print "yes" if not succesful_import:
else: print 'no (failed import keystone module)'
CONF(config_files=[utils.find_config('keystone.conf')]) 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() print_values()

View file

@ -12,21 +12,28 @@
# #
# Magic markers # Magic markers
#%# capabilities=autoconf #%# capabilities=autoconf
#%# family=nova #%# family=auto
import sys
try:
from nova import context from nova import context
from nova import db from nova import db
from nova import flags from nova import flags
from nova import utils from nova import utils
import sys except ImportError:
succesful_import = False
else:
succesful_import = True
states = ['total', 'allocated', 'associated'] states = ['total', 'allocated', 'associated']
def print_config(): def print_config():
global states global states
print 'graph_title Nova Floating IPs' print 'graph_title Nova Floating IPs'
print 'graph_vlabel %' print 'graph_vlabel IPs'
print 'graph_args --base 1000 --lower-limit 0' print 'graph_args --base 1000 --lower-limit 0'
print 'graph_category nova' print 'graph_category nova'
print 'graph_scale no' print 'graph_scale no'
@ -65,8 +72,12 @@ if __name__ == '__main__':
if sys.argv[1] == "config": if sys.argv[1] == "config":
print_config() print_config()
elif sys.argv[1] == "autoconf": elif sys.argv[1] == "autoconf":
print "yes" if not succesful_import:
print 'no (failed import nova module)'
sys.exit(0)
else: else:
print 'yes'
elif succesful_import:
utils.default_flagfile() utils.default_flagfile()
flags.FLAGS(sys.argv) flags.FLAGS(sys.argv)
print_values() print_values()

View file

@ -11,14 +11,21 @@
# user nova # user nova
# #
# Magic markers # Magic markers
#%# capabilities=autoconf #%# capabilities=autoconf suggest
#%# family=nova #%# family=auto
import sys
try:
from nova import context from nova import context
from nova import db from nova import db
from nova import flags from nova import flags
from nova import utils from nova import utils
import sys from nova.compute import power_state
except ImportError:
succesful_import = False
else:
succesful_import = True
class InstanceState(object): class InstanceState(object):
@ -33,12 +40,9 @@ class InstanceState(object):
instances = db.instance_get_all(ctxt) instances = db.instance_get_all(ctxt)
cls.instance_counts = {} cls.instance_counts = {}
instance_types = {} instance_types = {}
for it in db.instance_type_get_all(ctxt, True).values(): for it in db.instance_type_get_all(ctxt, True):
instance_types[it['id']] = it['name'] instance_types[it['id']] = it['name']
if metric == 'state':
metric = 'state_description'
for instance in instances: for instance in instances:
i = dict(instance) i = dict(instance)
i['instance_type'] = i['type'] = instance_types.get( i['instance_type'] = i['type'] = instance_types.get(
@ -58,17 +62,24 @@ class InstanceState(object):
InstanceState.init(metric) InstanceState.init(metric)
return cls.instance_counts return cls.instance_counts
def get_name(metric, code):
if metric == "power_state":
return power_state.name(code)
elif metric in ["root_gb", "ephemeral_gb"]:
return "%d_gb", code
else:
return code
def print_config(metric): def print_config(metric):
states = InstanceState.get_states(metric) states = InstanceState.get_states(metric)
print 'graph_title Nova Instance States' print 'graph_title Nova Instance %s' % metric
print 'graph_vlabel instances' print 'graph_vlabel instances'
print 'graph_args --base 1000 --lower-limit 0' print 'graph_args --base 1000 --lower-limit 0'
print 'graph_category nova' print 'graph_category nova'
print 'graph_scale no' print 'graph_scale no'
print 'graph_info This graph shows the number of instances by state' print 'graph_info This graph shows the number of instances by %s' % metric
for state in states: for state in states:
print '%s.label %s' % (state, state) print '%s.label %s' % (state, get_name(state))
print '%s.draw LINE2' % state print '%s.draw LINE2' % state
print '%s.info %s IPs' % (state, state) print '%s.info %s IPs' % (state, state)
@ -78,17 +89,35 @@ def print_values(metric):
for (state, value) in status.iteritems(): for (state, value) in status.iteritems():
print '%s.value %s' % (state, value) print '%s.value %s' % (state, value)
def print_suggest():
suggest = [ "vm_state",
"vcpus",
"task_state",
"root_gb",
"ephemeral_gb",
"power_state",
"memory_mb",
"instance_type_id",
]
print "\n".join(suggest)
if __name__ == '__main__': if __name__ == '__main__':
argv = sys.argv[:] argv = sys.argv[:]
utils.default_flagfile() utils.default_flagfile()
flags.FLAGS(sys.argv) flags.FLAGS(sys.argv)
metric = argv[0].split('nova_instance_').pop() or 'state' metric = argv[0].split('nova_instance_').pop() or 'vm_state'
if len(argv) > 1: if len(argv) > 1:
if argv[1] == 'config': if argv[1] == 'config':
print_config(metric) print_config(metric)
elif argv[1] == 'suggest':
print_suggest()
elif argv[1] == 'autoconf': elif argv[1] == 'autoconf':
print 'yes' if not succesful_import:
print 'no (failed import nova module)'
sys.exit(0)
else: else:
print 'yes'
elif succesful_import:
print_values(metric) print_values(metric)

View file

@ -12,14 +12,20 @@
# #
# Magic markers # Magic markers
#%# capabilities=autoconf #%# capabilities=autoconf
#%# family=nova #%# family=auto
import sys
try:
from nova import context from nova import context
from nova import db from nova import db
from nova import flags from nova import flags
from nova import utils from nova import utils
from nova.db.sqlalchemy.session import get_session from nova.db.sqlalchemy.session import get_session
import sys except ImportError:
succesful_import = False
else:
succesful_import = True
def print_config(): def print_config():
global states global states
@ -46,8 +52,12 @@ if __name__ == '__main__':
if sys.argv[1] == "config": if sys.argv[1] == "config":
print_config() print_config()
elif sys.argv[1]=="autoconf" : elif sys.argv[1]=="autoconf" :
print "yes" if not succesful_import:
print 'no (failed import nova module)'
sys.exit(0)
else: else:
print 'yes'
elif succesful_import:
utils.default_flagfile() utils.default_flagfile()
flags.FLAGS(sys.argv) flags.FLAGS(sys.argv)
print_values() print_values()

View file

@ -12,14 +12,20 @@
# #
# Magic markers # Magic markers
#%# capabilities=autoconf #%# capabilities=autoconf
#%# family=nova #%# family=auto
import sys
try:
from nova import context from nova import context
from nova import db from nova import db
from nova import flags from nova import flags
from nova import utils from nova import utils
from nova.db.sqlalchemy.session import get_session from nova.db.sqlalchemy.session import get_session
import sys except ImportError:
succesful_import = False
else:
succesful_import = True
def print_config(): def print_config():
@ -58,8 +64,12 @@ if __name__ == '__main__':
if sys.argv[1] == "config": if sys.argv[1] == "config":
print_config() print_config()
elif sys.argv[1] == "autoconf": elif sys.argv[1] == "autoconf":
print "yes" if not succesful_import:
print 'no (failed import nova module)'
sys.exit(0)
else: else:
print 'yes'
elif succesful_import:
utils.default_flagfile() utils.default_flagfile()
flags.FLAGS(sys.argv) flags.FLAGS(sys.argv)
print_values() print_values()

View file

@ -8,13 +8,19 @@
# #
# Magic markers # Magic markers
#%# capabilities=autoconf #%# capabilities=autoconf
#%# family=nova #%# family=auto
import sys
try:
from nova import context from nova import context
from nova import db from nova import db
from nova import flags from nova import flags
from nova import utils from nova import utils
import sys except ImportError:
succesful_import = False
else:
succesful_import = True
services = ['nova-compute', 'nova-volume', 'nova-scheduler', 'nova-vncproxy', 'nova-network', 'nova-cert', 'nova-console', 'nova-consoleauth'] services = ['nova-compute', 'nova-volume', 'nova-scheduler', 'nova-vncproxy', 'nova-network', 'nova-cert', 'nova-console', 'nova-consoleauth']
@ -70,8 +76,11 @@ if __name__ == '__main__':
if sys.argv[1] == "config": if sys.argv[1] == "config":
print_config() print_config()
elif sys.argv[1] == "autoconf": elif sys.argv[1] == "autoconf":
print "yes" if not succesful_import:
print 'no (failed import nova module]'
else: else:
print 'yes'
elif succesful_import:
utils.default_flagfile() utils.default_flagfile()
flags.FLAGS(sys.argv) flags.FLAGS(sys.argv)
print_values() print_values()