X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Femuvim%2Fdcemulator%2Fmonitoring.py;h=3774df4a61fa2248041d0ef7615be757549b193a;hb=0af81d41e407a2ee55d83bf0371511e24b430d80;hp=28c3df6a8afb282bb2ed55122329450f4d95bd67;hpb=beba14d0e16f38e34e87934dbb2676b3b0c90019;p=osm%2Fvim-emu.git diff --git a/src/emuvim/dcemulator/monitoring.py b/src/emuvim/dcemulator/monitoring.py index 28c3df6..3774df4 100755 --- a/src/emuvim/dcemulator/monitoring.py +++ b/src/emuvim/dcemulator/monitoring.py @@ -34,9 +34,10 @@ import time from prometheus_client import start_http_server, Summary, Histogram, Gauge, Counter, REGISTRY, CollectorRegistry, \ pushadd_to_gateway, push_to_gateway, delete_from_gateway import threading -from subprocess import Popen +from subprocess import Popen, check_call import os import docker +import json logging.basicConfig(level=logging.INFO) @@ -89,6 +90,7 @@ class DCNetworkMonitor(): self.monitor_flow_lock = threading.Lock() self.network_metrics = [] self.flow_metrics = [] + self.skewmon_metrics = {} # start monitoring thread self.start_monitoring = True @@ -200,7 +202,7 @@ class DCNetworkMonitor(): network_metric = {} # check if port is specified (vnf:port) - if vnf_interface is None: + if vnf_interface is None or vnf_interface == '': # take first interface by default connected_sw = self.net.DCNetwork_graph.neighbors(vnf_name)[0] link_dict = self.net.DCNetwork_graph[vnf_name][connected_sw] @@ -402,8 +404,10 @@ class DCNetworkMonitor(): previous_measurement = metric_dict['previous_measurement'] previous_monitor_time = metric_dict['previous_monitor_time'] mon_port = metric_dict['mon_port'] - for port_stat in port_stat_dict[str(switch_dpid)]: + # ovs output also gives back 'LOCAL' port + if port_stat['port_no'] == 'LOCAL': + continue if int(port_stat['port_no']) == int(mon_port): port_uptime = port_stat['duration_sec'] + port_stat['duration_nsec'] * 10 ** (-9) this_measurement = int(port_stat[metric_key]) @@ -500,7 +504,10 @@ class DCNetworkMonitor(): "--publish={0}:8080".format(port), "--name=cadvisor", "--label",'com.containernet=""', - "google/cadvisor:latest" + "google/cadvisor:latest", + "--storage_duration=1m0s", + "--allow_dynamic_housekeeping=true", + #"--housekeeping_interval=1s", ] logging.info('Start cAdvisor container {0}'.format(cmd)) return Popen(cmd) @@ -533,7 +540,93 @@ class DCNetworkMonitor(): def _stop_container(self, name): - container = self.dockercli.containers.get(name) - container.remove(force=True) + #container = self.dockercli.containers.get(name) + #container.stop() + #container.remove(force=True) + + # the only robust way to stop these containers is via Popen, it seems + time.sleep(1) + cmd = ['docker', 'rm', '-f', name] + Popen(cmd) + + + def update_skewmon(self, vnf_name, resource_name, action): + + ret = '' + + config_file_path = '/tmp/skewmon.cfg' + configfile = open(config_file_path, 'a+') + try: + config = json.load(configfile) + except: + #not a valid json file or empty + config = {} + + #initialize config file + if len(self.skewmon_metrics) == 0: + config = {} + json.dump(config, configfile) + configfile.close() + + docker_name = 'mn.' + vnf_name + vnf_container = self.dockercli.containers.get(docker_name) + key = resource_name + '_' + vnf_container.short_id + vnf_id = vnf_container.id + + if action == 'start': + # add a new vnf to monitor + config[key] = dict(VNF_NAME=vnf_name, + VNF_ID=vnf_id, + VNF_METRIC=resource_name) + ret = 'adding to skewness monitor: {0} {1} '.format(vnf_name, resource_name) + logging.info(ret) + elif action == 'stop': + # remove vnf to monitor + config.pop(key) + ret = 'removing from skewness monitor: {0} {1} '.format(vnf_name, resource_name) + logging.info(ret) + + self.skewmon_metrics = config + configfile = open(config_file_path, 'w') + json.dump(config, configfile) + configfile.close() + + try: + skewmon_container = self.dockercli.containers.get('skewmon') + + # remove container if config is empty + if len(config) == 0: + ret += 'stopping skewness monitor' + logging.info('stopping skewness monitor') + skewmon_container.remove(force=True) + + except docker.errors.NotFound: + # start container if not running + ret += 'starting skewness monitor' + logging.info('starting skewness monitor') + volumes = {'/sys/fs/cgroup':{'bind':'/sys/fs/cgroup', 'mode':'ro'}, + '/tmp/skewmon.cfg':{'bind':'/config.txt', 'mode':'ro'}} + self.dockercli.containers.run('skewmon', + detach=True, + volumes=volumes, + labels=['com.containernet'], + name='skewmon' + ) + # Wait a while for containers to be completely started + started = False + wait_time = 0 + while not started: + list1 = self.dockercli.containers.list(filters={'status': 'running', 'name': 'prometheus'}) + if len(list1) >= 1: + time.sleep(1) + started = True + if wait_time > 5: + return 'skewmon not started' + time.sleep(1) + wait_time += 1 + return ret + + +