2
0
mirror of https://github.com/munin-monitoring/contrib.git synced 2018-11-08 00:59:34 +01:00
contrib-munin/plugins/nova/nova_instance_
2012-05-02 10:49:49 +02:00

95 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python
#
# Plugin to monitor status of Floating IPs in Nova
#
# To monitor instance states, link instance_states to this file.
# E.g.
# ln -s /usr/share/munin/plugins/nova_instance_states /etc/munin/plugins/
#
# Needs following minimal configuration in plugin-conf.d/nova:
# [nova_*]
# user nova
#
# Magic markers
#%# capabilities=autoconf
#%# family=nova
from nova import context
from nova import db
from nova import flags
from nova import utils
import sys
class InstanceState(object):
instance_counts = None
states = None
@classmethod
def init(cls, metric):
if cls.states and cls.instance_counts:
return
ctxt = context.get_admin_context()
instances = db.instance_get_all(ctxt)
cls.instance_counts = {}
instance_types = {}
for it in db.instance_type_get_all(ctxt, True).values():
instance_types[it['id']] = it['name']
if metric == 'state':
metric = 'state_description'
for instance in instances:
i = dict(instance)
i['instance_type'] = i['type'] = instance_types.get(
instance.instance_type_id,
'(unknown')
val = cls.instance_counts.get(i[metric], 0)
cls.instance_counts[i[metric]] = val + 1
cls.states = cls.instance_counts.keys()
@classmethod
def get_states(cls, metric):
InstanceState.init(metric)
return cls.states
@classmethod
def get_instance_counts(cls, metric):
InstanceState.init(metric)
return cls.instance_counts
def print_config(metric):
states = InstanceState.get_states(metric)
print 'graph_title Nova Instance States'
print 'graph_vlabel instances'
print 'graph_args --base 1000 --lower-limit 0'
print 'graph_category nova'
print 'graph_scale no'
print 'graph_info This graph shows the number of instances by state'
for state in states:
print '%s.label %s' % (state, state)
print '%s.draw LINE2' % state
print '%s.info %s IPs' % (state, state)
def print_values(metric):
status = InstanceState.get_instance_counts(metric)
for (state, value) in status.iteritems():
print '%s.value %s' % (state, value)
if __name__ == '__main__':
argv = sys.argv[:]
utils.default_flagfile()
flags.FLAGS(sys.argv)
metric = argv[0].split('nova_instance_').pop() or 'state'
if len(argv) > 1:
if argv[1] == 'config':
print_config(metric)
elif argv[1] == 'autoconf':
print 'yes'
else:
print_values(metric)