start prometheus pushgateway
[osm/vim-emu.git] / src / emuvim / dcemulator / monitoring.py
index 7fa5e18..76f67ba 100755 (executable)
@@ -5,7 +5,7 @@ import logging
 from mininet.node import  OVSSwitch\r
 import ast\r
 import time\r
-from prometheus_client import start_http_server, Summary, Histogram, Gauge, Counter\r
+from prometheus_client import start_http_server, Summary, Histogram, Gauge, Counter, REGISTRY\r
 import threading\r
 from subprocess import Popen, PIPE\r
 import os\r
@@ -61,6 +61,7 @@ class DCNetworkMonitor():
         self.monitor_thread.start()\r
 \r
         # helper tools\r
+        self.pushgateway_process = self.start_PushGateway()\r
         self.prometheus_process = self.start_Prometheus()\r
         self.cadvisor_process = self.start_cadvisor()\r
 \r
@@ -121,21 +122,28 @@ class DCNetworkMonitor():
             network_metric['switch_dpid'] = int(str(next_node.dpid), 16)\r
             network_metric['metric_key'] = metric\r
 \r
-\r
             self.network_metrics.append(network_metric)\r
 \r
             logging.info('Started monitoring: {2} on {0}:{1}'.format(vnf_name, vnf_interface, metric))\r
             return 'Started monitoring: {2} on {0}:{1}'.format(vnf_name, vnf_interface, metric)\r
 \r
         except Exception as ex:\r
-            logging.exception("get_rate error.")\r
+            logging.exception("setup_metric error.")\r
             return ex.message\r
 \r
-    def remove_metric(self, vnf_name, vnf_interface, metric):\r
+    def stop_metric(self, vnf_name, vnf_interface, metric):\r
         for metric_dict in self.network_metrics:\r
             if metric_dict['vnf_name'] == vnf_name and metric_dict['vnf_interface'] == vnf_interface \\r
-                    and metric_dict['metric'] == metric:\r
+                    and metric_dict['metric_key'] == metric:\r
+\r
                 self.network_metrics.remove(metric_dict)\r
+\r
+                #this removes the complete metric, all labels...\r
+                #REGISTRY.unregister(self.prom_metrics[metric_dict['metric_key']])\r
+\r
+                # set values to NaN, prometheus api currently does not support removal of metrics\r
+                self.prom_metrics[metric_dict['metric_key']].labels(vnf_name, vnf_interface).set(float('nan'))\r
+\r
                 logging.info('Stopped monitoring: {2} on {0}:{1}'.format(vnf_name, vnf_interface, metric))\r
                 return 'Stopped monitoring: {2} on {0}:{1}'.format(vnf_name, vnf_interface, metric)\r
 \r
@@ -179,7 +187,7 @@ class DCNetworkMonitor():
                 #logging.info('set prom packets:{0} {1}:{2}'.format(this_measurement, vnf_name, vnf_interface))\r
 \r
                 # set prometheus metric\r
-                self.prom_metrics[metric_key].labels(vnf_name, vnf_interface).set(this_measurement)\r
+                self.prom_metrics[metric_dict['metric_key']].labels(vnf_name, vnf_interface).set(this_measurement)\r
 \r
                 if previous_monitor_time <= 0 or previous_monitor_time >= port_uptime:\r
                     metric_dict['previous_measurement'] = int(port_stat[metric_key])\r
@@ -221,6 +229,18 @@ class DCNetworkMonitor():
         logging.info('Start Prometheus container {0}'.format(cmd))\r
         return Popen(cmd)\r
 \r
+    def start_PushGateway(self, port=9091):\r
+        cmd = ["docker",\r
+               "run",\r
+               "-d",\r
+               "-p", "{0}:9091".format(port),\r
+               "--name", "pushgateway",\r
+               "prom/pushgateway"\r
+               ]\r
+\r
+        logging.info('Start Prometheus Push Gateway container {0}'.format(cmd))\r
+        return Popen(cmd)\r
+\r
     def start_cadvisor(self, port=8090):\r
         cmd = ["docker",\r
                "run",\r
@@ -247,6 +267,12 @@ class DCNetworkMonitor():
             self.prometheus_process.kill()\r
             self._stop_container('prometheus')\r
 \r
+        if self.pushgateway_process is not None:\r
+            logging.info('stopping pushgateway container')\r
+            self.pushgateway_process.terminate()\r
+            self.pushgateway_process.kill()\r
+            self._stop_container('pushgateway')\r
+\r
         if self.cadvisor_process is not None:\r
             logging.info('stopping cadvisor container')\r
             self.cadvisor_process.terminate()\r