def metric_raw(self, results, formula): #nmetric = results[1] metrics, _ = results # Build points dictionnary points = {} length = False for m in metrics: cid = m['meta']['data_id'] mid = 'metric_' + hashlib.md5(cid).hexdigest() mname = self.retreive_metric_name(cid) # Replace metric name in formula by the unique id formula = formula.replace(mname, mid) self.logger.debug("Metric {0} - {1}".format(mname, mid)) points[mid] = m['points'] # Make sure we treat the same amount of points by selecting # The metric with less points. if not length or len(m['points']) < length: length = len(m['points']) self.logger.debug('formula: {}'.format(formula)) #self.logger.debug('points: {}'.format(points)) mids = points.keys() finalSerie = [] # Now loop over all points to calculate the final serie for i in range(length): data = {} ts = 0 for j in range(len(mids)): mid = mids[j] # Get point value at timestamp "i" for metric "mid" data[mid] = points[mid][i][1] # Set timestamp ts = points[mid][i][0] # import data in math context math = Formulas(data) # Evaluate the mathematic formula pointval = math.evaluate(formula) # Add computed point in the serie finalSerie.append([ts * 1000, pointval]) # Remove variables values from math context math.reset() self.logger.debug('finalserie: {}'.format(finalSerie)) return finalSerie, points[mid]