diff options
author | 1iuwei <1iu.wei81@zte.com.cn> | 2017-08-02 14:11:40 +0800 |
---|---|---|
committer | liuwei <liu.wei81@zte.com.cn> | 2017-08-12 03:02:15 +0000 |
commit | ed67c2bd3a5e1c4034a1f8a59761861f6eb0fc7d (patch) | |
tree | e3a13bd534029483550ab55d2d1f4faec3ea1133 | |
parent | 71a93b7ca785f6c1cd1e40599a154579354e69ad (diff) | |
download | ceilometer-ed67c2bd3a5e1c4034a1f8a59761861f6eb0fc7d.tar.gz |
Add disk total duration of reads/writes metric
Add disk total duration of reads/writes(ms):
disk.device.read.latency
disk.device.write.latency
Change-Id: I0235087af459278b9ad0a66f95c4e4c4ac72e112
-rw-r--r-- | ceilometer/compute/pollsters/disk.py | 14 | ||||
-rw-r--r-- | ceilometer/compute/virt/hyperv/inspector.py | 2 | ||||
-rw-r--r-- | ceilometer/compute/virt/inspector.py | 3 | ||||
-rw-r--r-- | ceilometer/compute/virt/libvirt/inspector.py | 7 | ||||
-rw-r--r-- | ceilometer/tests/unit/agent/test_manager.py | 4 | ||||
-rw-r--r-- | ceilometer/tests/unit/compute/pollsters/test_diskio.py | 26 | ||||
-rw-r--r-- | ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py | 11 | ||||
-rw-r--r-- | setup.cfg | 2 |
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() @@ -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 |