def collectVMmetrics(self):

    domains = domainsVM()

    try:
      while not self._stopevent.isSet():
      #while True:
      #for i in range(1,6):
        #print "...getting Domains..."

        dom_list = domains.getDomains()
        #print "Number of VMs:", len(dom_list)

        for key in dom_list:
          if dom_list[key].firstTime:
            vm_name = dom_list[key].name

            if self.get_vm_metrics is True:
              # for each NEW VM start a thread for collecting and sending VM metrics
              logger.info("New VM detected: starting thread for %s", vm_name)
          
              thread_VMmetric = Thread(target = self.readVMmetrics, args=(vm_name, ))
              thread_VMmetric.daemon = True
              thread_VMmetric.start()

            if self.get_vm_counters or self.get_vm_raw_counters:
              # get pid of vm

              path = vm_pid_path_prefix + vm_name + '.pid'
              with open(path, 'r') as f:
                vm_pid = f.read()

            if self.get_vm_counters is True and self.counters_list:
              # for each NEW VM start a thread for collecting and sending counters metrics
              logger.info("New VM detected: starting collecting VM Counters - thread for %s", vm_name)
              counters_metric = CountersMetrics(self.counters_directory, self.counters_interval, self.counters_list, self.mconf, self.gconf, vm_pid, vm_name)
              thread_VMCountersMetric = Thread(target = counters_metric.collectCountersMetrics)
              thread_VMCountersMetric.daemon = True
              thread_VMCountersMetric.start()

              #send metrics

            if self.get_vm_raw_counters is True and  self.raw_counters_list:
              # for each NEW VM start a thread for collecting and sending counters metrics
              logger.info("New VM detected: starting collecting VM Raw Counters - thread for %s", vm_name)

              raw_counters_metric = RawCountersMetrics(self.counters_directory, self.counters_interval, self.raw_counters_list, self.mconf, self.gconf, vm_pid, vm_name)
              thread_VMRawCountersMetric = Thread(target = raw_counters_metric.collectCountersMetrics)
              thread_VMRawCountersMetric.daemon = True
              thread_VMRawCountersMetric.start()

        sleep(check_vm_interval)


      logger.info("All VM threads terminated")

    except (KeyboardInterrupt, SystemExit):
      self.stopThreads()
      self.exit = True
      sys.exit(0)
  def readVMmetrics(self, vm_name): 
    gmetric_obj = gmetric.Gmetric(self.gconf.host, self.gconf.port, self.gconf.protocol)

    list_metrics = {}
    exec_time = 0

    while not self._stopevent.isSet():
      #check if vm is still alive
      domains = domainsVM()
      dom_list = domains.getDomains()
      if vm_name not in dom_list:
        logger.info("%s has been destroyed", vm_name)
        break

      try:

        start_time = time.time()
        g = guestfs.GuestFS ()
        # Attach the disk image read-only to libguestfs. 
        g.add_domain(vm_name, readonly=1)
        # Run the libguestfs back-end.
        
        g.launch()
        
        # Ask libguestfs to inspect for operating systems.
        roots = g.inspect_os ()
        if len (roots) == 0:
          logger.error("no operating systems found")
          break

        if len (roots) > 1:
          logger.error("dual/multi-boot images are not supported")
          break

        root = roots[0]
        # Mount up the disks, like guestfish -i.
        mps = g.inspect_get_mountpoints (root)
        for device in mps:
          try:
            g.mount(device[1], device[0])
          except RuntimeError as msg:
            logger.error("%s (ignored)",msg)

        try:    
          lines = g.read_lines(self.vm_file_path)
              
          for l in lines:
            if len(l.strip()) > 0:
              token = l.split('|')

              n = token[0].strip()
              v = token[1].strip()
                
              list_metrics[n] = v
                  
          #send metrics
          self.sendVMmetrics(list_metrics, gmetric_obj, vm_name)
        except RuntimeError, io:
          logger.warning("%s %s %s", threading.currentThread().name, vm_name, io)

        g.umount_all()
        g.close()
        exec_time = time.time() - start_time

      except (KeyboardInterrupt, SystemExit):
        self.stopThreads()
        sys.exit(0)