def __init__(self, energy_interval, energy_metrics_list, wattsup_path, wattsup_device, connected_node, mconf, gconf): self.energy_interval = energy_interval self.energy_metrics_list = energy_metrics_list.split(",") self.wattsup_path = wattsup_path self.wattsup_device = wattsup_device self.connected_node = connected_node self.mconf = mconf self.gconf = gconf self._stopevent = threading.Event() self.wattsup = WUProcessWrapper(logger, wattsup_path, wattsup_device, energy_metrics_list) self.threadWattsUp = threading.Thread(target = self.wattsup.continuousCollector) self.threadWattsUp.start()
class WattsupPowerMetrics: def __init__(self, energy_interval, energy_metrics_list, wattsup_path, wattsup_device, connected_node, mconf, gconf): self.energy_interval = energy_interval self.energy_metrics_list = energy_metrics_list.split(",") self.wattsup_path = wattsup_path self.wattsup_device = wattsup_device self.connected_node = connected_node self.mconf = mconf self.gconf = gconf self._stopevent = threading.Event() self.wattsup = WUProcessWrapper(logger, wattsup_path, wattsup_device, energy_metrics_list) self.threadWattsUp = threading.Thread(target = self.wattsup.continuousCollector) self.threadWattsUp.start() def stopThreads(self): logger.info("Stopping Wattsup module...") self._stopevent.set() self.threadWattsUp.stopThreads() def collectPowerMetrics(self): gmetric_obj = gmetric.Gmetric(self.gconf.host, self.gconf.port, self.gconf.protocol) while not self._stopevent.isSet(): list_metrics = {} captured_energy = self.wattsup.getCurrentReading() # Obtain a copy of the string, thread safe # parse metrics regex = re.compile("^[0-9.,]+") if re.match(regex, captured_energy.strip()): a = captured_energy.strip().split(", ") for i in range(len(self.energy_metrics_list)): list_metrics[self.energy_metrics_list[i]] = a[i] # send metrics self.sendPowerMetrics(list_metrics, gmetric_obj) # sleep until next capture sleep(int(self.energy_interval)) # def collectPowerMetrics(self): # gmetric_obj = gmetric.Gmetric(self.gconf.host, self.gconf.port, self.gconf.protocol) # while not self._stopevent.isSet(): # list_metrics = {} # #./wattsup -c 1 ttyUSB0 watts # cmd = self.wattsup_path + " -c " + self.energy_interval + " " + self.wattsup_device + " " + " ".join(str(x) for x in self.energy_metrics_list) # output = "" # try: # output = subprocess.check_output(cmd.split()) # except Exception, e: # logger.error("%s",e) # sleep(int(self.energy_interval)) # continue # # parse metrics # regex = re.compile("^[0-9.,]+") # if int(self.energy_interval) > 1: # list_metrics_tmp = self.empty_metrics_dictionary() # lines = output.split("\n") # for line in lines: # if re.match(regex, line.strip()): # a = line.strip().split(", ") # for i in range(len(self.energy_metrics_list)): # list_metrics_tmp[self.energy_metrics_list[i]].append(float(a[i])) # list_metrics = self.compact_metrics(list_metrics_tmp) # elif int(self.energy_interval) == 1: # if re.match(regex, output.strip()): # a = output.strip().split(", ") # for i in range(len(self.energy_metrics_list)): # list_metrics[self.energy_metrics_list[i]] = a[i] # # send metrics # self.sendPowerMetrics(list_metrics, gmetric_obj) # def compact_metrics(self, metrics_map_lists): # compacted_metrics = {} # for metric, values in metrics_map_lists.items(): # compactedValue = 0.0 # if metric != "kwh": # for value in values: # compactedValue += value # compactedValue /= len(values) # else: # compactedValue = max(values) # compacted_metrics[metric] = compactedValue # return compacted_metrics def empty_metrics_dictionary(self): list_metrics_tmp = {} for metric in self.energy_metrics_list: list_metrics_tmp[metric] = [] return list_metrics_tmp def sendPowerMetrics(self, list_metrics, gmetric_obj): #send metric logger.info("%s: sending host energy metrics", threading.currentThread().name) for wattsupkey,value in list_metrics.items(): key = wattsupMetricEquivalent[wattsupkey] if key in self.mconf: gmetric_obj.send(key, value, self.mconf[key]["type"], self.mconf[key]["units"], self.gconf.slope, self.mconf[key]["tmax"], self.mconf[key]["dmax"], self.mconf[key]["group"], self.connected_node)