from osm_mon.collector.vnf_collectors.base import BaseCollector
from osm_mon.collector.vnf_metric import VnfMetric
from osm_mon.core.common_db import CommonDbClient
+from osm_mon.core.config import Config
from osm_mon.core.exceptions import VcaDeploymentInfoNotFound
-from osm_mon.core.settings import Config
log = logging.getLogger(__name__)
class VCACollector(BaseCollector):
- def __init__(self):
- cfg = Config.instance()
- self.common_db = CommonDbClient()
+ def __init__(self, config: Config):
+ super().__init__(config)
+ self.common_db = CommonDbClient(config)
self.loop = asyncio.get_event_loop()
- self.n2vc = N2VC(server=cfg.OSMMON_VCA_HOST, user=cfg.OSMMON_VCA_USER, secret=cfg.OSMMON_VCA_SECRET)
+ self.n2vc = N2VC(server=config.get('vca', 'host'),
+ user=config.get('vca', 'user'),
+ secret=config.get('vca', 'secret'),
+ ca_cert=config.get('vca', 'cacert'))
def collect(self, vnfr: dict) -> List[Metric]:
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']
+ if vnfr['_admin']['projects_read']:
+ tags['project_id'] = vnfr['_admin']['projects_read'][0]
+ else:
+ tags['project_id'] = ''
+
metrics = []
for vdur in vnfr['vdur']:
# This avoids errors when vdur records have not been completely filled
)
if 'vdu-configuration' in vdu and 'metrics' in vdu['vdu-configuration']:
try:
- vca_deployment_info = self.get_vca_deployment_info(nsr_id, vnf_member_index, vdur['name'])
- except VcaDeploymentInfoNotFound:
+ vca_deployment_info = self.get_vca_deployment_info(nsr_id, vnf_member_index, vdur['vdu-id-ref'],
+ vdur['count-index'])
+ except VcaDeploymentInfoNotFound as e:
+ log.warning(repr(e))
continue
measures = self.loop.run_until_complete(self.n2vc.GetMetrics(vca_deployment_info['model'],
vca_deployment_info['application']))
for measure in measure_list:
log.debug("Measure: %s", measure)
metric = VnfMetric(nsr_id, vnf_member_index, vdur['name'], measure['key'],
- float(measure['value']))
+ float(measure['value']), tags)
metrics.append(metric)
if 'vnf-configuration' in vnfd and 'metrics' in vnfd['vnf-configuration']:
try:
- vca_deployment_info = self.get_vca_deployment_info(nsr_id, vnf_member_index, None)
- except VcaDeploymentInfoNotFound:
+ vca_deployment_info = self.get_vca_deployment_info(nsr_id, vnf_member_index)
+ except VcaDeploymentInfoNotFound as e:
+ log.warning(repr(e))
return metrics
measures = self.loop.run_until_complete(self.n2vc.GetMetrics(vca_deployment_info['model'],
vca_deployment_info['application']))
+ # Search for Mgmt VDU name, needed to query Prometheus based on alarm tags
+ # TODO: check a better way to look for Mgmt VDU
+ for vdur in vnfr['vdur']:
+ for interface in vdur['interfaces']:
+ if 'mgmt-vnf' in interface:
+ vdu_name = vdur['name']
+ break
log.debug('Measures: %s', measures)
for measure_list in measures.values():
for measure in measure_list:
log.debug("Measure: %s", measure)
- metric = VnfMetric(nsr_id, vnf_member_index, '', measure['key'], float(measure['value']))
+ metric = VnfMetric(nsr_id, vnf_member_index, vdu_name,
+ measure['key'], float(measure['value']), tags)
metrics.append(metric)
return metrics
- def get_vca_deployment_info(self, nsr_id, vnf_member_index, vdur_name):
+ def get_vca_deployment_info(self, nsr_id, vnf_member_index, vdu_id=None, vdu_count=0):
nsr = self.common_db.get_nsr(nsr_id)
for vca_deployment in nsr["_admin"]["deployed"]["VCA"]:
if vca_deployment:
- if vca_deployment['member-vnf-index'] == vnf_member_index and vca_deployment['vdu_name'] == vdur_name:
- return vca_deployment
- raise VcaDeploymentInfoNotFound("VCA deployment info for nsr_id {}, index {} and vdur_name {} not found."
- .format(nsr_id, vnf_member_index, vdur_name))
+ if vdu_id is None:
+ if vca_deployment['member-vnf-index'] == vnf_member_index and vca_deployment['vdu_id'] is None:
+ return vca_deployment
+ else:
+ if vca_deployment['member-vnf-index'] == vnf_member_index and \
+ vca_deployment['vdu_id'] == vdu_id and vca_deployment['vdu_count_index'] == vdu_count:
+ return vca_deployment
+ raise VcaDeploymentInfoNotFound(
+ "VCA deployment info for nsr_id {}, index {}, vdu_id {} and vdu_count_index {} not found.".format(
+ nsr_id,
+ vnf_member_index,
+ vdu_id,
+ vdu_count))