nsr_id = vnfr['nsr-id-ref']
vnf_member_index = vnfr['member-vnf-index-ref']
vnfd = self.common_db.get_vnfd(vnfr['vnfd-id'])
-
# Populate extra tags for metrics
tags = {}
tags['ns_name'] = self.common_db.get_nsr(nsr_id)['name']
tags['project_id'] = ''
metrics = []
+
for vdur in vnfr['vdur']:
# This avoids errors when vdur records have not been completely filled
if 'name' not in vdur:
vdu = next(
filter(lambda vdu: vdu['id'] == vdur['vdu-id-ref'], vnfd['vdu'])
)
- if 'monitoring-param' in vdu:
- for param in vdu['monitoring-param']:
- metric_name = param['nfvi-metric']
- interface_name = param['interface-name-ref'] if 'interface-name-ref' in param else None
+ if 'monitoring-parameter' in vdu:
+ for param in vdu['monitoring-parameter']:
+ metric_name = param['performance-metric']
openstack_metric_name = METRIC_MAPPINGS[metric_name]
- metric_type = self._get_metric_type(metric_name, interface_name)
+ metric_type = self._get_metric_type(metric_name)
try:
resource_id = self._get_resource_uuid(nsr_id, vnf_member_index, vdur['name'])
except ValueError:
vdur['name'], vnf_member_index, nsr_id)
continue
try:
- log.info("Collecting metric type: %s and metric_name: %s and resource_id %s and "
- "interface_name: %s", metric_type, metric_name, resource_id, interface_name)
- value = self.backend.collect_metric(metric_type, openstack_metric_name, resource_id,
- interface_name)
+ log.info(
+ "Collecting metric type: %s and metric_name: %s and resource_id %s and ",
+ metric_type,
+ metric_name,
+ resource_id)
+ value = self.backend.collect_metric(metric_type, openstack_metric_name, resource_id)
if value is not None:
log.info("value: %s", value)
- if interface_name:
- tags['interface'] = interface_name
metric = VnfMetric(nsr_id, vnf_member_index, vdur['name'], metric_name, value, tags)
metrics.append(metric)
else:
log.info("Using ceilometer backend to collect metric")
return ceilometer
- def _get_metric_type(self, metric_name: str, interface_name: str) -> MetricType:
+ def _get_metric_type(self, metric_name: str) -> MetricType:
if metric_name not in INTERFACE_METRICS:
return MetricType.INSTANCE
else:
- if interface_name:
- return MetricType.INTERFACE_ONE
return MetricType.INTERFACE_ALL
class OpenstackBackend:
- def collect_metric(self, metric_type: MetricType, metric_name: str, resource_id: str, interface_name: str):
+ def collect_metric(self, metric_type: MetricType, metric_name: str, resource_id: str):
pass
sess = OpenstackUtils.get_session(vim_account)
return neutron_client.Client(session=sess)
- def collect_metric(self, metric_type: MetricType, metric_name: str, resource_id: str, interface_name: str):
- if metric_type == MetricType.INTERFACE_ONE:
- return self._collect_interface_one_metric(metric_name, resource_id, interface_name)
-
+ def collect_metric(self, metric_type: MetricType, metric_name: str, resource_id: str):
if metric_type == MetricType.INTERFACE_ALL:
return self._collect_interface_all_metric(metric_name, resource_id)
else:
raise Exception('Unknown metric type %s' % metric_type.value)
- def _collect_interface_one_metric(self, metric_name, resource_id, interface_name):
- ports = self.neutron.list_ports(name=interface_name, device_id=resource_id)
- if not ports or not ports['ports']:
- raise Exception(
- 'Port not found for interface %s on instance %s' % (interface_name, resource_id))
- port = ports['ports'][0]
- port_uuid = port['id'][:11]
- tap_name = 'tap' + port_uuid
- interfaces = self.client.resource.search(resource_type='instance_network_interface',
- query={'=': {'name': tap_name}})
- measures = self.client.metric.get_measures(metric_name,
- resource_id=interfaces[0]['id'],
- limit=1)
- return measures[-1][2] if measures else None
-
def _collect_interface_all_metric(self, openstack_metric_name, resource_id):
total_measure = None
interfaces = self.client.resource.search(resource_type='instance_network_interface',
sess = OpenstackUtils.get_session(vim_account)
return ceilometer_client.Client("2", session=sess)
- def collect_metric(self, metric_type: MetricType, metric_name: str, resource_id: str, interface_name: str):
+ def collect_metric(self, metric_type: MetricType, metric_name: str, resource_id: str):
if metric_type != MetricType.INSTANCE:
raise NotImplementedError('Ceilometer backend only support instance metrics')
measures = self.client.samples.list(meter_name=metric_name, limit=1, q=[