def _process_main_duration(result, data): histogram_data = [r["duration"] for r in result["result"] if not r["error"]] histograms = [] if histogram_data: hvariety = histo.hvariety(histogram_data) for i in range(len(hvariety)): histograms.append(histo.Histogram(histogram_data, hvariety[i]["number_of_bins"], hvariety[i]["method"])) stacked_area = [] for key in "duration", "idle_duration": stacked_area.append({ "key": key, "values": [(i, round(d, 2)) for i, d in data["total_durations"][key]], }) return { "pie": [ {"key": "success", "value": len(histogram_data)}, {"key": "errors", "value": len(data["errors"])}, ], "iter": stacked_area, "histogram": [ { "key": "task", "method": histogram.method, "values": [{"x": round(x, 2), "y": float(y)} for x, y in zip(histogram.x_axis, histogram.y_axis)] } for histogram in histograms ], }
def _process_atomic(result, data): def avg(lst, key=None): lst = lst if not key else map(lambda x: x[key], lst) return utils.mean(lst) # NOTE(boris-42): In our result["result"] we have next structure: # {"error": NoneOrDict, # "atomic_actions": { # "action1": <duration>, # "action2": <duration> # } # } # Our goal is to get next structure: # [{"key": $atomic_actions.action, # "values": [[order, $atomic_actions.duration # if not $error else 0], ...}] # # Order of actions in "atomic_action" is similar for # all iteration. So we should take first non "error" # iteration. And get in atomitc_iter list: # [{"key": "action", "values":[]}] stacked_area = [] for row in result["result"]: if not row["error"] and "atomic_actions" in row: stacked_area = [{"key": a, "values": []} for a in row["atomic_actions"]] break # NOTE(boris-42): pie is similar to stacked_area, only difference is in # structure of values. In case of $error we shouldn't put # anything in pie. In case of non error we should put just # $atomic_actions.duration (without order) pie = [] histogram_data = [] if stacked_area: pie = copy.deepcopy(stacked_area) histogram_data = copy.deepcopy(stacked_area) for i, res in enumerate(result["result"]): # in case of error put (order, 0.0) to all actions of stacked area if res["error"]: for k in range(len(stacked_area)): stacked_area[k]["values"].append([i + 1, 0.0]) continue # in case of non error put real durations to pie and stacked area for j, action in enumerate(res["atomic_actions"].keys()): # in case any single atomic action failed, put 0 action_duration = res["atomic_actions"][action] or 0.0 pie[j]["values"].append(action_duration) histogram_data[j]["values"].append(action_duration) # filter out empty action lists in pie / histogram to avoid errors pie = filter(lambda x: x["values"], pie) histogram_data = [x for x in histogram_data if x["values"]] histograms = [[] for atomic_action in range(len(histogram_data))] for i, atomic_action in enumerate(histogram_data): hvariety = histo.hvariety(atomic_action["values"]) for v in range(len(hvariety)): histograms[i].append(histo.Histogram(atomic_action["values"], hvariety[v]["number_of_bins"], hvariety[v]["method"], atomic_action["key"])) stacked_area = [] for name, durations in six.iteritems(data["atomic_durations"]): stacked_area.append({ "key": name, "values": [(i, round(d, 2)) for i, d in durations], }) return { "histogram": [[ { "key": action.key, "disabled": i, "method": action.method, "values": [{"x": round(x, 2), "y": y} for x, y in zip(action.x_axis, action.y_axis)] } for action in atomic_action_list] for i, atomic_action_list in enumerate(histograms) ], "iter": stacked_area, "pie": [{"key": x["key"], "value": avg(x["values"])} for x in pie] }