Include documentation and updates for MON manual installation.
[osm/MON.git] / plugins / OpenStack / Gnocchi / metrics.py
index 2004c38..a1d58fd 100644 (file)
@@ -23,7 +23,9 @@
 
 import datetime
 import json
-import logging as log
+import logging
+log = logging.getLogger(__name__)
+
 import time
 
 from core.message_bus.producer import KafkaProducer
@@ -100,6 +102,7 @@ class Metrics(object):
                             'create_metric_response', status=status,
                             cor_id=values['correlation_id'],
                             metric_id=metric_id, r_id=resource_id)
+                        log.info("Response messages: %s", resp_message)
                         self._producer.create_metrics_resp(
                             'create_metric_response', resp_message,
                             'metric_response')
@@ -120,6 +123,7 @@ class Metrics(object):
                             r_id=values['resource_uuid'],
                             cor_id=values['correlation_id'],
                             times=timestamps, metrics=metric_data)
+                        log.info("Response message: %s", resp_message)
                         self._producer.read_metric_data_response(
                             'read_metric_data_response', resp_message,
                             'metric_response')
@@ -139,6 +143,7 @@ class Metrics(object):
                             m_name=values['metric_name'],
                             status=status, r_id=values['resource_uuid'],
                             cor_id=values['correlation_id'])
+                        log.info("Response message: %s", resp_message)
                         self._producer.delete_metric_response(
                             'delete_metric_response', resp_message,
                             'metric_response')
@@ -162,6 +167,7 @@ class Metrics(object):
                             'update_metric_response', status=False,
                             cor_id=values['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,
                             'metric_response')
@@ -179,6 +185,7 @@ class Metrics(object):
                         resp_message = self._response.generate_response(
                             'list_metric_response', m_list=metric_list,
                             cor_id=list_details['correlation_id'])
+                        log.info("Response message: %s", resp_message)
                         self._producer.list_metric_response(
                             'list_metric_response', resp_message,
                             'metric_response')
@@ -283,43 +290,53 @@ class Metrics(object):
         """List all metrics."""
         url = "{}/v1/metric/".format(endpoint)
 
+        # Check for a specified list
         try:
             # Check if the metric_name was specified for the list
-            metric_name = values['metric_name']
-            result = self._common._perform_request(
-                url, auth_token, req_type="get")
-            metric_list = json.loads(result.text)
+            metric_name = values['metric_name'].lower()
+            if metric_name not in METRIC_MAPPINGS.keys():
+                log.warn("This metric is not supported, won't be listed.")
+                metric_name = None
+        except KeyError as exc:
+            log.info("Metric name is not specified: %s", exc)
+            metric_name = None
 
-            # Format the list response
-            metrics = self.response_list(
-                metric_list, metric_name=metric_name)
-            return metrics
-        except KeyError:
-            log.debug("Metric name is not specified for this list.")
+        try:
+            resource = values['resource_uuid']
+        except KeyError as exc:
+            log.info("Resource is not specified:%s", exc)
+            resource = None
 
         try:
-            # Check if a resource_id was specified
-            resource_id = values['resource_uuid']
             result = self._common._perform_request(
                 url, auth_token, req_type="get")
-            metric_list = json.loads(result.text)
-            # Format the list response
-            metrics = self.response_list(
-                metric_list, resource=resource_id)
-            return metrics
-        except KeyError:
-            log.debug("Resource id not specificed either, will return a\
-                       complete list.")
-            try:
-                result = self._common._perform_request(
-                    url, auth_token, req_type="get")
-                metric_list = json.loads(result.text)
+            metrics = json.loads(result.text)
+
+            if metrics is not None:
                 # Format the list response
-                metrics = self.response_list(metric_list)
-                return metrics
+                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)
+                else:
+                    metric_list = self.response_list(metrics)
+                    log.info("Returning a complete list of metrics")
 
-            except Exception as exc:
-                log.warn("Failed to generate any metric list. %s", exc)
+                return metric_list
+            else:
+                log.info("There are no metrics available")
+                return []
+        except Exception as exc:
+            log.warn("Failed to generate any metric list. %s", exc)
         return None
 
     def get_metric_id(self, endpoint, auth_token, metric_name, resource_id):
@@ -362,7 +379,7 @@ class Metrics(object):
                 diff = PERIOD_MS[collection_unit]
             else:
                 diff = collection_period * PERIOD_MS[collection_unit]
-            s_time = (end_time - diff)/1000.0
+            s_time = (end_time - diff) / 1000.0
             start_time = datetime.datetime.fromtimestamp(s_time).strftime(
                 '%Y-%m-%dT%H:%M:%S.%f')
             base_url = "{}/v1/metric/%(0)s/measures?start=%(1)s&stop=%(2)s"
@@ -398,27 +415,40 @@ class Metrics(object):
 
     def response_list(self, metric_list, metric_name=None, resource=None):
         """Create the appropriate lists for a list response."""
-        resp_list = []
+        resp_list, name_list, res_list = [], [], []
 
+        # Create required lists
         for row in metric_list:
+            # Only list OSM metrics
+            if row['name'] in METRIC_MAPPINGS.keys():
+                metric = {"metric_name": row['name'],
+                          "metric_uuid": row['id'],
+                          "metric_unit": row['unit'],
+                          "resource_uuid": row['resource_id']}
+                resp_list.append(str(metric))
+            # Generate metric_name specific list
             if metric_name is not None:
                 if row['name'] == metric_name:
                     metric = {"metric_name": row['name'],
                               "metric_uuid": row['id'],
                               "metric_unit": row['unit'],
                               "resource_uuid": row['resource_id']}
-                    resp_list.append(metric)
-            elif resource is not None:
+                    name_list.append(str(metric))
+            # Generate resource specific list
+            if resource is not None:
                 if row['resource_id'] == resource:
                     metric = {"metric_name": row['name'],
                               "metric_uuid": row['id'],
                               "metric_unit": row['unit'],
                               "resource_uuid": row['resource_id']}
-                    resp_list.append(metric)
-            else:
-                metric = {"metric_name": row['name'],
-                          "metric_uuid": row['id'],
-                          "metric_unit": row['unit'],
-                          "resource_uuid": row['resource_id']}
-                resp_list.append(metric)
-        return resp_list
+                    res_list.append(str(metric))
+
+        # Join required lists
+        if metric_name is not None and resource is not None:
+            return list(set(res_list).intersection(name_list))
+        elif metric_name is not None:
+            return name_list
+        elif resource is not None:
+            return list(set(res_list).intersection(resp_list))
+        else:
+            return resp_list