Provide complete set of Glance metrics
Returning retrieved values and provide defaults (0s)
for all combinations of (visibility x status) for
Glance snapshots and images
Change-Id: I08e3e7d219f326a186f16b37773da50d1c9686b7
diff --git a/collectd/files/plugin/openstack_glance.py b/collectd/files/plugin/openstack_glance.py
index efb94be..efd4f72 100644
--- a/collectd/files/plugin/openstack_glance.py
+++ b/collectd/files/plugin/openstack_glance.py
@@ -23,6 +23,10 @@
PLUGIN_NAME = 'openstack_glance'
INTERVAL = openstack.INTERVAL
+image_types = ('snapshots', 'images')
+visibilities = ('public', 'private', 'community', 'shared')
+statuses = ('active', 'queued', 'saving', 'killed', 'deleted',
+ 'deactivated', 'pending_delete')
class GlanceStatsPlugin(openstack.CollectdPlugin):
@@ -38,20 +42,19 @@
self.interval = INTERVAL
self.pagination_limit = 25
- def itermetrics(self):
+ @staticmethod
+ def gen_metric(name, nb, visibility, state):
+ return {
+ 'plugin_instance': name,
+ 'values': nb,
+ 'meta': {
+ 'visibility': visibility,
+ 'state': state,
+ 'discard_hostname': True,
+ }
+ }
- def default_metrics(suffix=''):
- ret = {}
- for name in ('snapshots', 'images'):
- for visibility in ('public', 'private',
- 'community', 'shared'):
- for status in ('active', 'queued', 'saving',
- 'killed', 'deleted', 'deactivated',
- 'pending_delete'):
- key = '%s%s.%s.%s' % (name, suffix,
- visibility, status)
- ret[key] = 0
- return ret
+ def itermetrics(self):
def is_snap(d):
return d.get('image_type') == 'snapshot'
@@ -67,18 +70,19 @@
api_version='v2',
params={},
detail=False)
- status = self.count_objects_group_by(images_details,
- group_by_func=groupby)
- if len(status) == 0:
- status = default_metrics()
- for s, nb in status.iteritems():
- (name, visibility, state) = s.split('.')
- yield {
- 'plugin_instance': name,
- 'values': nb,
- 'meta': {'visibility': visibility, 'state': state,
- 'discard_hostname': True}
- }
+ img_status = self.count_objects_group_by(images_details,
+ group_by_func=groupby)
+ for name in image_types:
+ for visibility in visibilities:
+ for status in statuses:
+ nb = img_status.get('{}.{}.{}'.format(name,
+ visibility,
+ status),
+ 0)
+ yield GlanceStatsPlugin.gen_metric(name,
+ nb,
+ visibility,
+ status)
# sizes
def count_size_bytes(d):
@@ -91,19 +95,21 @@
return 'snapshots_size.%s.%s' % (p, status)
return 'images_size.%s.%s' % (p, status)
- sizes = self.count_objects_group_by(images_details,
- group_by_func=groupby_size,
- count_func=count_size_bytes)
- if len(sizes) == 0:
- sizes = default_metrics('_size')
- for s, nb in sizes.iteritems():
- (name, visibility, state) = s.split('.')
- yield {
- 'plugin_instance': name,
- 'values': nb,
- 'meta': {'visibility': visibility, 'state': state,
- 'discard_hostname': True},
- }
+ img_sizes = self.count_objects_group_by(images_details,
+ group_by_func=groupby_size,
+ count_func=count_size_bytes)
+ for name in image_types:
+ for visibility in visibilities:
+ for status in statuses:
+ nb = img_sizes.get('{}_size.{}.{}'.format(name,
+ visibility,
+ status),
+ 0)
+ yield GlanceStatsPlugin.gen_metric('{}_size'.format(name),
+ nb,
+ visibility,
+ status)
+
plugin = GlanceStatsPlugin(collectd, PLUGIN_NAME, disable_check_metric=True)
@@ -119,6 +125,7 @@
def read_callback():
plugin.conditional_read_callback()
+
if __name__ == '__main__':
import time
collectd.load_configuration(plugin)