summaryrefslogtreecommitdiff
path: root/ceilometer/compute/pollsters/disk.py
diff options
context:
space:
mode:
Diffstat (limited to 'ceilometer/compute/pollsters/disk.py')
-rw-r--r--ceilometer/compute/pollsters/disk.py271
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