summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ceilometer/compute/pollsters/disk.py14
-rw-r--r--ceilometer/compute/virt/hyperv/inspector.py2
-rw-r--r--ceilometer/compute/virt/inspector.py3
-rw-r--r--ceilometer/compute/virt/libvirt/inspector.py7
-rw-r--r--ceilometer/tests/unit/agent/test_manager.py4
-rw-r--r--ceilometer/tests/unit/compute/pollsters/test_diskio.py26
-rw-r--r--ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py11
-rw-r--r--setup.cfg2
8 files changed, 62 insertions, 7 deletions
diff --git a/ceilometer/compute/pollsters/disk.py b/ceilometer/compute/pollsters/disk.py
index 8a190141..c3074309 100644
--- a/ceilometer/compute/pollsters/disk.py
+++ b/ceilometer/compute/pollsters/disk.py
@@ -237,3 +237,17 @@ class PerDevicePhysicalPollster(PerDeviceDiskPollster):
sample_name = 'disk.device.usage'
sample_unit = 'B'
sample_stats_key = 'physical'
+
+
+class PerDeviceDiskReadLatencyPollster(PerDeviceDiskPollster):
+ sample_name = 'disk.device.read.latency'
+ sample_type = sample.TYPE_CUMULATIVE
+ sample_unit = 'ms'
+ sample_stats_key = 'rd_total_times'
+
+
+class PerDeviceDiskWriteLatencyPollster(PerDeviceDiskPollster):
+ sample_name = 'disk.device.write.latency'
+ sample_type = sample.TYPE_CUMULATIVE
+ sample_unit = 'ms'
+ sample_stats_key = 'wr_total_times'
diff --git a/ceilometer/compute/virt/hyperv/inspector.py b/ceilometer/compute/virt/hyperv/inspector.py
index 8771e8d5..f1819f22 100644
--- a/ceilometer/compute/virt/hyperv/inspector.py
+++ b/ceilometer/compute/virt/hyperv/inspector.py
@@ -132,7 +132,7 @@ class HyperVInspector(virt_inspector.Inspector):
read_bytes=disk_metrics['read_mb'] * units.Mi,
write_requests=0,
write_bytes=disk_metrics['write_mb'] * units.Mi,
- errors=0)
+ errors=0, wr_total_times=0, rd_total_times=0)
def inspect_disk_latency(self, instance, duration):
instance_name = util.instance_name(instance)
diff --git a/ceilometer/compute/virt/inspector.py b/ceilometer/compute/virt/inspector.py
index 7f6f5174..eb705168 100644
--- a/ceilometer/compute/virt/inspector.py
+++ b/ceilometer/compute/virt/inspector.py
@@ -112,7 +112,8 @@ DiskStats = collections.namedtuple('DiskStats',
['device',
'read_bytes', 'read_requests',
'write_bytes', 'write_requests',
- 'errors'])
+ 'errors', 'wr_total_times',
+ 'rd_total_times'])
# Named tuple representing disk rate statistics.
#
diff --git a/ceilometer/compute/virt/libvirt/inspector.py b/ceilometer/compute/virt/libvirt/inspector.py
index 3c2d3023..eaf4d575 100644
--- a/ceilometer/compute/virt/libvirt/inspector.py
+++ b/ceilometer/compute/virt/libvirt/inspector.py
@@ -121,12 +121,17 @@ class LibvirtInspector(virt_inspector.Inspector):
[target.get("dev")
for target in tree.findall('devices/disk/target')]):
block_stats = domain.blockStats(device)
+ block_stats_flags = domain.blockStatsFlags(device, 0)
+ wr_times = block_stats_flags['wr_total_times']*1.0/1000
+ rd_times = block_stats_flags['rd_total_times']*1.0/1000
yield virt_inspector.DiskStats(device=device,
read_requests=block_stats[0],
read_bytes=block_stats[1],
write_requests=block_stats[2],
write_bytes=block_stats[3],
- errors=block_stats[4])
+ errors=block_stats[4],
+ wr_total_times=wr_times,
+ rd_total_times=rd_times)
@libvirt_utils.retry_on_disconnect
def inspect_disk_info(self, instance, duration):
diff --git a/ceilometer/tests/unit/agent/test_manager.py b/ceilometer/tests/unit/agent/test_manager.py
index 7a0fa6a7..ab67dadf 100644
--- a/ceilometer/tests/unit/agent/test_manager.py
+++ b/ceilometer/tests/unit/agent/test_manager.py
@@ -56,8 +56,8 @@ class TestManager(base.BaseTestCase):
def test_load_plugins_pollster_list(self):
mgr = manager.AgentManager(0, self.conf, pollster_list=['disk.*'])
- # currently we do have 26 disk-related pollsters
- self.assertEqual(26, len(list(mgr.extensions)))
+ # currently we do have 28 disk-related pollsters
+ self.assertEqual(28, len(list(mgr.extensions)))
def test_load_invalid_plugins_pollster_list(self):
# if no valid pollsters have been loaded, the ceilometer
diff --git a/ceilometer/tests/unit/compute/pollsters/test_diskio.py b/ceilometer/tests/unit/compute/pollsters/test_diskio.py
index c2e94b4e..6883bf42 100644
--- a/ceilometer/tests/unit/compute/pollsters/test_diskio.py
+++ b/ceilometer/tests/unit/compute/pollsters/test_diskio.py
@@ -99,11 +99,15 @@ class TestDiskPollsters(TestBaseDiskIO):
virt_inspector.DiskStats(device='vda1',
read_bytes=1, read_requests=2,
write_bytes=3, write_requests=4,
- errors=-1),
+ errors=-1,
+ rd_total_times=100,
+ wr_total_times=200,),
virt_inspector.DiskStats(device='vda2',
read_bytes=2, read_requests=3,
write_bytes=5, write_requests=7,
- errors=-1),
+ errors=-1,
+ rd_total_times=300,
+ wr_total_times=400,),
]
def setUp(self):
@@ -162,6 +166,24 @@ class TestDiskPollsters(TestBaseDiskIO):
'disk.device.write.bytes', 5,
'vda2')
+ def test_per_device_read_latency(self):
+ self._check_per_device_samples(
+ disk.PerDeviceDiskReadLatencyPollster,
+ 'disk.device.read.latency', 100, 'vda1')
+
+ self._check_per_device_samples(
+ disk.PerDeviceDiskReadLatencyPollster,
+ 'disk.device.read.latency', 300, 'vda2')
+
+ def test_per_device_write_latency(self):
+ self._check_per_device_samples(
+ disk.PerDeviceDiskWriteLatencyPollster,
+ 'disk.device.write.latency', 200, 'vda1')
+
+ self._check_per_device_samples(
+ disk.PerDeviceDiskWriteLatencyPollster,
+ 'disk.device.write.latency', 400, 'vda2')
+
class TestDiskRatePollsters(TestBaseDiskIO):
diff --git a/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py b/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py
index de8e2b52..f8c12440 100644
--- a/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py
+++ b/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py
@@ -279,10 +279,19 @@ class TestLibvirtInspection(base.BaseTestCase):
</devices>
</domain>
"""
+ blockStatsFlags = {'wr_total_times': 91752302267,
+ 'rd_operations': 6756,
+ 'flush_total_times': 1310427331,
+ 'rd_total_times': 29142253616,
+ 'rd_bytes': 171460096,
+ 'flush_operations': 746,
+ 'wr_operations': 1437,
+ 'wr_bytes': 13574656}
domain = mock.Mock()
domain.XMLDesc.return_value = dom_xml
domain.info.return_value = (0, 0, 0, 2, 999999)
domain.blockStats.return_value = (1, 2, 3, 4, -1)
+ domain.blockStatsFlags.return_value = blockStatsFlags
conn = mock.Mock()
conn.lookupByUUIDString.return_value = domain
@@ -296,6 +305,8 @@ class TestLibvirtInspection(base.BaseTestCase):
self.assertEqual(2, disks[0].read_bytes)
self.assertEqual(3, disks[0].write_requests)
self.assertEqual(4, disks[0].write_bytes)
+ self.assertEqual(91752302.267, disks[0].wr_total_times)
+ self.assertEqual(29142253.616, disks[0].rd_total_times)
def test_inspect_disks_with_domain_shutoff(self):
domain = mock.Mock()
diff --git a/setup.cfg b/setup.cfg
index cdbd4dc0..09fd169b 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -96,6 +96,8 @@ ceilometer.poll.compute =
disk.device.write.requests.rate = ceilometer.compute.pollsters.disk:PerDeviceWriteRequestsRatePollster
disk.device.read.bytes.rate = ceilometer.compute.pollsters.disk:PerDeviceReadBytesRatePollster
disk.device.write.bytes.rate = ceilometer.compute.pollsters.disk:PerDeviceWriteBytesRatePollster
+ disk.device.read.latency = ceilometer.compute.pollsters.disk:PerDeviceDiskReadLatencyPollster
+ disk.device.write.latency = ceilometer.compute.pollsters.disk:PerDeviceDiskWriteLatencyPollster
disk.latency = ceilometer.compute.pollsters.disk:DiskLatencyPollster
disk.device.latency = ceilometer.compute.pollsters.disk:PerDeviceDiskLatencyPollster
disk.iops = ceilometer.compute.pollsters.disk:DiskIOPSPollster