diff options
Diffstat (limited to 'ceilometer/compute/pollsters/disk.py')
-rw-r--r-- | ceilometer/compute/pollsters/disk.py | 271 |
1 files changed, 237 insertions, 34 deletions
diff --git a/ceilometer/compute/pollsters/disk.py b/ceilometer/compute/pollsters/disk.py index 9f0210f9..aac0f388 100644 --- a/ceilometer/compute/pollsters/disk.py +++ b/ceilometer/compute/pollsters/disk.py @@ -1,9 +1,11 @@ # # Copyright 2012 eNovance <licensing@enovance.com> # Copyright 2012 Red Hat, Inc +# Copyright 2014 Cisco Systems, Inc # # Author: Julien Danjou <julien@danjou.info> # Author: Eoghan Glynn <eglynn@redhat.com> +# Author: Pradeep Kilambi <pkilambi@cisco.com> # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain @@ -16,7 +18,6 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. - import abc import collections @@ -34,9 +35,16 @@ LOG = log.getLogger(__name__) DiskIOData = collections.namedtuple( 'DiskIOData', - 'r_bytes r_requests w_bytes w_requests', + 'r_bytes r_requests w_bytes w_requests per_disk_requests', ) +DiskRateData = collections.namedtuple('DiskRateData', + ['read_bytes_rate', + 'read_requests_rate', + 'write_bytes_rate', + 'write_requests_rate', + 'per_disk_rate']) + @six.add_metaclass(abc.ABCMeta) class _Base(plugin.ComputePollster): @@ -59,6 +67,10 @@ class _Base(plugin.ComputePollster): r_requests = 0 w_bytes = 0 w_requests = 0 + per_device_read_bytes = {} + per_device_read_requests = {} + per_device_write_bytes = {} + per_device_write_requests = {} for disk, info in inspector.inspect_disks(instance_name): LOG.info(self.DISKIO_USAGE_MESSAGE, instance, disk.device, info.read_requests, @@ -68,17 +80,29 @@ class _Base(plugin.ComputePollster): r_requests += info.read_requests w_bytes += info.write_bytes w_requests += info.write_requests + # per disk data + per_device_read_bytes[disk.device] = info.read_bytes + per_device_read_requests[disk.device] = info.read_requests + per_device_write_bytes[disk.device] = info.write_bytes + per_device_write_requests[disk.device] = info.write_requests + per_device_requests = { + 'read_bytes': per_device_read_bytes, + 'read_requests': per_device_read_requests, + 'write_bytes': per_device_write_bytes, + 'write_requests': per_device_write_requests, + } i_cache[instance_name] = DiskIOData( r_bytes=r_bytes, r_requests=r_requests, w_bytes=w_bytes, w_requests=w_requests, + per_disk_requests=per_device_requests, ) return i_cache[instance_name] @abc.abstractmethod - def _get_sample(instance, c_data): - """Return one Sample.""" + def _get_samples(instance, c_data): + """Return one or more Sample.""" def get_samples(self, manager, cache, resources): for instance in resources: @@ -90,7 +114,8 @@ class _Base(plugin.ComputePollster): instance, instance_name, ) - yield self._get_sample(instance, c_data) + for s in self._get_samples(instance, c_data): + yield s except virt_inspector.InstanceNotFoundException as err: # Instance was deleted while getting samples. Ignore it. LOG.debug(_('Exception while getting samples %s'), err) @@ -108,53 +133,133 @@ class _Base(plugin.ComputePollster): class ReadRequestsPollster(_Base): @staticmethod - def _get_sample(instance, c_data): - return util.make_sample_from_instance( + def _get_samples(instance, c_data): + return [util.make_sample_from_instance( instance, name='disk.read.requests', type=sample.TYPE_CUMULATIVE, unit='request', volume=c_data.r_requests, - ) + additional_metadata={ + 'device': c_data.per_disk_requests['read_requests'].keys()} + )] + + +class PerDeviceReadRequestsPollster(_Base): + + @staticmethod + def _get_samples(instance, c_data): + samples = [] + for disk, value in six.iteritems(c_data.per_disk_requests[ + 'read_requests']): + samples.append(util.make_sample_from_instance( + instance, + name='disk.device.read.requests', + type=sample.TYPE_CUMULATIVE, + unit='request', + volume=value, + resource_id="%s-%s" % (instance.id, disk), + )) + return samples class ReadBytesPollster(_Base): @staticmethod - def _get_sample(instance, c_data): - return util.make_sample_from_instance( + def _get_samples(instance, c_data): + return [util.make_sample_from_instance( instance, name='disk.read.bytes', type=sample.TYPE_CUMULATIVE, unit='B', volume=c_data.r_bytes, - ) + additional_metadata={ + 'device': c_data.per_disk_requests['read_bytes'].keys()}, + )] + + +class PerDeviceReadBytesPollster(_Base): + + @staticmethod + def _get_samples(instance, c_data): + samples = [] + for disk, value in six.iteritems(c_data.per_disk_requests[ + 'read_bytes']): + samples.append(util.make_sample_from_instance( + instance, + name='disk.device.read.bytes', + type=sample.TYPE_CUMULATIVE, + unit='B', + volume=value, + resource_id="%s-%s" % (instance.id, disk), + )) + return samples class WriteRequestsPollster(_Base): @staticmethod - def _get_sample(instance, c_data): - return util.make_sample_from_instance( + def _get_samples(instance, c_data): + return [util.make_sample_from_instance( instance, name='disk.write.requests', type=sample.TYPE_CUMULATIVE, unit='request', volume=c_data.w_requests, - ) + additional_metadata={ + 'device': c_data.per_disk_requests['write_requests'].keys()}, + )] + + +class PerDeviceWriteRequestsPollster(_Base): + + @staticmethod + def _get_samples(instance, c_data): + samples = [] + for disk, value in six.iteritems(c_data.per_disk_requests[ + 'write_requests']): + samples.append(util.make_sample_from_instance( + instance, + name='disk.device.write.requests', + type=sample.TYPE_CUMULATIVE, + unit='request', + volume=value, + resource_id="%s-%s" % (instance.id, disk), + )) + return samples class WriteBytesPollster(_Base): @staticmethod - def _get_sample(instance, c_data): - return util.make_sample_from_instance( + def _get_samples(instance, c_data): + return [util.make_sample_from_instance( instance, name='disk.write.bytes', type=sample.TYPE_CUMULATIVE, unit='B', volume=c_data.w_bytes, - ) + additional_metadata={ + 'device': c_data.per_disk_requests['write_bytes'].keys()}, + )] + + +class PerDeviceWriteBytesPollster(_Base): + + @staticmethod + def _get_samples(instance, c_data): + samples = [] + for disk, value in six.iteritems(c_data.per_disk_requests[ + 'write_bytes']): + samples.append(util.make_sample_from_instance( + instance, + name='disk.device.write.bytes', + type=sample.TYPE_CUMULATIVE, + unit='B', + volume=value, + resource_id="%s-%s" % (instance.id, disk), + )) + return samples @six.add_metaclass(abc.ABCMeta) @@ -169,6 +274,10 @@ class _DiskRatesPollsterBase(plugin.ComputePollster): r_requests_rate = 0 w_bytes_rate = 0 w_requests_rate = 0 + per_disk_r_bytes_rate = {} + per_disk_r_requests_rate = {} + per_disk_w_bytes_rate = {} + per_disk_w_requests_rate = {} disk_rates = inspector.inspect_disk_rates( instance, self._inspection_duration) for disk, info in disk_rates: @@ -176,17 +285,30 @@ class _DiskRatesPollsterBase(plugin.ComputePollster): r_requests_rate += info.read_requests_rate w_bytes_rate += info.write_bytes_rate w_requests_rate += info.write_requests_rate - i_cache[instance.id] = virt_inspector.DiskRateStats( + + per_disk_r_bytes_rate[disk.device] = info.read_bytes_rate + per_disk_r_requests_rate[disk.device] = info.read_requests_rate + per_disk_w_bytes_rate[disk.device] = info.write_bytes_rate + per_disk_w_requests_rate[disk.device] = ( + info.write_requests_rate) + per_disk_rate = { + 'read_bytes_rate': per_disk_r_bytes_rate, + 'read_requests_rate': per_disk_r_requests_rate, + 'write_bytes_rate': per_disk_w_bytes_rate, + 'write_requests_rate': per_disk_w_requests_rate, + } + i_cache[instance.id] = DiskRateData( r_bytes_rate, r_requests_rate, w_bytes_rate, - w_requests_rate + w_requests_rate, + per_disk_rate ) return i_cache[instance.id] @abc.abstractmethod - def _get_sample(self, instance, disk_rates_info): - """Return one Sample.""" + def _get_samples(self, instance, disk_rates_info): + """Return one or more Sample.""" def get_samples(self, manager, cache, resources): self._inspection_duration = self._record_poll_time() @@ -197,7 +319,8 @@ class _DiskRatesPollsterBase(plugin.ComputePollster): cache, instance, ) - yield self._get_sample(instance, disk_rates_info) + for disk_rate in self._get_samples(instance, disk_rates_info): + yield disk_rate except virt_inspector.InstanceNotFoundException as err: # Instance was deleted while getting samples. Ignore it. LOG.debug(_('Exception while getting samples %s'), err) @@ -215,47 +338,127 @@ class _DiskRatesPollsterBase(plugin.ComputePollster): class ReadBytesRatePollster(_DiskRatesPollsterBase): - def _get_sample(self, instance, disk_rates_info): - return util.make_sample_from_instance( + def _get_samples(self, instance, disk_rates_info): + return [util.make_sample_from_instance( instance, name='disk.read.bytes.rate', type=sample.TYPE_GAUGE, unit='B/s', volume=disk_rates_info.read_bytes_rate, - ) + additional_metadata={ + 'device': disk_rates_info.per_disk_rate[ + 'read_bytes_rate'].keys()}, + )] + + +class PerDeviceReadBytesRatePollster(_DiskRatesPollsterBase): + + def _get_samples(self, instance, disk_rates_info): + samples = [] + for disk, value in six.iteritems(disk_rates_info.per_disk_rate[ + 'read_bytes_rate']): + samples.append(util.make_sample_from_instance( + instance, + name='disk.device.read.bytes.rate', + type=sample.TYPE_GAUGE, + unit='B/s', + volume=value, + resource_id="%s-%s" % (instance.id, disk), + )) + return samples class ReadRequestsRatePollster(_DiskRatesPollsterBase): - def _get_sample(self, instance, disk_rates_info): - return util.make_sample_from_instance( + def _get_samples(self, instance, disk_rates_info): + return [util.make_sample_from_instance( instance, name='disk.read.requests.rate', type=sample.TYPE_GAUGE, unit='requests/s', volume=disk_rates_info.read_requests_rate, - ) + additional_metadata={ + 'device': disk_rates_info.per_disk_rate[ + 'read_requests_rate'].keys()}, + )] + + +class PerDeviceReadRequestsRatePollster(_DiskRatesPollsterBase): + + def _get_samples(self, instance, disk_rates_info): + samples = [] + for disk, value in six.iteritems(disk_rates_info.per_disk_rate[ + 'read_requests_rate']): + samples.append(util.make_sample_from_instance( + instance, + name='disk.device.read.requests.rate', + type=sample.TYPE_GAUGE, + unit='requests/s', + volume=value, + resource_id="%s-%s" % (instance.id, disk), + )) + return samples class WriteBytesRatePollster(_DiskRatesPollsterBase): - def _get_sample(self, instance, disk_rates_info): - return util.make_sample_from_instance( + def _get_samples(self, instance, disk_rates_info): + return [util.make_sample_from_instance( instance, name='disk.write.bytes.rate', type=sample.TYPE_GAUGE, unit='B/s', volume=disk_rates_info.write_bytes_rate, - ) + additional_metadata={ + 'device': disk_rates_info.per_disk_rate[ + 'write_bytes_rate'].keys()}, + )] + + +class PerDeviceWriteBytesRatePollster(_DiskRatesPollsterBase): + + def _get_samples(self, instance, disk_rates_info): + samples = [] + for disk, value in six.iteritems(disk_rates_info.per_disk_rate[ + 'write_bytes_rate']): + samples.append(util.make_sample_from_instance( + instance, + name='disk.device.write.bytes.rate', + type=sample.TYPE_GAUGE, + unit='B/s', + volume=value, + resource_id="%s-%s" % (instance.id, disk), + )) + return samples class WriteRequestsRatePollster(_DiskRatesPollsterBase): - def _get_sample(self, instance, disk_rates_info): - return util.make_sample_from_instance( + def _get_samples(self, instance, disk_rates_info): + return [util.make_sample_from_instance( instance, name='disk.write.requests.rate', type=sample.TYPE_GAUGE, unit='requests/s', volume=disk_rates_info.write_requests_rate, - ) + additional_metadata={ + 'device': disk_rates_info.per_disk_rate[ + 'write_requests_rate'].keys()}, + )] + + +class PerDeviceWriteRequestsRatePollster(_DiskRatesPollsterBase): + + def _get_samples(self, instance, disk_rates_info): + samples = [] + for disk, value in six.iteritems(disk_rates_info.per_disk_rate[ + 'write_requests_rate']): + samples.append(util.make_sample_from_instance( + instance, + name='disk.device.write.requests.rate', + type=sample.TYPE_GAUGE, + unit='requests/s', + volume=value, + resource_id="%s-%s" % (instance.id, disk), + )) + return samples |