ca32997f0e
Apply two ceilometer patches:
1. fix the issue that some *.rate meters are always zero;
- https://review.openstack.org/#/c/367743/
2. add supporting on two meters network.incoming.bytes and
network.outgoing.bytes:
- https://review.openstack.org/#/c/367714/
These two meters depends a nova fix on bandwidth, so also
apply this nova fix.
- https://review.openstack.org/#/c/365838/
Change-Id: I5f9a5f1a7e0912fc2fe47c17bb36a56947161615
(cherry picked from commit 2db7b079e9
)
151 lines
6.6 KiB
Diff
151 lines
6.6 KiB
Diff
diff --git a/ceilometer/compute/virt/xenapi/inspector.py b/ceilometer/compute/virt/xenapi/inspector.py
|
|
index 9632cba..18ed5d7 100644
|
|
--- a/ceilometer/compute/virt/xenapi/inspector.py
|
|
+++ b/ceilometer/compute/virt/xenapi/inspector.py
|
|
@@ -160,18 +160,19 @@ class XenapiInspector(virt_inspector.Inspector):
|
|
if vif_refs:
|
|
for vif_ref in vif_refs:
|
|
vif_rec = self._call_xenapi("VIF.get_record", vif_ref)
|
|
- vif_metrics_ref = self._call_xenapi(
|
|
- "VIF.get_metrics", vif_ref)
|
|
- vif_metrics_rec = self._call_xenapi(
|
|
- "VIF_metrics.get_record", vif_metrics_ref)
|
|
+
|
|
+ rx_rate = float(self._call_xenapi(
|
|
+ "VM.query_data_source", vm_ref,
|
|
+ "vif_%s_rx" % vif_rec['device']))
|
|
+ tx_rate = float(self._call_xenapi(
|
|
+ "VM.query_data_source", vm_ref,
|
|
+ "vif_%s_tx" % vif_rec['device']))
|
|
|
|
interface = virt_inspector.Interface(
|
|
name=vif_rec['uuid'],
|
|
mac=vif_rec['MAC'],
|
|
fref=None,
|
|
parameters=None)
|
|
- rx_rate = float(vif_metrics_rec['io_read_kbs']) * units.Ki
|
|
- tx_rate = float(vif_metrics_rec['io_write_kbs']) * units.Ki
|
|
stats = virt_inspector.InterfaceRateStats(rx_rate, tx_rate)
|
|
yield (interface, stats)
|
|
|
|
@@ -182,16 +183,14 @@ class XenapiInspector(virt_inspector.Inspector):
|
|
if vbd_refs:
|
|
for vbd_ref in vbd_refs:
|
|
vbd_rec = self._call_xenapi("VBD.get_record", vbd_ref)
|
|
- vbd_metrics_ref = self._call_xenapi("VBD.get_metrics",
|
|
- vbd_ref)
|
|
- vbd_metrics_rec = self._call_xenapi("VBD_metrics.get_record",
|
|
- vbd_metrics_ref)
|
|
|
|
disk = virt_inspector.Disk(device=vbd_rec['device'])
|
|
- # Stats provided from XenServer are in KB/s,
|
|
- # converting it to B/s.
|
|
- read_rate = float(vbd_metrics_rec['io_read_kbs']) * units.Ki
|
|
- write_rate = float(vbd_metrics_rec['io_write_kbs']) * units.Ki
|
|
+ read_rate = float(self._call_xenapi(
|
|
+ "VM.query_data_source", vm_ref,
|
|
+ "vbd_%s_read" % vbd_rec['device']))
|
|
+ write_rate = float(self._call_xenapi(
|
|
+ "VM.query_data_source", vm_ref,
|
|
+ "vbd_%s_write" % vbd_rec['device']))
|
|
disk_rate_info = virt_inspector.DiskRateStats(
|
|
read_bytes_rate=read_rate,
|
|
read_requests_rate=0,
|
|
diff --git a/ceilometer/tests/unit/compute/virt/xenapi/test_inspector.py b/ceilometer/tests/unit/compute/virt/xenapi/test_inspector.py
|
|
index caa1c93..7e8f827 100644
|
|
--- a/ceilometer/tests/unit/compute/virt/xenapi/test_inspector.py
|
|
+++ b/ceilometer/tests/unit/compute/virt/xenapi/test_inspector.py
|
|
@@ -142,75 +142,42 @@ class TestXenapiInspection(base.BaseTestCase):
|
|
fake_instance = {'OS-EXT-SRV-ATTR:instance_name': 'fake_instance_name',
|
|
'id': 'fake_instance_id'}
|
|
|
|
- def fake_xenapi_request(method, args):
|
|
- vif_rec = {
|
|
- 'metrics': 'vif_metrics_ref',
|
|
- 'uuid': 'vif_uuid',
|
|
- 'MAC': 'vif_mac',
|
|
- }
|
|
-
|
|
- vif_metrics_rec = {
|
|
- 'io_read_kbs': '1',
|
|
- 'io_write_kbs': '2',
|
|
- }
|
|
- if method == 'VM.get_by_name_label':
|
|
- return ['vm_ref']
|
|
- elif method == 'VM.get_VIFs':
|
|
- return ['vif_ref']
|
|
- elif method == 'VIF.get_record':
|
|
- return vif_rec
|
|
- elif method == 'VIF.get_metrics':
|
|
- return 'vif_metrics_ref'
|
|
- elif method == 'VIF_metrics.get_record':
|
|
- return vif_metrics_rec
|
|
- else:
|
|
- return None
|
|
+ vif_rec = {
|
|
+ 'metrics': 'vif_metrics_ref',
|
|
+ 'uuid': 'vif_uuid',
|
|
+ 'MAC': 'vif_mac',
|
|
+ 'device': '0',
|
|
+ }
|
|
+ side_effects = [['vm_ref'], ['vif_ref'], vif_rec, 1024.0, 2048.0]
|
|
|
|
session = self.inspector.session
|
|
with mock.patch.object(session, 'xenapi_request',
|
|
- side_effect=fake_xenapi_request):
|
|
+ side_effect=side_effects):
|
|
interfaces = list(self.inspector.inspect_vnic_rates(fake_instance))
|
|
|
|
self.assertEqual(1, len(interfaces))
|
|
vnic0, info0 = interfaces[0]
|
|
self.assertEqual('vif_uuid', vnic0.name)
|
|
self.assertEqual('vif_mac', vnic0.mac)
|
|
- self.assertEqual(1024, info0.rx_bytes_rate)
|
|
- self.assertEqual(2048, info0.tx_bytes_rate)
|
|
+ self.assertEqual(1024.0, info0.rx_bytes_rate)
|
|
+ self.assertEqual(2048.0, info0.tx_bytes_rate)
|
|
|
|
def test_inspect_disk_rates(self):
|
|
fake_instance = {'OS-EXT-SRV-ATTR:instance_name': 'fake_instance_name',
|
|
'id': 'fake_instance_id'}
|
|
|
|
- def fake_xenapi_request(method, args):
|
|
- vbd_rec = {
|
|
- 'device': 'xvdd'
|
|
- }
|
|
-
|
|
- vbd_metrics_rec = {
|
|
- 'io_read_kbs': '1',
|
|
- 'io_write_kbs': '2'
|
|
- }
|
|
- if method == 'VM.get_by_name_label':
|
|
- return ['vm_ref']
|
|
- elif method == 'VM.get_VBDs':
|
|
- return ['vbd_ref']
|
|
- elif method == 'VBD.get_record':
|
|
- return vbd_rec
|
|
- elif method == 'VBD.get_metrics':
|
|
- return 'vbd_metrics_ref'
|
|
- elif method == 'VBD_metrics.get_record':
|
|
- return vbd_metrics_rec
|
|
- else:
|
|
- return None
|
|
+ vbd_rec = {
|
|
+ 'device': 'xvdd'
|
|
+ }
|
|
+ side_effects = [['vm_ref'], ['vbd_ref'], vbd_rec, 1024.0, 2048.0]
|
|
|
|
session = self.inspector.session
|
|
with mock.patch.object(session, 'xenapi_request',
|
|
- side_effect=fake_xenapi_request):
|
|
+ side_effect=side_effects):
|
|
disks = list(self.inspector.inspect_disk_rates(fake_instance))
|
|
|
|
self.assertEqual(1, len(disks))
|
|
disk0, info0 = disks[0]
|
|
self.assertEqual('xvdd', disk0.device)
|
|
- self.assertEqual(1024, info0.read_bytes_rate)
|
|
- self.assertEqual(2048, info0.write_bytes_rate)
|
|
+ self.assertEqual(1024.0, info0.read_bytes_rate)
|
|
+ self.assertEqual(2048.0, info0.write_bytes_rate)
|