Merge remote-tracking branch 'upstream/master'
[osm/vim-emu.git] / src / emuvim / dcemulator / monitoring.py
index 2c07ab5..875913f 100755 (executable)
@@ -27,6 +27,7 @@ partner consortium (www.sonata-nfv.eu).
 """\r
 \r
 import logging\r
+import sys\r
 from mininet.node import  OVSSwitch\r
 import ast\r
 import time\r
@@ -43,23 +44,16 @@ logging.basicConfig(level=logging.INFO)
 class to read openflow stats from the Ryu controller of the DCNetwork\r
 """\r
 \r
+PUSHGATEWAY_PORT = 9091\r
+# we cannot use port 8080 because ryu-ofrest api  is already using that one\r
+CADVISOR_PORT = 8081\r
+\r
 class DCNetworkMonitor():\r
     def __init__(self, net):\r
         self.net = net\r
 \r
-        # TODO: these global variables should be part of a config file?\r
-        '''\r
-        # prometheus is started outside of son-emu\r
-        prometheus_ip = '127.0.0.1'\r
-        prometheus_port = '9090'\r
-        self.prometheus_REST_api = 'http://{0}:{1}'.format(prometheus_ip, prometheus_port)\r
-        '''\r
-        # helper variables to calculate the metrics\r
-        # pushgateway is started outside of son-emu and son-emu is started with net=host\r
-        # so localhost:9091 works\r
-        self.pushgateway = 'localhost:9091'\r
-        # when sdk is started with docker-compose, we could use\r
-        # self.pushgateway = 'pushgateway:9091'\r
+        # pushgateway address\r
+        self.pushgateway = 'localhost:{0}'.format(PUSHGATEWAY_PORT)\r
 \r
         # supported Prometheus metrics\r
         self.registry = CollectorRegistry()\r
@@ -102,7 +96,9 @@ class DCNetworkMonitor():
         self.monitor_flow_thread.start()\r
 \r
         # helper tools\r
-        # cAdvisor, Prometheus pushgateway and DB are started as external container, outside of son-emu\r
+        # cAdvisor, Prometheus pushgateway are started as external container, to gather monitoring metric in son-emu\r
+        self.pushgateway_process = self.start_PushGateway()\r
+        self.cadvisor_process = self.start_cAdvisor()\r
 \r
 \r
     # first set some parameters, before measurement can start\r
@@ -358,7 +354,13 @@ class DCNetworkMonitor():
 \r
                 # query Ryu\r
                 ret = self.net.ryu_REST('stats/flow', dpid=flow_dict['switch_dpid'], data=data)\r
-                flow_stat_dict = ast.literal_eval(ret)\r
+                if isinstance(ret, dict):\r
+                    flow_stat_dict = ret\r
+                elif isinstance(ret, basestring):\r
+                    flow_stat_dict = ast.literal_eval(ret.rstrip())\r
+                else:\r
+                    flow_stat_dict = None\r
+\r
                 logging.debug('received flow stat:{0} '.format(flow_stat_dict))\r
 \r
                 self.set_flow_metric(flow_dict, flow_stat_dict)\r
@@ -447,13 +449,6 @@ class DCNetworkMonitor():
         previous_monitor_time = metric_dict['previous_monitor_time']\r
         cookie = metric_dict['cookie']\r
 \r
-        # TODO aggregate all found flow stats\r
-        #flow_stat = flow_stat_dict[str(switch_dpid)][0]\r
-        #if 'bytes' in metric_key:\r
-        #    counter = flow_stat['byte_count']\r
-        #elif 'packet' in metric_key:\r
-        #    counter = flow_stat['packet_count']\r
-\r
         counter = 0\r
         for flow_stat in flow_stat_dict[str(switch_dpid)]:\r
             if 'bytes' in metric_key:\r
@@ -467,7 +462,10 @@ class DCNetworkMonitor():
         self.prom_metrics[metric_dict['metric_key']]. \\r
             labels({'vnf_name': vnf_name, 'vnf_interface': vnf_interface, 'flow_id': cookie}). \\r
             set(counter)\r
-        pushadd_to_gateway(self.pushgateway, job='sonemu-SDNcontroller', registry=self.registry)\r
+        try:\r
+            pushadd_to_gateway(self.pushgateway, job='sonemu-SDNcontroller', registry=self.registry)\r
+        except Exception, e:\r
+            logging.warning("Pushgateway not reachable: {0} {1}".format(Exception, e))\r
 \r
 \r
     def start_Prometheus(self, port=9090):\r
@@ -484,7 +482,7 @@ class DCNetworkMonitor():
         logging.info('Start Prometheus container {0}'.format(cmd))\r
         return Popen(cmd)\r
 \r
-    def start_PushGateway(self, port=9091):\r
+    def start_PushGateway(self, port=PUSHGATEWAY_PORT):\r
         cmd = ["docker",\r
                "run",\r
                "-d",\r
@@ -496,7 +494,7 @@ class DCNetworkMonitor():
         logging.info('Start Prometheus Push Gateway container {0}'.format(cmd))\r
         return Popen(cmd)\r
 \r
-    def start_cadvisor(self, port=8090):\r
+    def start_cAdvisor(self, port=CADVISOR_PORT):\r
         cmd = ["docker",\r
                "run",\r
                "--rm",\r
@@ -524,7 +522,7 @@ class DCNetworkMonitor():
             self.prometheus_process.terminate()\r
             self.prometheus_process.kill()\r
             self._stop_container('prometheus')\r
-\r
+        '''\r
         if self.pushgateway_process is not None:\r
             logging.info('stopping pushgateway container')\r
             self.pushgateway_process.terminate()\r
@@ -536,7 +534,6 @@ class DCNetworkMonitor():
             self.cadvisor_process.terminate()\r
             self.cadvisor_process.kill()\r
             self._stop_container('cadvisor')\r
-        '''\r
 \r
     def switch_tx_rx(self,metric=''):\r
         # when monitoring vnfs, the tx of the datacenter switch is actually the rx of the vnf\r