X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_mon%2Fplugins%2FOpenStack%2FGnocchi%2Fmetrics.py;h=ea2f2d24fa751ce00aba94870d1b17964974a37c;hb=refs%2Fchanges%2F98%2F6198%2F3;hp=9e69ee7ea50651528166a250b452b340ae3c0dad;hpb=b85fc8cdf840080b10d01c33b4a57a2a39bcc0f1;p=osm%2FMON.git diff --git a/osm_mon/plugins/OpenStack/Gnocchi/metrics.py b/osm_mon/plugins/OpenStack/Gnocchi/metrics.py index 9e69ee7..ea2f2d2 100644 --- a/osm_mon/plugins/OpenStack/Gnocchi/metrics.py +++ b/osm_mon/plugins/OpenStack/Gnocchi/metrics.py @@ -75,7 +75,7 @@ class Metrics(object): # Initializer a producer to send responses back to SO self._producer = KafkaProducer("metric_response") - def metric_calls(self, message): + def metric_calls(self, message, vim_uuid): """Consume info from the message bus to manage metric requests.""" try: values = json.loads(message.value) @@ -83,16 +83,16 @@ class Metrics(object): values = yaml.safe_load(message.value) log.info("OpenStack metric action required.") - auth_token = Common.get_auth_token(values['vim_uuid']) + auth_token = Common.get_auth_token(vim_uuid) - endpoint = Common.get_endpoint("metric", values['vim_uuid']) + endpoint = Common.get_endpoint("metric", vim_uuid) if 'metric_name' in values and values['metric_name'] not in METRIC_MAPPINGS.keys(): raise ValueError('Metric ' + values['metric_name'] + ' is not supported.') if message.key == "create_metric_request": # Configure metric - metric_details = values['metric_create'] + metric_details = values['metric_create_request'] metric_id, resource_id, status = self.configure_metric( endpoint, auth_token, metric_details) @@ -100,7 +100,7 @@ class Metrics(object): try: resp_message = self._response.generate_response( 'create_metric_response', status=status, - cor_id=values['correlation_id'], + cor_id=metric_details['correlation_id'], metric_id=metric_id, r_id=resource_id) log.info("Response messages: %s", resp_message) self._producer.create_metrics_resp( @@ -156,7 +156,7 @@ class Metrics(object): # Log and send a response back to this effect log.warning("Gnocchi doesn't support metric configuration\ updates.") - req_details = values['metric_create'] + req_details = values['metric_create_request'] metric_name = req_details['metric_name'] resource_id = req_details['resource_uuid'] metric_id = self.get_metric_id( @@ -166,13 +166,13 @@ class Metrics(object): try: resp_message = self._response.generate_response( 'update_metric_response', status=False, - cor_id=values['correlation_id'], + cor_id=req_details['correlation_id'], r_id=resource_id, m_id=metric_id) log.info("Response message: %s", resp_message) self._producer.update_metric_response( 'update_metric_response', resp_message) except Exception as exc: - log.warning("Failed to send an update response:%s", exc) + log.exception("Failed to send an update response:") elif message.key == "list_metric_request": list_details = values['metrics_list_request'] @@ -223,7 +223,7 @@ class Metrics(object): 'unit': values['metric_unit']}} result = Common.perform_request( res_url, auth_token, req_type="post", - payload=json.dumps(payload)) + payload=json.dumps(payload, sort_keys=True)) # Get id of newly created metric for row in json.loads(result.text): if row['name'] == metric_name: @@ -243,7 +243,7 @@ class Metrics(object): resource_payload = json.dumps({'id': resource_id, 'metrics': { - metric_name: metric}}) + metric_name: metric}}, sort_keys=True) resource = Common.perform_request( url, auth_token, req_type="post", @@ -289,9 +289,12 @@ class Metrics(object): # Check for a specified list try: # Check if the metric_name was specified for the list - metric_name = values['metric_name'].lower() - if metric_name not in METRIC_MAPPINGS.keys(): - log.warning("This metric is not supported, won't be listed.") + if values['metric_name']: + metric_name = values['metric_name'].lower() + if metric_name not in METRIC_MAPPINGS.keys(): + log.warning("This metric is not supported, won't be listed.") + metric_name = None + else: metric_name = None except KeyError as exc: log.info("Metric name is not specified: %s", exc) @@ -304,47 +307,73 @@ class Metrics(object): resource = None try: - url = "{}/v1/metric?sort=name:asc".format(endpoint) - result = Common.perform_request( - url, auth_token, req_type="get") - metrics = [] - metrics_partial = json.loads(result.text) - for metric in metrics_partial: - metrics.append(metric) - - while len(json.loads(result.text)) > 0: - last_metric_id = metrics_partial[-1]['id'] - url = "{}/v1/metric?sort=name:asc&marker={}".format(endpoint, last_metric_id) + if resource: + url = "{}/v1/resource/generic/{}".format(endpoint, resource) result = Common.perform_request( url, auth_token, req_type="get") - if len(json.loads(result.text)) > 0: - metrics_partial = json.loads(result.text) - for metric in metrics_partial: - metrics.append(metric) - - if metrics is not None: - # Format the list response - if metric_name is not None and resource is not None: - metric_list = self.response_list( - metrics, metric_name=metric_name, resource=resource) - log.info("Returning an %s resource list for %s metrics", - metric_name, resource) - elif metric_name is not None: - metric_list = self.response_list( - metrics, metric_name=metric_name) - log.info("Returning a list of %s metrics", metric_name) - elif resource is not None: - metric_list = self.response_list( - metrics, resource=resource) - log.info("Return a list of %s resource metrics", resource) + resource_data = json.loads(result.text) + metrics = resource_data['metrics'] + + if metric_name: + if metrics.get(METRIC_MAPPINGS[metric_name]): + metric_id = metrics[METRIC_MAPPINGS[metric_name]] + url = "{}/v1/metric/{}".format(endpoint, metric_id) + result = Common.perform_request( + url, auth_token, req_type="get") + metric_list = json.loads(result.text) + log.info("Returning an %s resource list for %s metrics", + metric_name, resource) + return metric_list + else: + log.info("Metric {} not found for {} resource".format(metric_name, resource)) + return None else: - metric_list = self.response_list(metrics) - log.info("Returning a complete list of metrics") - - return metric_list + metric_list = [] + for k, v in metrics.items(): + url = "{}/v1/metric/{}".format(endpoint, v) + result = Common.perform_request( + url, auth_token, req_type="get") + metric = json.loads(result.text) + metric_list.append(metric) + if metric_list: + log.info("Return a list of %s resource metrics", resource) + return metric_list + + else: + log.info("There are no metrics available") + return [] else: - log.info("There are no metrics available") - return [] + url = "{}/v1/metric?sort=name:asc".format(endpoint) + result = Common.perform_request( + url, auth_token, req_type="get") + metrics = [] + metrics_partial = json.loads(result.text) + for metric in metrics_partial: + metrics.append(metric) + + while len(json.loads(result.text)) > 0: + last_metric_id = metrics_partial[-1]['id'] + url = "{}/v1/metric?sort=name:asc&marker={}".format(endpoint, last_metric_id) + result = Common.perform_request( + url, auth_token, req_type="get") + if len(json.loads(result.text)) > 0: + metrics_partial = json.loads(result.text) + for metric in metrics_partial: + metrics.append(metric) + + if metrics is not None: + # Format the list response + if metric_name is not None: + metric_list = self.response_list( + metrics, metric_name=metric_name) + log.info("Returning a list of %s metrics", metric_name) + else: + metric_list = self.response_list(metrics) + log.info("Returning a complete list of metrics") + return metric_list + else: + log.info("There are no metrics available") + return [] except Exception as exc: log.warning("Failed to generate any metric list. %s", exc) return None