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
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
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
#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
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
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