def exit_call(self, exit_info): frame = exit_info.current_frame if frame.f_code not in self._code_infos: return frame_info = self.stack[frame] top_iteration = frame_info.iteration loop_iterations = top_iteration.extract_iterations()['loops'] node_values = _deep_dict() def extract_values(iteration, path): for k, v in iteration.vals.items(): full_path = (k,) + path d = node_values for path_k in full_path[:-1]: d = d[path_k] d[full_path[-1]] = v for loop in iteration.loops.values(): for i, iteration in enumerate(loop): extract_values(iteration, path + (i,)) extract_values(top_iteration, ()) db_func = self._code_infos[frame.f_code].db_func exc = exit_info.exc_value if exc: traceback_str = ''.join(traceback.format_exception(type(exc), exc, exit_info.exc_tb)) exception = exception_string(exc) else: traceback_str = exception = None call = Call(id=frame_info.call_id, function=db_func, arguments=frame_info.arguments, return_value=cheap_repr(exit_info.return_value), exception=exception, traceback=traceback_str, data=json.dumps( dict( node_values=node_values, loop_iterations=loop_iterations, type_names=type_registry.names(), num_special_types=type_registry.num_special_types, ), separators=(',', ':') ), start_time=frame_info.start_time) session.add(call) session.commit()
def exit_call(self, exit_info): # type: (ExitCallInfo) -> None """ This is where all the data collected during the call is gathered up and sent to the database. """ frame = exit_info.current_frame # type: FrameType if frame.f_code not in self._code_infos or _tracing_recursively(frame): return frame_info = self.stack[frame] top_iteration = frame_info.iteration # type: Iteration node_values = _deep_dict() self._extract_node_values(top_iteration, (), node_values) db_func = self._code_infos[frame.f_code].db_func # type: Function exc = exit_info.exc_value # type: Optional[Exception] if exc: traceback_str = ''.join(traceback.format_exception(type(exc), exc, exit_info.exc_tb)) exception = exception_string(exc) else: traceback_str = exception = None call = Call(id=frame_info.call_id, function=db_func, arguments=frame_info.arguments, return_value=cheap_repr(exit_info.return_value), exception=exception, traceback=traceback_str, data=json.dumps( dict( node_values=node_values, loop_iterations=top_iteration.extract_iterations()['loops'], type_names=type_registry.names(), num_special_types=type_registry.num_special_types, ), cls=ProtocolEncoder, separators=(',', ':') ), start_time=frame_info.start_time) session.add(call) session.commit()