def get_actor_tree(self, workers_info_by_node, infeasible_tasks, ready_tasks): now = time.time() # construct flattened actor tree flattened_tree = {"root": {"children": {}}} child_to_parent = {} with self._node_stats_lock: for addr, actor_id in self._addr_to_actor_id.items(): flattened_tree[actor_id] = copy.deepcopy(self._default_info) flattened_tree[actor_id].update( self._addr_to_extra_info_dict[addr]) parent_id = self._addr_to_actor_id.get( self._addr_to_owner_addr[addr], "root") child_to_parent[actor_id] = parent_id for node_id, workers_info in workers_info_by_node.items(): for worker_info in workers_info: if "coreWorkerStats" in worker_info: core_worker_stats = worker_info["coreWorkerStats"] addr = (core_worker_stats["ipAddress"], str(core_worker_stats["port"])) if addr in self._addr_to_actor_id: actor_info = flattened_tree[ self._addr_to_actor_id[addr]] format_reply_id(core_worker_stats) actor_info.update(core_worker_stats) actor_info["averageTaskExecutionSpeed"] = round( actor_info["numExecutedTasks"] / (now - actor_info["timestamp"] / 1000), 2) actor_info["nodeId"] = node_id actor_info["pid"] = worker_info["pid"] def _update_flatten_tree(task, task_spec_type, invalid_state_type): actor_id = ray.utils.binary_to_hex( b64decode(task[task_spec_type]["actorId"])) caller_addr = (task["callerAddress"]["ipAddress"], str(task["callerAddress"]["port"])) caller_id = self._addr_to_actor_id.get(caller_addr, "root") child_to_parent[actor_id] = caller_id task["state"] = -1 task["invalidStateType"] = invalid_state_type task["actorTitle"] = task["functionDescriptor"][ "pythonFunctionDescriptor"]["className"] format_reply_id(task) flattened_tree[actor_id] = task for infeasible_task in infeasible_tasks: _update_flatten_tree(infeasible_task, "actorCreationTaskSpec", "infeasibleActor") for ready_task in ready_tasks: _update_flatten_tree(ready_task, "actorCreationTaskSpec", "pendingActor") # construct actor tree actor_tree = flattened_tree for actor_id, parent_id in child_to_parent.items(): actor_tree[parent_id]["children"][actor_id] = actor_tree[actor_id] return actor_tree["root"]["children"]
def _update_from_actor_tasks(task, task_spec_type, invalid_state_type): actor_id = ray.utils.binary_to_hex( b64decode(task[task_spec_type]["actorId"])) task["state"] = -1 task["invalidStateType"] = invalid_state_type task["actorTitle"] = task["functionDescriptor"][ "pythonFunctionDescriptor"]["className"] format_reply_id(task) actors[actor_id] = task
def _update_flatten_tree(task, task_spec_type, invalid_state_type): actor_id = ray.utils.binary_to_hex( b64decode(task[task_spec_type]["actorId"])) caller_addr = (task["callerAddress"]["ipAddress"], str(task["callerAddress"]["port"])) caller_id = self._addr_to_actor_id.get(caller_addr, "root") child_to_parent[actor_id] = caller_id task["state"] = -1 task["invalidStateType"] = invalid_state_type task["actorTitle"] = task["functionDescriptor"][ "pythonFunctionDescriptor"]["className"] format_reply_id(task) flattened_tree[actor_id] = task
def _update_from_actor_tasks(task, task_spec_type, invalid_state_type): actor_id = ray.utils.binary_to_hex( b64decode(task[task_spec_type]["actorId"])) if invalid_state_type == "pendingActor": task["state"] = -1 elif invalid_state_type == "infeasibleActor": task["state"] = -2 else: raise ValueError(f"Invalid argument" "invalid_state_type={invalid_state_type}") task["actorTitle"] = task["functionDescriptor"][ "pythonFunctionDescriptor"]["className"] format_reply_id(task) actors[actor_id] = task
def get_actors(self, workers_info_by_node, infeasible_tasks, ready_tasks): now = time.time() actors: Dict[str, Dict[str, any]] = {} # construct flattened actor tree with self._node_stats_lock: for addr, actor_id in self._addr_to_actor_id.items(): actors[actor_id] = copy.deepcopy(self._default_info) actors[actor_id].update(self._addr_to_extra_info_dict[addr]) for node_id, workers_info in workers_info_by_node.items(): for worker_info in workers_info: if "coreWorkerStats" in worker_info: core_worker_stats = worker_info["coreWorkerStats"] addr = (core_worker_stats["ipAddress"], str(core_worker_stats["port"])) if addr in self._addr_to_actor_id: actor_info = actors[self._addr_to_actor_id[addr]] format_reply_id(core_worker_stats) actor_info.update(core_worker_stats) actor_info["averageTaskExecutionSpeed"] = round( actor_info["numExecutedTasks"] / (now - actor_info["timestamp"] / 1000), 2) actor_info["nodeId"] = node_id actor_info["pid"] = worker_info["pid"] def _update_from_actor_tasks(task, task_spec_type, invalid_state_type): actor_id = ray.utils.binary_to_hex( b64decode(task[task_spec_type]["actorId"])) task["state"] = -1 task["invalidStateType"] = invalid_state_type task["actorTitle"] = task["functionDescriptor"][ "pythonFunctionDescriptor"]["className"] format_reply_id(task) actors[actor_id] = task for infeasible_task in infeasible_tasks: _update_from_actor_tasks(infeasible_task, "actorCreationTaskSpec", "infeasibleActor") for ready_task in ready_tasks: _update_from_actor_tasks(ready_task, "actorCreationTaskSpec", "pendingActor") return actors
def get_actors(self, workers_info_by_node, infeasible_tasks, ready_tasks): now = time.time() actors: Dict[str, Dict[str, any]] = {} # construct flattened actor tree with self._node_stats_lock: for addr, actor_id in self._addr_to_actor_id.items(): actors[actor_id] = copy.deepcopy(self._default_info) actors[actor_id].update(self._addr_to_extra_info_dict[addr]) for node_id, workers_info in workers_info_by_node.items(): for core_worker_stats in workers_info: addr = (core_worker_stats["ipAddress"], str(core_worker_stats["port"])) if addr in self._addr_to_actor_id: actor_info = actors[self._addr_to_actor_id[addr]] format_reply_id(core_worker_stats) actor_info.update(core_worker_stats) actor_info["averageTaskExecutionSpeed"] = round( actor_info["numExecutedTasks"] / (now - actor_info["timestamp"] / 1000), 2) actor_info["nodeId"] = node_id actor_info["pid"] = core_worker_stats["pid"] def _update_from_actor_tasks(task, task_spec_type, invalid_state_type): actor_id = ray.utils.binary_to_hex( b64decode(task[task_spec_type]["actorId"])) if invalid_state_type == "pendingActor": task["state"] = -1 elif invalid_state_type == "infeasibleActor": task["state"] = -2 else: raise ValueError( "Invalid argument" f"invalid_state_type={invalid_state_type}") task["actorTitle"] = task["functionDescriptor"][ "pythonFunctionDescriptor"]["className"] format_reply_id(task) actors[actor_id] = task for infeasible_task in infeasible_tasks: _update_from_actor_tasks(infeasible_task, "actorCreationTaskSpec", "infeasibleActor") for ready_task in ready_tasks: _update_from_actor_tasks(ready_task, "actorCreationTaskSpec", "pendingActor") actor_groups = _group_actors_by_python_class(actors) stats_by_group = { name: _get_actor_group_stats(group) for name, group in actor_groups.items() } response_data = {} for name, group in actor_groups.items(): response_data[name] = { "entries": group, "summary": stats_by_group[name] } return response_data